AWS Lambda
開発者ガイド

Node.js の AWS Lambda 関数ログ作成

Lambda 関数には、CloudWatch Logs ロググループが付属しており、関数のインスタンスごとにログストリームを含みます。ランタイムは、各呼び出しに関する詳細をログストリームに送信し、関数のコードのログやその他の出力を中継します。

関数コードからログを出力するには、コンソールオブジェクトのメソッドか、stdout または stderr に書き込む任意のログ記録のライブラリを使用します。次の例では、環境変数の値とイベントオブジェクトをログに記録します。

例 index.js ファイル – ログ記録

exports.handler = async function(event, context) { console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2)) console.log("EVENT\n" + JSON.stringify(event, null, 2)) return context.logStreamName };

例 ログの形式

START RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac Version: $LATEST 2019-06-07T19:11:20.562Z c793869b-ee49-115b-a5b6-4fd21e8dedac INFO ENVIRONMENT VARIABLES { "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST", "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/my-function", "AWS_LAMBDA_LOG_STREAM_NAME": "2019/06/07/[$LATEST]e6f4a0c4241adcd70c262d34c0bbc85c", "AWS_EXECUTION_ENV": "AWS_Lambda_nodejs10.x", "AWS_LAMBDA_FUNCTION_NAME": "my-function", "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin", "NODE_PATH": "/opt/nodejs/node10/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules", ... } 2019-06-07T19:11:20.563Z c793869b-ee49-115b-a5b6-4fd21e8dedac INFO EVENT { "key": "value" } END RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac REPORT RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac Duration: 170.19 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 73 MB

Node.js ランタイムは、呼び出しごとに REPORTEND、および START の各行を記録します。関数によってログに記録される各エントリに、タイムスタンプ、リクエスト ID、およびログレベルを追加します。

ログは、Lambda コンソール、CloudWatch Logs コンソール、またはコマンドラインで表示することができます。

AWS マネジメントコンソール でログを表示する

関数設定ページで関数を設定すると、Lambda コンソールによってログ出力が示されます。すべての呼び出しのログを表示するには、CloudWatch Logs コンソールを使用します。

Lambda 関数のログを表示するには

  1. CloudWatch コンソールのログページを開きます。

  2. 関数 (/aws/lambda/function-name) のロググループの名前を選択します。

  3. リストの最初のストリームを選択します。

各ログストリームは、関数のインスタンスに相当します。新しいストリームは、関数を更新する際や、複数の同時呼び出しを処理するために追加のインスタンスを作成する際に表示されます。特定の呼び出しのログを検索するには、X-Ray で関数を計測し、リクエストとログストリームに関する詳細をトレースに記録することができます。ログとトレースを X-Ray と関連付けるサンプルアプリケーションについては、AWS Lambda の Error Processor サンプルアプリケーション を参照してください。

AWS CLI の使用

コマンドラインから呼び出しのログを取得するには、--log-type オプションを使用します。レスポンスには、LogResult フィールドが含まれます。このフィールドには、呼び出しから base64 コードされた最大 4 KB のログが含まれます。

$ aws lambda invoke --function-name my-function out --log-type Tail { "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }

このログをデコードするには、base64 ユーティリティを使用します。

$ aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 73 MB

base64 ユーティリティは、Linux、macOS、および Windows の Ubuntu で使用できます。macOS の場合、コマンドは base64 -D です。

コマンドラインから完全なログイベントを取得するには、前の例に示すように、関数の出力にログストリーム名を含めることができます。次の例のスクリプトは、my-function という名前の関数を呼び出し、最後の 5 つのログイベントをダウンロードします。

例 get-logs.sh スクリプト

この例では、my-function がログストリーム ID を返す必要があります。

aws lambda invoke --function-name my-function --payload '{"key": "value"}' out sed -i 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name=file://out --limit 5

このスクリプトは sed を使用して出力ファイルから引用符を削除し、15 秒間スリープ状態にすることにより、ログを使用できるようにします。この出力には Lambda からのレスポンスと、get-log-events コマンドからの出力が含まれます。

$ ./get-log.sh { "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 100 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }

ログの削除

関数を削除してもロググループが自動的に削除されることはありません。ログが無期限に保存されないようにするには、ロググループを削除するか、ログが自動的に削除された後に保持期間を設定します。