Go の AWS Lambda 関数ログ作成 - AWS Lambda

Go の AWS Lambda 関数ログ作成

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

関数コードからログを出力するには、fmt パッケージのメソッドか、stdout または stderr に書き込む任意のログ記録のライブラリを使用します。以下の例では、ログパッケージを使用しています。

main.go – ログ記録

func handleRequest(ctx context.Context, event events.SQSEvent) (string, error) { // event eventJson, _ := json.MarshalIndent(event, "", " ") log.Printf("EVENT: %s", eventJson) // environment variables log.Printf("REGION: %s", os.Getenv("AWS_REGION")) log.Println("ALL ENV VARS:") for _, element := range os.Environ() { log.Println(element) }

例 ログの形式

START RequestId: dbda340c-xmpl-4031-8810-11bb609b4c71 Version: $LATEST 2020/03/27 03:40:05 EVENT: { "Records": [ { "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", "receiptHandle": "MessageReceiptHandle", "body": "Hello from SQS!", "md5OfBody": "7b27xmplb47ff90a553787216d55d91d", "md5OfMessageAttributes": "", "attributes": { "ApproximateFirstReceiveTimestamp": "1523232000001", "ApproximateReceiveCount": "1", "SenderId": "123456789012", "SentTimestamp": "1523232000000" }, ... 2020/03/27 03:40:05 AWS_LAMBDA_LOG_STREAM_NAME=2020/03/27/[$LATEST]569cxmplc3c34c7489e6a97ad08b4419 2020/03/27 03:40:05 AWS_LAMBDA_FUNCTION_NAME=blank-go-function-9DV3XMPL6XBC 2020/03/27 03:40:05 AWS_LAMBDA_FUNCTION_MEMORY_SIZE=128 2020/03/27 03:40:05 AWS_LAMBDA_FUNCTION_VERSION=$LATEST 2020/03/27 03:40:05 AWS_EXECUTION_ENV=AWS_Lambda_go1.x END RequestId: dbda340c-xmpl-4031-8810-11bb609b4c71 REPORT RequestId: dbda340c-xmpl-4031-8810-11bb609b4c71 Duration: 38.66 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 54 MB Init Duration: 203.69 ms XRAY TraceId: 1-5e7d7595-212fxmpl9ee07c4884191322 SegmentId: 42ffxmpl0645f474 Sampled: true

Go ランタイムは、呼び出しごとに STARTEND、および REPORT の各行を記録します。レポート行には、次の詳細が示されます。

レポートログ

  • RequestId – 呼び出しの一意のリクエスト ID。

  • 所要時間 – 関数のハンドラーメソッドがイベントの処理に費やした時間。

  • 課金期間 – 呼び出しの課金対象の時間。

  • メモリサイズ – 関数に割り当てられたメモリの量。

  • 使用中の最大メモリ– 関数によって使用されているメモリの量。

  • Init Duration (初期所要時間) – 最初に処理されたリクエストについて、ハンドラーメソッド外で関数をロードしてコードを実行するためにランタイムにかかった時間。

  • XRAY TraceId – トレースされたリクエストの場合、AWS X-Ray のトレース ID

  • SegmentId – トレースされたリクエストの場合、X-Ray のセグメント ID。

  • Sampled (サンプリング済み) – トレースされたリクエストの場合、サンプリング結果。

ログは、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 を返す必要があります。

#!/bin/bash aws lambda invoke --function-name my-function --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name $(cat out) --limit 5

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

$ ./get-logs.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" }

ログの削除

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