Lambda 拡張機能を使用して Lambda 関数を補強する - AWS Lambda

Lambda 拡張機能を使用して Lambda 関数を補強する

Lambda 拡張機能を使用して Lambda 関数を補強できます。例えば、Lambda 拡張機能を使用して、任意のモニタリングツール、オブザーバビリティツール、セキュリティツール、およびガバナンスツールに関数を統合できます。AWS Lambda パートナーが提供する幅広いツールセットから選択することも、独自の 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 料金表を参照してください。パートナー拡張機能の料金については、パートナーのウェブサイトを参照してください。公式パートナーの拡張機能のリストについては、「AWS Lambda 拡張機能パートナー」を参照してください。

拡張機能と Lambda 関数でそれらを使用する方法に関するチュートリアルについては、「AWS Lambda Extensions Workshop」を参照してください。

実行環境

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

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

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

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

    Lambda SnapStart がアクティブ化されると、関数バージョンの発行時に Init フェーズが開始されます。Lambda は、初期化された実行環境のメモリとディスク状態のスナップショットを保存し、暗号化されたスナップショットを永続化して、低レイテンシーアクセスのためにスナップショットをキャッシュします。beforeCheckpoint ランタイムフックがある場合、コードは Init フェーズの最後に実行されます。

  • Restore (SnapStart のみ): SnapStart 関数を初めて呼び出し、その関数がスケールアップすると、Lambda は関数をゼロから初期化するのではなく、永続化されたスナップショットから新しい実行環境を再開します。afterRestore() ランタイムフックがある場合、コードは Restore フェーズの最後に実行されます。ユーザーには、afterRestore() ランタイムフックの所要時間分の料金が請求されます。タイムアウト制限 (10 秒) 内にランタイム (JVM) がロードされ、afterRestore() ランタイムフックが完了される必要があります。その時間を超えると、SnapStartTimeoutException が発生します。Restore フェーズが完了すると、Lambda が関数ハンドラーを呼び出します (呼び出しフェーズ)。

  • 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) アクセス許可を含む、同じ拡張機能の設定をアタッチする作業を簡略化できます。