

# Lambda マネージドインスタンスの Python ランタイム
<a name="lambda-managed-instances-python-runtime"></a>

Lambda ランタイムは、複数の Python プロセスを使用して同時リクエストを処理します。各同時リクエストは、独自のメモリ容量と初期化を備えた個別のプロセスで実行されます。各プロセスは、一度に 1 つのリクエストを同期的に処理します。プロセスのメモリは直接共有されないため、グローバル変数、モジュールレベルのキャッシュ、およびシングルトンオブジェクトは同時リクエスト間で分離されます。

## 同時実行数の設定
<a name="lambda-managed-instances-python-concurrency-config"></a>

Lambda が各実行環境に送信する同時リクエストの最大数は、関数設定の `PerExecutionEnvironmentMaxConcurrency` 設定で制御できます。これはオプションの設定となっており、デフォルト値はランタイムによって異なります。Python ランタイムの場合の同時リクエスト数は、vCPU あたり 16 件がデフォルト値になっていますが、独自の値を設定することもできます。この値により、Python ランタイムで使用されるプロセスの数も決まります。Lambda は、各実行環境の容量に応じて、設定された最大数までの同時リクエストの数を自動的に調整し、それらのリクエストを取得します。

**重要**  
プロセスベースの同時実行を使用すると、各ランタイムワーカープロセスが独自に初期化を実行します。合計メモリ使用量は、プロセスごとのメモリに同時プロセス数を乗じたものと等しくなります。大きなライブラリまたはデータセットをロードしていて、同時実行性が高い場合は、メモリフットプリントが大きくなります。ワークロードによっては、CPU 対メモリの比率を調整するか、同時実行を低く設定して、利用可能なメモリを超過しないようにする必要があります。CloudWatch の `MemoryUtilization` メトリクスを使用して、メモリ消費量を追跡できます。

## 同時実行のための関数の構築
<a name="lambda-managed-instances-python-building"></a>

プロセスベースの複数同時実行モデルにより、Python ランタイムを使用する Lambda マネージドインスタンス関数は、複数の呼び出しからメモリ内リソースに同時にアクセスしません。メモリ内同時実行の安全性のためにコーディングプラクティスを適用する必要はありません。

## 共有の /tmp ディレクトリ
<a name="lambda-managed-instances-python-shared-tmp"></a>

`/tmp` ディレクトリは、実行環境内のすべての同時リクエスト間で共有されます。同じファイルに同時に書き込むと、別のプロセスによってファイルが上書きされるなど、データの破損が発生する可能性があります。これに対処するには、共有ファイルのファイルロックを実装するか、プロセスごとまたはリクエストごとに一意のファイル名を使用して競合を回避します。空き容量を占有しないよう、不要なファイルはクリーンアップしてください。

## ログ記録
<a name="lambda-managed-instances-python-logging"></a>

ログインターリービング (ログでインターリーブされるさまざまなリクエストからのログエントリ) は、複数同時実行システムでは正常です。

Lambda マネージドインスタンスを使用する関数は常に、[高度なログ記録コントロール](monitoring-logs.md#monitoring-cloudwatchlogs-advanced)で導入した構造化された JSON ログ形式を使用します。この形式には `requestId` が含まれ、ログエントリを 1 つのリクエストに関連付けることができます。Lambda の Python 標準ライブラリの `logging` モジュールを使用すると、`requestId` が各ログエントリに自動的に含まれます。詳細については、「[Python での Lambda の高度なログ記録コントロールの使用](https://docs.aws.amazon.com/lambda/latest/dg/python-logging.html#python-logging-advanced)」を参照してください。

## リクエストコンテキスト
<a name="lambda-managed-instances-python-request-context"></a>

`context.aws_request_id` を使用して、現在のリクエストのリクエスト ID にアクセスします。

Python ランタイムでは、`_X_AMZN_TRACE_ID` 環境変数を使用して、Lambda マネージドインスタンスで X-Ray トレース ID にアクセスできます。AWS SDK を使用すると、X-Ray トレース ID が自動的に伝播されます。

`context.get_remaining_time_in_millis()` を使用してタイムアウトを検出します。詳細については「[エラー処理と復旧](lambda-managed-instances-execution-environment.md#lambda-managed-instances-error-handling)」を参照してください。

## 初期化とシャットダウン
<a name="lambda-managed-instances-python-init-shutdown"></a>

関数の初期化はプロセスごとに 1 回行われます。関数が初期化中にログを発行すると、繰り返しログエントリが表示されることがあります。

拡張機能を持つ Lambda 関数の場合、実行環境はシャットダウン中に SIGTERM シグナルを出力します。このシグナルは拡張機能によって使用され、バッファのフラッシュなどのクリーンアップタスクをトリガーします。SIGTERM イベントにサブスクライブすることで、データベース接続を閉じるなどの関数のクリーンアップタスクを実行できます。実行環境のライフサイクルの詳細については、「[Lambda 実行環境のライフサイクルの概要](lambda-runtime-environment.md)」を参照してください。

## 依存関係バージョン
<a name="lambda-managed-instances-python-dependencies"></a>

Lambda マネージドインスタンスには、以下のパッケージバージョンの最小要件が必要です。
+ Powertools for AWS Lambda (Python): バージョン 3.23.0 以降

## Powertools for AWS Lambda (Python)
<a name="lambda-managed-instances-python-powertools"></a>

Powertools for AWS Lambda (Python) は Lambda マネージドインスタンスと互換性があり、ログ記録、トレース、メトリクスなどのユーティリティを利用できます。詳細については、「[Powertools for AWS Lambda (Python)](https://github.com/aws-powertools/powertools-lambda-python)」を参照してください。

## 次のステップ
<a name="lambda-managed-instances-python-next-steps"></a>
+ 「[Lambda マネージドインスタンスの Java ランタイム](lambda-managed-instances-java-runtime.md)」を確認する
+ 「[Lambda マネージドインスタンスの Node.js ランタイム](lambda-managed-instances-nodejs-runtime.md)」を確認する
+ 「[Lambda マネージドインスタンスの .NET ランタイム](lambda-managed-instances-dotnet-runtime.md)」を確認する
+ 「[Lambda マネージドインスタンスのスケーリング](lambda-managed-instances-scaling.md)」について説明する