AWS Lambda のカスタムランタイム - AWS Lambda

AWS Lambda のカスタムランタイム

AWS Lambda ランタイムは、どのプログラミング言語でも実装できます。ランタイムは、関数が呼び出されたときに Lambda 関数のハンドラメソッドを実行するプログラムです。ランタイムは、bootstrap という名前の実行可能ファイルの形式で、関数のデプロイパッケージに含めることができます。

ランタイムは、関数のセットアップコードの実行、環境変数からのハンドラ名の読み取り、Lambda ランタイム API からの呼び出しイベントの読み取りを行います。ランタイムは、イベントデータを関数ハンドラに渡し、ハンドラからのレスポンスを Lambda に戻します。

カスタムのランタイムは、スタンダードの Lambda 実行環境で実行されます。これは、シェルスクリプト (Amazon Linux に含まれる言語のスクリプト)、または Amazon Linux 上でコンパイルされたバイナリ実行ファイルである可能性があります。

カスタムのランタイムの使用を開始するには、「チュートリアル - カスタムランタイムの公開」を参照してください。また、GitHub の awslabs/aws-lambda-cpp に C++ で実装されているカスタムランタイムを検証することもできます。

カスタムランタイムの使用

カスタムランタイムを使用するには、関数のランタイムを provided に設定します。ランタイムは、関数のデプロイパッケージ、またはレイヤーに含めることができます。

例 function.zip

. ├── bootstrap ├── function.sh

bootstrap という名前のファイルがデプロイパッケージにある場合、Lambda はそのファイルを実行します。そのファイルがない場合、Lambda は関数のレイヤーにランタイムがないかどうかを確認します。ブートストラップファイルが見つからないか、実行可能でない場合、関数は呼び出し時にエラーを返します。

カスタムランタイムの構築

カスタムランタイムのエンドポイントは、bootstrap という名前の実行可能ファイルです。ブートストラップファイルをランタイムにするか、ランタイムを作成する別のファイルを呼び出す場合があります。以下の例では、バンドルされた Node.js バージョンを使用して、runtime.js という別のファイルで JavaScript ランタイムを実行します。

例 ブートストラップ

#!/bin/sh cd $LAMBDA_TASK_ROOT ./node-v11.1.0-linux-x64/bin/node runtime.js

お客様のランタイムコードは、初期化タスクを完了させる必要があります。完了すると、ループが終了するまで、呼び出しイベントが処理されます。初期化タスクは、呼び出しを処理する環境を準備するために、関数のインスタンスごとに 1 回実行されます。

初期化タスク

  • 設定の取得 – 関数と環境に関する詳細を取得するには、環境変数を参照してください。

    • _HANDLER – 関数の設定からハンドラへの場所。標準形式は、file.method です。ここで、file は、拡張子のないファイル名、method は、ファイルで定義されているメソッドまたは関数の名前を表します。

    • LAMBDA_TASK_ROOT – 関数コードを含むディレクトリ。

    • AWS_LAMBDA_RUNTIME_API – ランタイム API のホストおよびポート。

    使用可能な変数の詳細なリストについては、「定義されたランタイム環境変数」を参照してください。

  • 関数の初期化 – ハンドラファイルをロードし、ハンドラファイルに含まれているグローバルコードまたは静的コードを実行します。関数は、SDK クライアントやデータベース接続などの静的リソースを一度作成し、複数の呼び出しに再利用します。

  • ハンドラエラー – エラーが発生した場合は、初期化エラー API を呼び出し、すぐに終了します。

初期化は請求された実行時間とタイムアウトの対象です。実行によって関数の新しいインスタンスの初期化がトリガーされると、ログと AWS X-Ray トレースに初期化時間が表示されます。

例 ログ

REPORT RequestId: f8ac1208... Init Duration: 48.26 ms Duration: 237.17 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 26 MB

実行されている間、ランタイムは Lambda ランタイムインターフェイスを使用して、受信イベントの管理とエラーのレポートを行います。初期化タスクが完了したら、ランタイムは、受信イベントをループで処理します。ランタイムコードで、次のステップを順に実行します。

処理タスク

  • イベントの取得次の呼び出し API を呼び出して、次のイベントを取得します。レスポンス本文には、イベントデータが含まれます。レスポンスヘッダーには、リクエスト ID などの情報が含まれます。

  • トレースヘッダーの伝播 – X-Ray トレースヘッダーを API レスポンスのLambda-Runtime-Trace-Idヘッダーから取得します。_X_AMZN_TRACE_ID 環境変数をローカルで同じ値に設定します。X-Ray SDK はこの値を使用して、サービス間でトレースデータを接続します。

  • コンテキストオブジェクトの作成 – 環境変数のコンテキスト情報および API レスポンスのヘッダーでオブジェクトを作成します。

  • 関数ハンドラの呼び出し – イベントおよびコンテキストオブジェクトをハンドラに渡します。

  • レスポンスの処理呼び出しレスポンス API を呼び出し、レスポンスをハンドラから投稿します。

  • ハンドラエラー – エラーが発生した場合は、呼び出しエラー API を呼び出します。

  • クリーンアップ – 不要なリソースの解放、他のサービスへのデータ送信、次のイベント取得前の追加タスクの実行を行います。

ランタイムは、関数のデプロイパッケージに含めるか、個別に関数レイヤーに配布します。チュートリアル例については、「チュートリアル - カスタムランタイムの公開」を参照してください。