AWS Lambda Logs API - AWS Lambda

AWS Lambda Logs API

Lambda ランタイムログを自動的にキャプチャし、Amazon CloudWatch にストリームします 。このログストリームには、Lambda 関数コードと拡張機能が生成するログと、関数呼び出しの一部として生成するログが含まれます。

Lambda 拡張機能 は、Lambda ランタイムログ API を使用して、Lambda 実行環境内 からログストリームに直接サブスクライブできます。Lambda はログを拡張機能にストリームし、拡張機能はログを処理、フィルタ、そして指定の宛先に送信できます。


      拡張機能 API と Logs API は、Lambda と外部拡張を接続します。

Logs API を使用すると、拡張機能は 3 つの異なるログストリームにサブスクライブできます。

  • 関数ログは、関数が発生する Lambda、そして stdoutstderr を記録します。

  • Lambda プラットフォームログ (開始、終了、レポートログなど)。

  • 拡張コードが生成する拡張ログ。

注記

Lambda は拡張機能が 1 つまたは複数のログストリームにサブスクライブしている場合でも、すべてのログを CloudWatch に送信します。

サブスクライブしてログを受信する

Lambda エクステンションは、Logs API にサブスクリプションリクエストを送信することで、ログを受信するようサブスクライブできます。

ログを受信するためにサブスクライブするには、内線識別子(Lambda-Extension-Identifier)が必要です。最初に 内線番号を登録 し、内線番号を受け取ります。そして 初期化中 に Logs API にサブスクライブします。初期化フェーズが完了すると、Lambda はサブスクリプションリクエストを処理しません。

注記

Logs API サブスクリプションは冪等です。サブスクリプションリクエストが重複しても、サブスクリプションが重複することはありません。

サブスクライバの数が増加すると、メモリ使用量は直線的に増加します。サブスクリプションは、各サブスクリプションが新しいメモリバッファを開き、ログを保存するため、メモリリソースを消費します。メモリ使用量を最適化するために、 バッファリング設定 を調整できます。バッファメモリ使用量は、実行環境の全体的なメモリ消費量の一部としてカウントされます。

送信先プロトコル

ログを受信するには、次のいずれかのプロトコルを選択できます。

  1. HTTP (推奨) – ログは、JSON 形式の記録の配列として、ローカル HTTP エンドポイント (http://sandbox:${PORT}/${PATH}) に配信されます。$PATH パラメータはオプションです。HTTP のみがサポートされ、HTTPS はサポートされません。ログを受信するには、PUT または POST のいずれかを選択できます。

  2. TCP 改行区切りの JSON(NDJSON)形式で – TCPポートに配信されます

TCP ではなく HTTP を使用することをお勧めします。TCP では、Lambda プラットフォームはログがアプリケーション層に配信されることを認識できません。したがって、拡張機能がクラッシュすると、ログが失われる可能性があります。HTTP はこの制限を共有しません。またTCP 接続では、意図せずに NDJSON 記録を誤ってパーティション化し、形式が破損する可能性があります。TCP を使用する場合は、改行が到着するまで待ってから、レコードをフラッシュします。

また、サブスクライブしてログを受信する前に、ローカル HTTP リスナーまたは TCP ポートを設定することをお勧めします。セットアップ中に、次の点に注意してください。

  • Lambda は、実行環境内の送信先にのみログを送信します。

  • Lambda リスナーがない場合、または POST や PUT リクエストの結果でエラーが発生した場合は、ログ送信の試行を再試行します(バックオフあり)。ログサブスクライバがクラッシュした場合、Lambda が実行環境を再起動した後もログを受信し続けます。

  • Lambda ポート9001が予約されています。他のポート番号の制限や推奨事項はありません。

バッファリング構成

Lambda はログをバッファリングし、サブスクライバに配信できます。サブスクリプションリクエストでこの動作を構成するには、次のオプションフィールドを指定します。Lambda では、指定しないフィールドにはデフォルト値が使用されます。

  • timeoutMs – バッチをバッファーする最大時間(ミリ秒単位)。デフォルト:1000最小: 25最大:30000

  • maxBytes – メモリにバッファするログの最大サイズ (バイト単位)。デフォルト:262144最小: 262144最大:1048576

  • MaxItems – メモリにバッファするイベントの最大数。デフォルト:10000最小:1000最大:10000

バッファリングの設定時には、次の点に注意してください。

  • Lambda は、ランタイムがクラッシュした場合など、入力ストリームが閉じられている場合、ログをフラッシュします。

  • 各サブスクライバは、サブスクリプションリクエスト中に異なるバッファリング設定を指定できます。

  • データを読み取るために必要なバッファサイズを考慮してください。サブスクライブリクエストで設定されている maxBytes と同じ大きさのペイロード 2*maxBytes+metadata を受信することを想定します。たとえば、Lambda は、次のメタデータバイトを各レコードに追加します。

    { "time": "2020-08-20T12:31:32.123Z", "type": "function", "record": "Hello World" }
  • サブスクライバが着信ログを十分な速さで処理できない場合、Lambda はログを削除して、メモリ使用率を制限し続ける可能性があります。削除されたレコードの数を示すために、Lambda は platform.logsDropped レコードを挿入します。

サブスクリプションの例

次の例は、プラットフォームログと関数ログをサブスクライブするリクエストを示しています。

PUT http://${AWS_LAMBDA_RUNTIME_API}/2020-08-15/logs/ HTTP/1.1 {"types": [ "platform", "function" ], "buffering": { "maxItems": 1000, "maxBytes": 10240, "timeoutMs": 100 } "destination": { "protocol": "HTTP", "URI": "http://sandbox:8080/lambda_logs" } }

リクエストが成功すると、サブスクライバーは HTTP 200 成功レスポンスを受信します。

HTTP/1.1 200 OK "OK"

ログメッセージの例

次の例は、プラットフォームの開始、終了、およびレポートログを示しています。

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.start", "record": { "requestId": "6f7f0961f83442118a7af6fe80b88d56" } } { "time": "2020-08-20T12:31:32.123Z", "type": "platform.end", "record": { "requestId": "6f7f0961f83442118a7af6fe80b88d56" } } { "time": "2020-08-20T12:31:32.123Z", "type": "platform.report", "record": { "requestId": "6f7f0961f83442118a7af6fe80b88d56", "metrics": { "durationMs": 101.51, "billedDurationMs": 300, "memorySizeMB": 512, "maxMemoryUsedMB": 33, "initDurationMs": 116.67 } } }

プラットフォームログは、ランタイムまたは実行環境エラーをキャプチャします。次の例は、プラットフォーム障害ログメッセージを示しています。

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.fault", "record": "RequestId: d783b35e-a91d-4251-af17-035953428a2c Process exited before completing request" }

次の例は、拡張 API 登録ログメッセージを示しています。

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.extension", "record": { "name": "Foo.bar", "state": "Ready", "events": ["INVOKE", "SHUTDOWN"] } }

次の例は、Logs API サブスクリプションログメッセージを示しています。

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.logsSubscription", "record": { "name": "Foo.bar", "state": "Subscribed", "types": ["function", "platform"], } }

次の例は、platform.logsDropped ログメッセージの例を示しています。

{ "time": "2020-08-20T12:31:32.123Z", "type": "platform.logsDropped", "record": { "reason": "Consumer seems to have fallen behind as it has not acknowledged receipt of logs.", "droppedRecords": 123, "droppedBytes" 12345 } }

次の例は、関数ログメッセージの例を示しています。

{ "time": "2020-08-20T12:31:32.123Z", "type": "function", "record": "ERROR something happened. Stack trace:\n\tfoo (line 10)\n" }

ログ API のサンプルコード

Logs API のための コンピューティングブログ投稿エントリ には、ログをカスタム送信先に送信する方法を示すサンプルコードが含まれています。

Lambda では、基本的な拡張機能を開発や、Logs API をサブスクライブする方法、 Python と Go のコードサンプル を提供しています。拡張機能の構築 Lambda に関する詳細については、Lambda 拡張機能 API を参照してください。

Logs API リファレンス

Logs API エンドポイントの値は、AWS_LAMBDA_RUNTIME_API の環境変数から取得できます。API リクエストを送信するには、API パスの前にプレフィックス 2020-08-15/ を使用します。次に例を示します。

http://${AWS_LAMBDA_RUNTIME_API}/2020-08-15/logs/

サブスクライブ

Lambda 実行環境で使用できる 1 つ以上のログストリームをサブスクライブするために、拡張機能は サブスクライブ API リクエストを送信します。

Log API サブスクリプションリクエストの OpenAPI 仕様 (バージョン 2020年8月15日 ) は、ここで入手できます。 logs-api-request.zip

パス /logs

メソッド PUT

Body パラメータ

destination –「送信先プロトコル」を参照してください。必須: はい。タイプ:文字列。

buffering –「バッファリング構成」を参照してください。必須:いいえ。タイプ:文字列。

types – 受信するログのタイプの配列。必須: はい。タイプ: 文字列の配列有効な値:「プラットフォーム」、「関数」、「拡張」。

レスポンスパラメータ

サブスクリプションレスポンスの OpenAPI 仕様 (バージョン 2020年8月15日 ) は、HTTP および TCP で使用できます。

レスポンスコード

  • 200 – リクエストが完了しました

  • 202 – リクエストが承認されましたローカルテスト中のサブスクリプションリクエストへのレスポンス。

  • 4XX – 無効のリクエスト

  • 500 – サービスエラー

例 サブスクリプションリクエストの例

PUT http://${AWS_LAMBDA_RUNTIME_API}/2020-08-15/logs/ HTTP/1.1 { "types": [ "platform", "function" ], "buffering": { "maxItems": 1000, "maxBytes": 10240, "timeoutMs": 100 } "destination": { "protocol": "HTTP", "URI": "http://sandbox:8080/lambda_logs" } }

リクエストが成功すると、サブスクライバーは HTTP 200 成功レスポンスを受信します。

HTTP/1.1 200 OK "OK"

リクエストが失敗した場合、サブスクライバはエラーレスポンスを受信します。

HTTP/1.1 400 OK { "errorType": "Logs.ValidationError", "errorMessage": URI port is not provided; types should not be empty" }