ランタイム環境の変更 - AWS Lambda

ランタイム環境の変更

内部拡張機能を使用して、ランタイムプロセスを変更できます。内部拡張機能は、個別のプロセスではありません。ランタイムプロセスの一部として実行されます。

Lambda は、ランタイムにオプションとツールを追加するように設定することが可能な、言語固有の環境変数を提供します。Lambda さらにラッパースクリプトを呼び出します。これにより、Lambda はランタイム起動をスクリプトに委任できます。ラッパースクリプトを作成して、ランタイムの起動動作をカスタマイズできます。

言語固有の環境変数

Lambda は、次の言語固有の環境変数を通じて、関数の初期化中にコードをプリロードできるように設定専用の方法をサポートしています。

  • JAVA_TOOL_OPTIONS – Java を使用する場合、Lambda は追加のコマンドライン変数を設定するために、この環境変数をサポートします。この環境変数では、ツールの初期化を指定できます。具体的には、agentlib または javaagent オプションを使用して、ネイティブまたは Java プログラミング言語エージェントの起動を指定できます。詳細については、「JAVA_TOOL_OPTIONS 環境変数」を参照してください。

  • NODE_OPTIONSNode.js ランタイムで使用できます。

  • DOTNET_STARTUP_HOOKS -.NET Core 3.1 以降では、この環境変数が、Lambda が使用できるアセンブリ (dll) へのパスを指定します。

起動プロパティを設定するには、言語固有の環境変数を使用することを推奨します。

ラッパースクリプト

ラッパースクリプトを作成することで、Lambda 関数のランタイム起動動作をカスタマイズできます。ラッパースクリプトを使用すると、言語固有の環境変数を通じて、設定できない設定パラメーターを設定できます。

注記

ラッパースクリプトがランタイムプロセスを正常に開始しない場合、呼び出しが失敗することがあります。

ラッパースクリプトは、すべてのネイティブ Lambda ランタイムでサポートされています。ラッパースクリプトは OS 専用ランタイム (provided ランタイムファミリー) ではサポートされていません。

関数にラッパースクリプトを使用すると、Lambda はユーザーのスクリプトを使ってランタイムを開始します。Lambda は、インタープリターへのパスと、標準ランタイムを起動するための元の引数のすべてをスクリプトに送信します。スクリプトは、プログラムの起動動作を拡張または変換できます。例えば、スクリプトは、引数の挿入と変更、環境変数の設定、またはメトリクス/エラー/その他の診断情報の取得を行うことができます。

スクリプトを指定するには、実行可能バイナリまたはスクリプトのファイルシステムパスとして AWS_LAMBDA_EXEC_WRAPPER 環境変数の値を設定します。

例: ラッパースクリプトを作成して Lambda レイヤーとして使用する

次の例では、-X importtime オプションを指定して Python インタプリタを起動するラッパースクリプトを作成します。関数を実行すると、Lambda は、各インポートのインポートに要した時間を示すログエントリを生成します。

ラッパースクリプトを作成してレイヤーとして使用するには
  1. レイヤーのディレクトリを作成します。

    mkdir -p python-wrapper-layer/bin cd python-wrapper-layer/bin
  2. bin ディレクトリで、次のコードを importtime_wrapper という名前の新しいファイルに貼り付けます。これはラッパースクリプトです。

    #!/bin/bash # the path to the interpreter and all of the originally intended arguments args=("$@") # the extra options to pass to the interpreter extra_args=("-X" "importtime") # insert the extra options args=("${args[@]:0:$#-1}" "${extra_args[@]}" "${args[@]: -1}") # start the runtime with the extra options exec "${args[@]}"
  3. スクリプトに実行可能権限を付与します。

    chmod +x importtime_wrapper
  4. レイヤーの .zip ファイルを作成します。

    cd .. zip -r ../python-wrapper-layer.zip .
  5. .zip ファイルに次のディレクトリ構造があることを確認します。

    python-wrapper-layer.zip
    └ bin
        └ importtime_wrapper
  6. .zip パッケージを使用してレイヤーを作成します

  7. Lambda コンソールを使用して関数を作成します。

    1. Lambda コンソールを開きます。

    2. [Create function] (関数の作成) をクリックします。

    3. [Function name] (関数名) を入力します。

    4. [ランタイム] で、サポートされている最新の Python ランタイムを選択します。

    5. [Create function (関数の作成)] を選択します。

  8. レイヤーを関数に追加します。

    1. 関数を選択し、次に [コード] タブを選択します。

    2. [レイヤー] セクションまで下にスクロールし、[レイヤーの追加] を選択します。

    3. [レイヤーソース] で、[カスタムレイヤー] を選択し、[カスタムレイヤー] ドロップダウンリストからレイヤーを選択します。

    4. [Version (バージョン)] で、[1] を選択します。

    5. [追加] を選択します。

  9. ラッパー環境変数を追加します。

    1. [設定] タブを選択してから、[環境変数] を選択します。

    2. [環境変数] で、[編集] を選択します。

    3. [環境変数の追加] を選択します

    4. [キー] に「AWS_LAMBDA_EXEC_WRAPPER」と入力します。

    5. [値] に「/opt/bin/importtime_wrapper」(/opt/ + .zip レイヤーのフォルダ構造) と入力します。

    6. [Save] を選択します。

  10. ラッパースクリプトをテストします。

    1. [テスト] タブを選択します。

    2. [テストイベント] で、[テスト] を選択します。テストイベントを作成する必要はありません。デフォルトのイベントが機能します。

    3. [ログ出力] まで下にスクロールします。ラッパースクリプトが -X importtime オプションで Python インタプリタを起動したため、ログには各インポートにかかった時間が示されます。以下に例を示します。

      532 |           collections
      import time:        63 |         63 |           _functools
      import time:      1053 |       3646 |         functools
      import time:      2163 |       7499 |       enum
      import time:       100 |        100 |         _sre
      import time:       446 |        446 |           re._constants
      import time:       691 |       1136 |         re._parser
      import time:       378 |        378 |         re._casefix
      import time:       670 |       2283 |       re._compiler
      import time:       416 |        416 |       copyreg