

# ランタイム環境の変更
<a name="runtimes-modify"></a>

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

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

## 言語固有の環境変数
<a name="runtimes-envvars"></a>

Lambda は、次の言語固有の環境変数を通じて、関数の初期化中にコードをプリロードできるように設定専用の方法をサポートしています。
+ `JAVA_TOOL_OPTIONS` – Java を使用する場合、Lambda は追加のコマンドライン変数を設定するために、この環境変数をサポートします。この環境変数では、ツールの初期化を指定できます。具体的には、`agentlib` または `javaagent` オプションを使用して、ネイティブまたは Java プログラミング言語エージェントの起動を指定できます。詳細については、「[`JAVA_TOOL_OPTIONS` 環境変数](https://docs.aws.amazon.com/lambda/latest/dg/java-customization.html#java-tool-options)」を参照してください。
+ `NODE_OPTIONS` — [Node.js ランタイム](lambda-nodejs.md)で使用できます。
+ `DOTNET_STARTUP_HOOKS` -.NET Core 3.1 以降では、この環境変数が、Lambda が使用できるアセンブリ (dll) へのパスを指定します。

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

## ラッパースクリプト
<a name="runtime-wrapper"></a>

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

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

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

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

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

### 例: ラッパースクリプトを作成して Lambda レイヤーとして使用する
<a name="runtime-wrapper-example"></a>

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

**ラッパースクリプトを作成してレイヤーとして使用するには**

1. レイヤーのディレクトリを作成します。

   ```
   mkdir -p python-wrapper-layer/bin
   cd python-wrapper-layer/bin
   ```

1. `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[@]}"
   ```

1. スクリプトに実行可能権限を付与します。

   ```
   chmod +x importtime_wrapper
   ```

1. レイヤーの .zip ファイルを作成します。

   ```
   cd ..
   zip -r ../python-wrapper-layer.zip .
   ```

1. .zip ファイルに次のディレクトリ構造があることを確認します。

   ```
   python-wrapper-layer.zip
   └ bin
       └ importtime_wrapper
   ```

1. .zip パッケージを使用して[レイヤーを作成します](creating-deleting-layers.md#layers-create)。

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

   1. [Lambda コンソール](https://console.aws.amazon.com/lambda)を開きます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   1. [**Save**] を選択します。

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

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

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

   1. **[ログ出力]** まで下にスクロールします。ラッパースクリプトが `-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
      ```