Lambda 拡張機能の使用 - AWS 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 料金表を参照してください。パートナー拡張機能の料金については、パートナーのウェブサイトを参照してください。独自の拡張機能をインストールする場合、料金は発生しません。

実行環境

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

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

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

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

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

拡張子の設定 (.zip ファイルアーカイブ)

関数に、Lambda レイヤーとして拡張機能を追加できます。レイヤーを使用すれば、組織全体または Lambda デベロッパーのコミュニティ全体で拡張機能を共有できます。1 つ以上の拡張機能をレイヤーに追加できます。1 つの関数に最大 10 個の拡張機能を登録できます。

レイヤーの場合と同じメソッドを使用して、関数に拡張機能を追加します。詳細については、「Lambda 関数でのレイヤーの使用」を参照してください。

関数に拡張機能を追加する (コンソール)

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 関数を選択します。

  3. 選択されていない場合は、[Code (コード)] タブを選択します。

  4. [レイヤー] で、[Edit (編集)] を選択します。

  5. [Choose a layer] の [Specify an ARN] を選択します。

  6. [Specify an ARN] に、拡張機能レイヤーの Amazon リソースネーム (ARN) を入力します。

  7. [Add] (追加) を選択します。

コンテナイメージでの拡張機能の使用

コンテナイメージに拡張機能を追加できます 。ENTRYPOINT コンテナイメージ設定では、関数のメインプロセスを指定します。Dockerfile で ENTRYPOINT 設定を行うか、関数設定のオーバーライドとして設定します。

コンテナ内で複数のプロセスを実行できます。Lambda は、メインプロセスと任意の追加プロセスのライフサイクルを管理します。Lambda は、拡張機能 API を使用して、拡張機能のライフサイクルを管理します。

外部拡張機能の追加の例

外部拡張機能は、Lambda 関数とは別のプロセスで実行されます。Lambda は、/opt/extensions/ ディレクトリで各拡張モジュールのプロセスを開始します。Lambda は、拡張機能 API を使用して、拡張機能のライフサイクルを管理します。関数が実行され完了すると、Lambda はそれぞれの外部拡張機能に Shutdown イベントを送信します。

例 Python ベースイメージに外部拡張機能を追加する

FROM public.ecr.aws/lambda/python:3.8 # Copy and install the app COPY /app /app WORKDIR /app RUN pip install -r requirements.txt # Add an extension from the local directory into /opt ADD my-extension.zip /opt CMD python ./my-function.py

次のステップ

拡張機能の詳細を参照するには、次のリソースをお勧めします。

  • 基本的な使用例については、AWS Lambda コンピューティングブログの Building Extensions for AWS を参照してください。

  • AWS Lambda パートナーが提供する拡張機能の詳細については、AWS Lambda コンピューティングブログの AWS 拡張機能の紹介を参照してください。

  • 利用可能な拡張機能とラッパースクリプトの例については、AWS Lambda サンプル GitHub リポジトリの「AWS Extensions」を参照してください。