Lambda 拡張機能
Lambda 拡張機能を使用して Lambda 関数を補強できます。例えば、Lambda 拡張機能を使用して、任意のモニタリングツール、オブザーバビリティツール、セキュリティツール、およびガバナンスツールに関数を統合できます。AWS Lambda パートナー
Lambda は、外部拡張機能と内部拡張機能をサポートしています。外部拡張機能は、実行環境で独立したプロセスとして実行され、関数の呼び出しが完全に処理された後も引き続き実行されます。拡張機能は別々のプロセスとして実行されるため、関数とは異なる言語で記述できます。すべての Lambda ランタイム は拡張機能をサポートします。
内部拡張機能は、ランタイムプロセスの一部として実行されます。関数は、ラッパースクリプトまたは JAVA_TOOL_OPTIONS
などのインプロセスメカニズムを使用して、内部拡張機能にアクセスします。詳細については、「ランタイム環境の変更」を参照してください。
Lambda コンソール、AWS Command Line Interface (AWS CLI)、または Infrastructure as Code (IAC) サービス、およびツール (AWS CloudFormation、AWS Serverless Application Model (AWS SAM)、Terraform など) を使用して、関数に拡張機能を追加できます。
料金は、拡張機能の実行時間 (1 ms 単位) に対して課金されます。拡張機能の料金の詳細については、AWS Lambda 料金表
実行環境
Lambda は、実行環境で関数を呼び出します。これにより、安全で分離されたランタイム環境が提供されます。実行環境は、関数の実行に必要なリソースを管理し、関数のランタイムおよび拡張機能のライフサイクルサポートを提供します。
実行環境のライフサイクルには、以下のフェーズが含まれています。
-
Init
: このフェーズ中、Lambda は、設定したリソースを使用して実行環境を作成またはフリーズ解除し、関数コードとすべてのレイヤーをダウンロードして、拡張機能とランタイムを初期化し、関数の初期化コード (メインハンドラーの外部にあるコード) を実行します。Init
フェーズは、最初の呼び出し中か、プロビジョニング済みの同時実行を有効にしている場合は関数呼び出しの前に、発生します。Init
フェーズは、Extension init
、Runtime init
、Function init
の 3 つのサブフェーズに分割されます。これらのサブフェーズでは、関数コードが実行される前に、すべての拡張機能とランタイムがそのセットアップタスクを完了します。Lambda SnapStart がアクティブ化されると、関数バージョンの発行時に
Init
フェーズが開始されます。Lambda は、初期化された実行環境のメモリとディスク状態のスナップショットを保存し、暗号化されたスナップショットを永続化して、低レイテンシーアクセスのためにスナップショットをキャッシュします。beforeCheckpoint
ランタイムフックがある場合、コードはInit
フェーズの最後に実行されます。 -
Restore
(SnapStart のみ): SnapStart 関数を初めて呼び出し、その関数がスケールアップすると、Lambda は関数をゼロから初期化するのではなく、永続化されたスナップショットから新しい実行環境を再開します。afterRestore()
ランタイムフックがある場合、コードはRestore
フェーズの最後に実行されます。ユーザーには、afterRestore()
ランタイムフックの所要時間分の料金が請求されます。タイムアウト制限 (10 秒) 内にランタイム (JVM) がロードされ、afterRestore()
ランタイムフックが完了される必要があります。その時間を超えると、SnapStartTimeoutException が発生します。Restore
フェーズが完了すると、Lambda が関数ハンドラーを呼び出します (Invoke
フェーズ)。 -
Invoke
: このフェーズでは、Lambda は関数ハンドラーを呼び出します。関数が実行され、完了すると、Lambda は、別の関数呼び出しを処理する準備をします。 -
Shutdown
: このフェーズは、Lambda 関数が一定期間呼び出しを受け取らなかった場合にトリガーされます。Shutdown
フェーズでは、Lambda はランタイムをシャットダウンし、拡張機能にアラートを出してそれらを完全に停止させた後、環境を削除します。Lambda は、各拡張機能にShutdown
イベントを送信します。これにより、環境がシャットダウンされようとしていることを各拡張機能に伝えます。
Init
フェーズでは、Lambda は拡張機能を含むレイヤーを実行環境の /opt
ディレクトリに抽出します。Lambda は、/opt/extensions/
ディレクトリで拡張機能を検索し、各ファイルを拡張機能を起動するための実行可能なブートストラップであると解釈し、すべての拡張機能を並行して開始します。
パフォーマンスとリソースへの影響
関数の拡張機能のサイズは、デプロイパッケージのサイズ制限に対してカウントされます。アーカイブの Zip ファイルについては、関数とすべての拡張機能を解凍した後の合計サイズは、解凍後のデプロイパッケージのサイズ制限 250 MB を超えることはできません。
拡張機能は、CPU、メモリ、ストレージなどの関数リソースを共有するため、関数のパフォーマンスに影響を与える可能性があります。例えば、拡張機能で計算負荷の高いオペレーションを実行する場合、関数の実行時間が長くなることがあります。
Lambda が関数を呼び出す前に、各拡張機能の初期化を完了する必要があります。したがって、初期化にかなり時間がかかる拡張機能は、関数呼び出しのレイテンシーを増やす可能性があります。
関数の実行後に拡張機能によって発生する追加時間を測定するには、PostRuntimeExtensionsDuration
関数メトリクスを使用できます。使用されるメモリの増加を測定するには、MaxMemoryUsed
メトリクスを使用できます。特定の拡張機能の影響を理解するために、異なるバージョンの関数を並行して実行できます。
許可
拡張機能は、関数と同じリソースにアクセスできます。拡張機能は関数と同じ環境内で実行されるため、アクセス許可は関数と拡張機能の間で共有されます。
アーカイブの Zip ファイルの場合、AWS CloudFormation テンプレートを作成することで、複数の関数に AWS Identity and Access Management (IAM) アクセス許可を含む、同じ拡張機能の設定をアタッチする作業を簡略化できます。