メニュー
AWS Lambda
開発者ガイド

以前の Node.js ランタイム v0.10.42 を使用する

2017 年 5 月時点で、AWS Lambda は Node.js 6.10 および Node.js 4.3 をサポートしています。Lambda 関数の作成時にこのランタイムを指定する方法については、「CreateFunction」の --runtime パラメーターを参照してください。

Node v0.10.42 は現在廃止の対象となっています。できるだけ早く、既存の関数を AWS Lambda で使用できる新しい Node.js ランタイムバージョン (nodejs4.3 または nodejs6.10) に移行する必要があります。Lambda コンソールにアクセスし、手順に従うことで、2017 年 6 月 30 日までの 1 回限りの延長をリクエストできます。移行するか、延長を取得しない場合、Node v0.10.42 ランタイムで作成された関数を呼び出すと、無効なパラメーター値のエラーが発生します。Node v0.10.42 ランタイムで作成された関数を含むリージョンごとに、この手順に従う必要があります。以下のセクションでは、AWS Lambda のランタイムサポートポリシーについて説明します。あわせて、runtime v0.10.42 固有の動作および既存の関数を新しいバージョンに移行する方法についても説明します。

ランタイムサポートポリシー

AWS Lambda では、Node LTS 作業グループページで示されるように、メンテナンスウィンドウの最後に EOL (End of Life) とマークされているランタイムのみが廃止されます。EOL マークがついたバージョン (Node 0.10 など) は、まず新規関数作成のサポートが停止されます。既存の関数は、お客様が新しいバージョンに移行するのに十分な期間は引き続き動作します。必要に応じて、個別のお客様にご連絡することもあります。AWS Lambda は数か月以内に LTS とマークされた Node の LTS (長期サポート) バージョンのサポートを追加します。

Lambda 関数コードの新しいランタイムへの移行

Node v0.10.42 は現在廃止の対象となっています。できるだけ早く、既存の関数を AWS Lambda で使用できる新しい Node.js ランタイムバージョン (nodejs4.3 または nodejs6.10) に移行する必要があります。Lambda コンソールにアクセスし、手順に従うことで、2017 年 6 月 30 日までの 1 回限りの延長をリクエストできます。移行するか、延長を取得しない場合、Node v0.10.42 ランタイムで作成された関数を呼び出すと、無効なパラメーターのエラーが発生します。Node v0.10.42 ランタイムで作成された関数を含むリージョンごとに、この手順に従う必要があります。

以下のセクションでは、既存の Lambda 関数のコードを新しいランタイムに移行する方法について説明します。

  1. すべての既存の Lambda 関数を確認して移行計画立てます。関数のリストとそのバージョンおよびエイリアスは次の方法で取得できます。

    設計図を使用して Lambda 関数を一覧表示する方法については、「ランタイム更新設計図を使用した Lambda 関数の一覧表示と新しいランタイムへの更新」を参照してください。

    コンソールを使用して Lambda 関数をリストするには:

    1. AWS マネジメントコンソール にサインインして、Lambda コンソールを開きます。

    2. [Runtime] 列を選択します。これにより、そのリージョンのすべての Lambda 関数がランタイム値でソートされます。

    3. 各 Lambda 関数を Node.js のランタイム値を使用して開き、[Configuration] タブを選択します。

    4. [Qualifiers] ドロップダウンリストを選択します。

    5. 各バージョンを選択し、ランタイムを表示します。

    6. 各エイリアスを選択し、それが示すバージョンを表示します。

    7. 必要に応じて、各リージョンで上記のステップを繰り返します。

  2. 各関数で以下を行います。

    1. 最初に手動で、または UPDATE モードで nodejs-upgrade-functions 設計図を実行してランタイムを更新します (詳細については、「ランタイム更新設計図を使用した Lambda 関数の一覧表示と新しいランタイムへの更新」を参照してください)。コンテキストメソッドをすべて更新しコールバックアプローチに置き換えることを強く推奨します。詳細については、「Node.js ランタイム v0.10.42 のコンテキストメソッド」を参照してください。

    2. テストを実行して、Lambda 関数の動作が内部検証に合格することを検証します。失敗する場合は、新しいランタイムで動作するように Lambda コードを更新する必要がある場合があります。

    3. 関数が正常に呼び出されると、移行は完了です。

  3. 既存の関数のバージョンおよびエイリアスを確認します。各関数のバージョンのリストを取得するには、「Lambda コンソールを使用した Lambda 関数の一覧表示と新しいランタイムへの更新」または「ランタイム更新設計図を使用した Lambda 関数の一覧表示と新しいランタイムへの更新」を使用します。このようなバージョンごとに以下を行います。

    1. $LATEST にコードをコピーします。

    2. 上記のステップ 2 からプロセスを繰り返します。

    3. 新しいバージョンとして完了したら、コードを再発行します。

    4. 現在古いバージョンを指すエイリアスがあれば、新しく発行されたバージョンに更新します。

    5. 古いバージョンを削除します。

CLI を使用した Lambda 関数の一覧表示とランタイムの更新

ListFunctions コマンドを使用して、すべての Lambda 関数のリストを取得し、そこから v0.10 ランタイムで作成されたものをリストできます。次のコード例はそれを行う方法を示しています。

Copy
#!/bin/bash for REGION in $(aws ec2 describe-regions --output text --query 'Regions[].[RegionName]' | egrep -v 'ca-central-1|sa-east-1' | sort); do echo "...checking $REGION" echo " nodejs0.10 functions: " for i in $(aws lambda list-functions --output json --query 'Functions[*].[FunctionName, Runtime]' --region $REGION | grep -v nodejs4.3 | grep -v nodejs6.10 | grep -B1 nodejs | grep , | sort); do echo " -> $i" done done echo "This script only accounts for the \$LATEST versions of functions. You may need to take a closer look if you are using versioning."

返された各 Lambda 関数 (v0.10 ランタイムを使用して作成されたもの) で、UpdateFunctionConfiguration コマンドを使用し、--runtime 値を nodejs4.3 または nodejs6.10 に設定します。

Lambda コンソールを使用した Lambda 関数の一覧表示と新しいランタイムへの更新

  • AWS マネジメントコンソール にサインインして、Lambda コンソールを開きます。

  • [Runtime] タブを選択します。これにより、そのリージョンのすべての Lambda 関数がランタイム値でソートされます。

  • 各 Lambda 関数を node.js のランタイム値を使用して開き、[Configuration] タブを選択します。

  • [Runtime] の値を [Node.js 4.3] または [Node.js 6.10] に設定します。

  • 必要に応じて、各リージョンでこのプロセスを繰り返します。

ランタイム更新設計図を使用した Lambda 関数の一覧表示と新しいランタイムへの更新

  • AWS マネジメントコンソール にサインインして、Lambda コンソールを開きます。

  • [Create a Lambda Function] を選択します。

  • nodejs-upgrade-functions 設計図を選択し、これを使用して関数を作成します。

  • 関数では、次の環境変数を使用できます。

    • [MODE] = [List] または [Backup] または [Upgrade]

    • [TARGET_RUNTIME] = [nodejs4.3] または [nodejs6.10]

    • [EXCLUDED] = 処理から除外する関数名のカンマ区切りのリスト (リストにスペースを含めないでください)

  • 関数とバージョンのリストを取得するには、変数値を変更せずにコンソールから関数を呼び出します。

  • アップグレードする前に関数をバックアップするには、[MODE] の値を [Backup] に変更し、コンソールから関数を呼び出します。関数をアップグレードする前に、これを実行することを強くお勧めします。

  • 関数のランタイム値を更新するには、[MODE] の値を [Upgrade] に変更し、コンソールから関数を呼び出します。

  • 必要に応じて、各リージョンでこのプロセスを繰り返します。

  • 以下の点に注意してください。

    • 設計図で、既存の Node.js v1.0 関数がバージョンとして保存され、選択したバージョンに応じて、$LATEST が nodejs4.3 または nodejs6.10 に更新されます。関数のその他のバージョンをアップグレードできます。このバージョン情報を使用して、既存のアプリケーションバージョンでそのバージョンを指すことができます。

    • 設計図によりエイリアスは変更されません。その関数を指すエイリアスは新しいバージョンに再マッピングする必要があります。詳細については、「AWS Lambda 関数のバージョニングとエイリアス」を参照してください。

Node.js ランタイム v0.10.42 のコンテキストメソッド

Node.js ランタイム v0.10.42 では、ランタイム v4.3 および v6.10 ではサポートされている Lambda 関数のコールバックパラメータがサポートされていません。ランタイム v0.10.42 を使用する場合、以下のコンテキストオブジェクトメソッドを使用して Lambda 関数を正しく終了させます。コンテキストオブジェクトでは、Lambda 関数を終了させるために使用できるメソッドとして done()succeed()、および fail() をサポートしています。これらのメソッドは下位互換性のためにランタイム v4.3 および v6.10 にもあります。コードを移行してランタイム v4.3 または v6.10 を使用する方法については、「Lambda 関数コードの新しいランタイムへの移行」を参照してください。

context.succeed()

Lambda 関数の実行と、すべてのコールバックが正常に完了したことを示します。この一般的な構文を次に示します。

Copy
context.succeed(Object result);

各パラメーターの意味は次のとおりです。

result – オプションのパラメーターであり、関数の実行結果を提供するために使用できます。

提供される result は、JSON.stringify と互換性がある必要があります。AWS Lambda が文字列化に失敗するか、別のエラーが発生した場合、X-Amz-Function-Error レスポンスヘッダーが Unhandled に設定されて、処理されない例外がスローされます。

パラメータなしでこのメソッドを呼び出す (succeed()) か、null 値を渡す (succeed(null)) ことができます。

このメソッドの動作は、Lambda 関数の呼び出しで指定された呼び出しタイプによって異なります。呼び出しタイプの詳細については、「Invoke」を参照してください。

  • Lambda 関数が Event 呼び出しタイプ (非同期呼び出し) を使用して呼び出された場合、メソッドは HTTP status 202, request accepted という応答を返します。

  • RequestResponse 呼び出しタイプを使用して Lambda 関数が呼び出された場合、このメソッドは HTTP ステータス 200 (OK) を返し、レスポンス本文を result を表す文字列に設定します。

context.fail()

Lambda 関数の実行とすべてのコールバックが成功せずに完了し、処理された例外となったことを示します。一般的な構文を以下に示します。

Copy
context.fail(Error error);

各パラメーターの意味は次のとおりです。

error – オプションのパラメーターであり、Lambda 関数の実行結果を提供するために使用できます。

error 値が Null 以外の場合、メソッドはレスポンス本文を error の文字列表現に設定し、対応するログを CloudWatch に書き込みます。AWS Lambda が文字列化に失敗するか、別のエラーが発生した場合、X-Amz-Function-Error ヘッダーが Unhandled に設定されて、処理されないエラーが発生します。

注記

context.fail(error) および context.done(error, null) からのエラーの場合、Lambda はエラーオブジェクトの最初の 256 KB を記録します。大きなエラーオブジェクトの場合、AWS Lambda はエラーを切り捨て、エラーオブジェクトの横に、テキスト「 Truncated by Lambda」が表示されます。

パラメータなしでこのメソッドを呼び出す (fail()) か、null 値を渡す (fail(null)) ことができます。

context.done()

Lambda 関数の実行を終了させます。

注記

このメソッドは、"エラーファースト" コールバック設計パターンの使用を許可して、succeed() および fail() メソッドを補完します。追加の機能は提供しません。

一般的な構文:

Copy
context.done(Error error, Object result);

各パラメーターの意味は次のとおりです。

  • error – オプションのパラメーターであり、Lambda 関数の失敗した実行結果を提供するために使用できます。

  • result – オプションのパラメーターであり、関数の正常な実行結果を提供するために使用できます。提供される result は、JSON.stringify と互換性がある必要があります。エラーになる場合、このパラメーターは無視されます。

パラメータなしでこのメソッドを呼び出す (done()) か、null 値を渡す (done(null)) ことができます。

AWS Lambda は処理された例外として、error パラメータの Null 以外の値を処理します。

関数の動作は、Lambda 呼び出し時に指定された呼び出しタイプによって異なります。呼び出しタイプの詳細については、「Invoke」を参照してください。

  • 呼び出しタイプにかかわらず、このメソッドは error の Null 以外の値を表す文字列を Lambda 関数に関連付けられた Amazon CloudWatch Logs ストリームに記録します。

  • Lambda 関数が RequestResponse (同期型) を使用して呼び出された場合、このメソッドは次のようにレスポンス本文を返します。

    • error が Null の場合は、レスポンス本文を result の JSON 表現に設定します。これは context.succeed() に似ています。

    • error が Null ではない場合、または error 型の単一の引数を使用して関数が呼び出された場合は、error 値がレスポンス本文に入力されます。

注記

done(error, null) および fail(error) の両方からエラーの場合、Lambda はエラーオブジェクトの最初の 256 KB を記録します。大きなエラーオブジェクトの場合、AWS Lambda はログを切り捨て、エラーオブジェクトの横にテキスト「Truncated by Lambda」が表示されます。

コンテキストメソッドとコールバックメソッドの比較

以前に Node.js ランタイム v0.10.42 を使用して Lambda 関数を作成した場合は、context オブジェクトメソッド (done()succeed()、およびfail()) のいずれかを使用して Lambda 関数を終了する必要があります。Node.js ランタイム v4.3 および v6.10 では、これらのメソッドは主に下位互換性のためにサポートされています。callback (「コールバックパラメーターを使用する」を参照) を使用することをお勧めします。以下は context オブジェクトメソッドと同等の callback の例です。

  • 次の例では、context.done() メソッドと、これに対応する、新しいランタイムでサポートされている同等の callback を示します。

    Copy
    // Old way (Node.js runtime v0.10.42). context.done(null, 'Success message'); // New way (Node.js runtime v4.3 or v6.10). context.callbackWaitsForEmptyEventLoop = false; callback(null, 'Success message');

    重要

    パフォーマンス上の理由により、AWS Lambda が複数の Lambda 関数の実行で同じ Node.js 処理を再利用することがあります。その場合は、実行と実行の合間は AWS Lambda は実行を継続するために必要な状態情報を維持しながら Node 処理を停止させます。

    context メソッドが呼び出されると、AWS Lambda はプロセスに関連するイベントループが空になるまで待機せずに、Node プロセスをただちに停止します。プロセスの状態とイベントループのイベントは停止されます。関数が再度呼び出され、AWS Lambda が停止したプロセスを再利用する場合、同じ共通状態で関数の実行が継続されます (たとえば、イベントループに残ったイベントの処理が開始されます)。ただし、コールバックを使用する場合、AWS Lambda はイベントループが空になるまで Lambda 関数の実行を継続します。イベントループのすべてのイベントが処理されたら、AWS Lambda は Lambda 関数内のすべての状態変数を含めた Node 処理を停止します。したがって、コンテキストメソッドで同じ動作を行うには、context オブジェクトプロパティである callbackWaitsForEmptyEventLoop を false に設定する必要があります。

  • 次の例では、context.succeed() メソッドと、これに対応する、新しいランタイムでサポートされている同等の callback を示します。

    Copy
    // Old way (Node.js runtime v0.10.42). context.succeed('Success message'); // New way (Node.js runtime v4.3 or v6.10). context.callbackWaitsForEmptyEventLoop = false; callback(null, 'Success message');
  • 次の例では、context.fail() メソッドと、これに対応する、新しいランタイムでサポートされている同等の callback を示します。

    Copy
    // Old way (Node.js runtime v0.10.42). context.fail('Fail object'); // New way (Node.js runtime v4.3 or v6.10). context.callbackWaitsForEmptyEventLoop = false; callback('Fail object', 'Failed result');