AWS Lambda 実行環境 - AWS Lambda

AWS Lambda 実行環境

Lambda は、実行環境で関数を呼び出します。これにより、安全で分離されたランタイム環境が提供されます。実行環境は、関数の実行に必要なリソースを管理します。また、関数のランタイム、および関数に関連付けられた外部拡張機能のライフサイクルサポートも提供します。

関数のランタイムは、ランタイム API を使用して Lambda と通信します。拡張機能は、拡張機能 API を使用して Lambda と通信します。拡張機能は、 Logs API を使用してログをサブスクライブすることで、関数からログメッセージを受信することもできます。


      実行環境のアーキテクチャ図。

Lambda 関数を作成するときは、使用可能なメモリ量や、関数に許可される最大実行時間などの設定情報を指定します。Lambda は、この情報を使用して実行環境をセットアップします。

関数のランタイムと各外部拡張機能は、実行環境内で実行されるプロセスです。アクセス許可、リソース、認証情報、および環境変数は、関数と拡張機能の間で共有されます。

Lambda 実行環境のライフサイクル

実行環境のライフサイクルには、次のフェーズが含まれています。

  • Init: このフェーズでは、Lambda は、設定されたリソースでの実行環境の作成またはフリーズ解除、関数とすべてのレイヤー用のコードのダウンロード、拡張機能の初期化、ランタイムの初期化を行い、関数の初期化コード (メインハンドラー外のコード) を実行します。Init フェーズは、最初の呼び出し中に発生するか、プロビジョニングされた同時実行を有効にしている場合は、関数呼び出しの前に発生します。

    Init フェーズは、Extension initRuntime initFunction init の 3 つのサブフェーズに分割されます。これらのサブフェーズにより、関数コードが実行される前に、すべての拡張機能とランタイムでセットアップタスクが完了されます。

  • Invoke: このフェーズでは、Lambda は関数ハンドラーを呼び出します。関数の実行が完了すると、Lambda は別の関数呼び出しを処理する準備をします。

  • Shutdown: このフェーズは、Lambda 関数が一定期間呼び出しを受け取らなかった場合に、トリガーされます。Shutdown フェーズでは、Lambda はランタイムを終了し、拡張機能に警告してクリーンに停止させ、その後に環境を削除します。Lambda は、各拡張機能に Shutdown イベントを送信し、環境が間もなくシャットダウンされることを拡張機能に通知します。


         Init フェーズの後に 1 つ以上の関数呼び出しが続きます。呼び出しリクエストがない場合、Lambda は SHutdown フェーズを開始します。

各フェーズは、ランタイムと、登録されているすべての拡張機能に Lambda を送信するイベントから始まります。ランタイムと各拡張機能は、Next API リクエストを送信することで完了を示します。Lambda は、ランタイムと各拡張機能が完了して保留中のイベントがなくなると、実行環境をフリーズします。

初期化フェーズ

Init フェーズでは、Lambda は次の 3 つのタスクを実行します。

  • すべての拡張機能を起動する (Extension init)

  • ランタイムをブートストラップする (Runtime init)

  • 関数の静的コード (Function init) を実行する

この Init フェーズは、ランタイムとすべての拡張機能が Next API リクエストを送信して準備完了を示したときに終了します。Init フェーズは 10 秒に制限されています。3 つのタスクすべてが 10 秒以内に完了しない場合、Lambda は最初の関数呼び出し時に Init フェーズを再試行します。

呼び出しフェーズ

Next API リクエストに応答して Lambda 関数が呼び出されると、Lambda はランタイムと各拡張機能に Invoke イベントを送信します。

関数のタイムアウト設定は、Invoke フェーズ全体の所要時間を制限します。例えば、関数のタイムアウトを 360 秒に設定した場合、関数とすべての拡張機能は 360 秒以内に完了する必要があります。独立した呼び出し後フェーズはないことに注意してください。所要時間は、すべての呼び出し時間 (ランタイム + 拡張機能) の合計であり、関数とすべての拡張機能の実行が終了するまで計算されません。

呼び出しフェーズはランタイム後に終了し、すべての拡張機能は Next API リクエストを送信して、完了したことを示します。

Invoke フェーズで Lambda 関数がクラッシュまたはタイムアウトした場合、Lambda は実行環境をリセットします。リセットは Shutdown イベントのように動作します。まず、Lambda はランタイムをシャットダウンします。次に、Lambda は登録された各外部拡張機能に Shutdown イベントを送信します。イベントには、シャットダウンの理由が含まれます。別の Invoke イベントによってこの実行環境が再利用された場合、Lambda は次の呼び出しの一部としてランタイムと拡張機能を初期化します。


          これがイメージです。

シャットダウンフェーズ

Lambda は、ランタイムをシャットダウンしようとする際に、ランタイムと各外部拡張機能に Shutdown イベントを送信します。拡張機能は、この時間を最終的なクリーンアップタスクに使用できます。Shutdown イベントは、Next API リクエストに対するレスポンスです。

期間: Shutdown フェーズ全体の上限は 2 秒です。ランタイムまたは拡張機能が応答しない場合、Lambda は通知 (SIGKILL) によりそれを終了します。

関数とすべての拡張機能が完了した後、Lambda は別の関数の呼び出しを想定して、実行環境をしばらく維持します。実際には、Lambda は実行環境をフリーズします。関数が再び呼び出されると、再利用のため、Lambda によって環境が解凍されます。実行環境の再利用には、次のような意味があります。

  • 関数のハンドラーメソッドの外部で宣言されたオブジェクトは、初期化されたままとなり、関数が再度呼び出されると追加の最適化を提供します。たとえば、Lambda 関数がデータベース接続を確立する場合、連続した呼び出しでは接続を再確立する代わりに元の接続が使用されます。新しい接続を作成する前に、接続が存在するかどうかを確認するロジックをコードに追加することをお勧めします。

  • 各実行環境は、/tmp ディレクトリ内のディスク領域を 512 MB に提供します。ディレクトリのコンテンツは、実行環境が停止された際に維持され、複数の呼び出しに使用できる一時的なキャッシュを提供します。キャッシュに保存したデータが存在するかどうかを確認するための追加コードを追加できます。デプロイのサイズ制限の詳細については、「Lambda のクォータ」を参照してください。

  • Lambda 関数によって開始され、関数が終了したときに完了しなかったバックグラウンドプロセスまたはコールバックは、Lambda 関数が実行環境を再利用したときに再開されます。コードのバックグラウンド処理またはコールバックは、コード終了までに完了させてください。

関数コードを記述するときは、Lambda によって後続の関数の呼び出しに実行環境が自動的に再利用されると想定しないでください。他の要因で Lambda によって新しい実行環境が作成される場合があるため、データベース接続の失敗など予期しない結果になることがあります。