AWS Lambda 用カスタムランタイムの構築 - AWS Lambda

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Lambda 用カスタムランタイムの構築

AWS Lambda ランタイムは、どのプログラミング言語でも実装できます。ランタイムは、関数が呼び出されたときに Lambda 関数のハンドラメソッドを実行するプログラムです。ランタイムは、関数のデプロイパッケージに含めるか、またはレイヤーで配信することができます。Lambda 関数を作成するときは、OS 専用ランタイム (provided ランタイムファミリー) を選択します。

注記

カスタムランタイムの作成は高度なユースケースです。ネイティブバイナリへのコンパイルやサードパーティの既製のランタイムの使用に関する情報をお探しの場合は、「AWS Lambda の OS 専用ランタイム」を参照してください。

カスタムランタイムデプロイの手順については、「チュートリアル: カスタムランタイムの構築」を参照してください。また、GitHub の awslabs/aws-lambda-cpp に C++ で実装されているカスタムランタイムを検証することもできます。

要件

カスタムランタイムでは、特定の初期化タスクと処理タスクを完了する必要があります。ランタイムは、関数のセットアップコードの実行、環境変数からのハンドラ名の読み取り、Lambda ランタイム API からの呼び出しイベントの読み取りを行います。ランタイムは、イベントデータを関数ハンドラに渡し、ハンドラからのレスポンスを Lambda に戻します。

初期化タスク

初期化タスクは、呼び出しを処理する環境を準備するために、関数のインスタンスごとに 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 を呼び出します。

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

エントリポイント

カスタムランタイムのエンドポイントは、bootstrap という名前の実行可能ファイルです。ブートストラップファイルをランタイムにするか、ランタイムを作成する別のファイルを呼び出す場合があります。デプロイパッケージのルートに bootstrap という名前のファイルが含まれていない場合、Lambda は関数のレイヤーでファイルを検索します。bootstrap ファイルが存在しないか、実行可能でない場合、関数は呼び出し時に Runtime.InvalidEntrypoint エラーを返します。

bootstrap ファイルによる例では、バンドルされた Node.js バージョンを使用して、runtime.js という別のファイルで JavaScript ランタイムを実行します。

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

カスタムランタイムでのレスポンスストリーミングの実装

レスポンスストリーミング関数については、response および error エンドポイントは、ランタイムが部分的なレスポンスをクライアントにストリーミングし、ペイロードをチャンクで返すことができるように動作が若干変更されています。特定の動作の詳細については、以下を参照してください。

  • /runtime/invocation/AwsRequestId/response – ランタイムからの Content-Type ヘッダーを伝播して、クライアントに送信します。Lambda は、HTTP/1.1 チャンク転送エンコーディングを介して、レスポンスペイロードをチャンクで返します。レスポンスストリーミングは最大サイズは 20 MiB まで許可されます。Lambda にレスポンスをストリーミングするには、ランタイムが以下を実行する必要があります。

    • Lambda-Runtime-Function-Response-Mode HTTP ヘッダーを streaming に設定する。

    • Transfer-Encoding ヘッダーを chunked に設定します。

    • HTTP/1.1 チャンク転送エンコーディング仕様に従ったレスポンスを書き込む

    • レスポンスを正常に書き込んだ後、基盤となる接続を閉じます。

  • /runtime/invocation/AwsRequestId/error – ランタイムはこのエンドポイントを使用して、関数またはランタイムのエラーを Lambda に報告できます。Lambda は Transfer-Encoding ヘッダーも受け入れます。このエンドポイントを呼び出せるのは、ランタイムが呼び出しレスポンスの送信を開始する前だけです。

  • /runtime/invocation/AwsRequestId/response でエラー トレーラーを使用して中間エラーを報告 - ランタイムが呼び出しレスポンスの書き込みを開始した後に発生したエラーを報告するために、ランタイムはオプションで Lambda-Runtime-Function-Error-Type および Lambda-Runtime-Function-Error-Body という名前の HTTP 末尾ヘッダーをアタッチすることができます。Lambda はこれを正常なレスポンスとして扱い、ランタイムが提供するエラーメタデータをクライアントに転送します。

    注記

    末尾ヘッダーをアタッチするには、ランタイムが HTTP リクエストの先頭に Trailer ヘッダー値を設定する必要があります。これは、HTTP/1.1 チャンク転送エンコーディング仕様によって義務付けられています。

    • Lambda-Runtime-Function-Error-Type – ランタイムで発生したエラータイプ。このヘッダーは、文字列値で構成されています。Lambda はどのような文字列でも受け入れますが、形式は <category.reason> にすることが推奨されます。例えば、Runtime.APIKeyNotFound と指定します。

    • Lambda-Runtime-Function-Error-Body – Base64-encoded でのエラーに関する情報。