ランタイム環境の変更 - 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 環境変数の値を設定します。

例: Python 3.8 でのラッパースクリプトの作成と使用

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

Python 3.8 でラッパースクリプトを作成して使用するには
  1. ラッパースクリプトを作成するには、次のコードを 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[@]}"
  2. スクリプトに実行可能なアクセス許可を与えるには、コマンドラインから「chmod +x importtime_wrapper」と入力します。

  3. スクリプトを Lambda レイヤーとしてデプロイします。

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

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

    2. [Create function] を選択します。

    3. [基本的な情報] の [関数名] に「wrapper-test-function」と入力します。

    4. [Runtime (ランタイム)] で [Python 3.8] を選択します。

    5. [Create function] を選択します。

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

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

    2. [Add a layer] を選択します。

    3. [Choose a layer (レイヤーの選択)] で、前に作成した互換性のあるレイヤーの [名前] と [バージョン] を選択します。

    4. [Add] (追加) をクリックします。

  6. コードと環境変数を関数に追加します。

    1. 関数コードエディタで、次の関数コードを貼り付けます。

      import json def lambda_handler(event, context): # TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
    2. [Save] を選択します。

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

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

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

    6. [Value (値)] に「/opt/importtime_wrapper」と入力します。

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

  7. 関数を実行するには、[テスト] を選択します。

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

    ... 2020-06-30T18:48:46.780+01:00 import time: 213 | 213 | simplejson 2020-06-30T18:48:46.780+01:00 import time: 50 | 263 | simplejson.raw_json ...