AWS Lambda 함수 로깅(C#) - AWS Lambda

AWS Lambda 함수 로깅(C#)

Lambda 함수는 CloudWatch Logs 로그 그룹과 함께 제공되며, 함수의 각 인스턴스에 대한 로그 스트림을 포함합니다. 런타임은 각 호출에 관한 세부 정보를 로그 스트림에 전송하며, 함수 코드에서 로그 및 그 외 출력을 중계합니다.

함수 코드의 로그를 출력하려면 콘솔 클래스에서 메서드를 사용하거나, stdout 또는 stderr에 쓰는 로깅 라이브러리를 사용합니다. 다음 예제에서는 Amazon.Lambda.Core 라이브러리의 LambdaLogger 클래스를 사용합니다.

src/blank-csharp/Function.cs – 로깅

public async Task<AccountUsage> FunctionHandler(SQSEvent invocationEvent, ILambdaContext context) { GetAccountSettingsResponse accountSettings; try { accountSettings = await callLambda(); } catch (AmazonLambdaException ex) { throw ex; } AccountUsage accountUsage = accountSettings.AccountUsage; LambdaLogger.Log("ENVIRONMENT VARIABLES: " + JsonConvert.SerializeObject(System.Environment.GetEnvironmentVariables())); LambdaLogger.Log("CONTEXT: " + JsonConvert.SerializeObject(context)); LambdaLogger.Log("EVENT: " + JsonConvert.SerializeObject(invocationEvent)); return accountUsage; }

예 로그 형식

START RequestId: d1cf0ccb-xmpl-46e6-950d-04c96c9b1c5d Version: $LATEST ENVIRONMENT VARIABLES: { "AWS_EXECUTION_ENV": "AWS_Lambda_dotnetcore2.1", "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "256", "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/blank-csharp-function-WU56XMPLV2XA", "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST", "AWS_LAMBDA_LOG_STREAM_NAME": "2020/03/27/[$LATEST]5296xmpl084f411d9fb73b258393f30c", "AWS_LAMBDA_FUNCTION_NAME": "blank-csharp-function-WU56XMPLV2XA", ... EVENT: { "Records": [ { "MessageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", "ReceiptHandle": "MessageReceiptHandle", "Body": "Hello from SQS!", "Md5OfBody": "7b270e59b47ff90a553787216d55d91d", "Md5OfMessageAttributes": null, "EventSourceArn": "arn:aws:sqs:us-west-2:123456789012:MyQueue", "EventSource": "aws:sqs", "AwsRegion": "us-west-2", "Attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1523232000000", "SenderId": "123456789012", "ApproximateFirstReceiveTimestamp": "1523232000001" }, ... END RequestId: d1cf0ccb-xmpl-46e6-950d-04c96c9b1c5d REPORT RequestId: d1cf0ccb-xmpl-46e6-950d-04c96c9b1c5d Duration: 4157.16 ms Billed Duration: 4200 ms Memory Size: 256 MB Max Memory Used: 99 MB Init Duration: 841.60 ms XRAY TraceId: 1-5e7e8131-7ff0xmpl32bfb31045d0a3bb SegmentId: 0152xmpl6016310f Sampled: true

.NET 런타임은 각 호출에 대해 START, ENDREPORT 줄을 로깅합니다. 보고서 행은 다음과 같은 세부 정보를 제공합니다.

보고서 로그

  • RequestId – 호출의 고유한 요청 ID입니다.

  • 지속시간 – 함수의 핸들러 메서드가 이벤트를 처리하는 데 걸린 시간입니다.

  • 청구 기간 – 호출에 대해 청구된 시간입니다.

  • 메모리 크기– 함수에 할당된 메모리 양입니다.

  • 사용된 최대 메모리 – 함수에서 사용한 메모리 양입니다.

  • 초기화 기간 – 제공된 첫 번째 요청의 경우 런타임이 핸들러 메서드 외부에서 함수를 로드하고 코드를 실행하는 데 걸린 시간입니다.

  • XRAY TraceId – 추적된 요청의 경우 AWS X-Ray 추적 ID입니다.

  • 세그먼트 ID – 추적된 요청의 경우 X-Ray 세그먼트 ID입니다.

  • 샘플링 – 추적된 요청의 경우 샘플링 결과입니다.

Lambda 콘솔, CloudWatch Logs 콘솔 또는 명령줄에서 로그를 볼 수 있습니다.

AWS Management 콘솔에서 로그 보기

함수 구성 페이지에서 함수를 테스트할 때 Lambda 콘솔에 로그 출력이 표시됩니다. 모든 호출에 대한 로그를 보려면 CloudWatch Logs 콘솔을 사용합니다.

Lambda 함수의 로그를 보려면

  1. CloudWatch 콘솔의 로그 페이지를 엽니다.

  2. 함수(/aws/lambda/function-name)에 대한 로그 그룹을 선택합니다.

  3. 목록에서 첫 번째 스트림을 선택합니다.

각 로그 스트림은 함수의 인스턴스에 해당합니다. 새 스트림은 함수를 업데이트할 때, 그리고 여러 동시 호출을 처리하기 위해 추가 인스턴스가 생성될 때 나타납니다. 특정 호출에 대한 로그를 찾으려면 X-Ray로 함수를 계측하고 추적의 요청 및 로그 스트림에 대한 세부 정보를 기록합니다. 로그 및 추적을 X-Ray와 상호 연관시키는 샘플 애플리케이션의 경우 AWS Lambda용 오류 처리자 샘플 애플리케이션 단원을 참조하십시오.

AWS CLI 사용

명령줄에서 호출에 대한 로그를 가져오려면 --log-type 옵션을 사용하십시오. 호출에서 base64로 인코딩된 로그를 최대 4KB까지 포함하는 LogResult 필드가 응답에 포함됩니다.

$ 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 및 Ubuntu on Windows에서 사용할 수 있습니다. 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" }

로그 삭제

함수를 삭제해도 로그 그룹이 자동으로 삭제되지 않습니다. 로그를 무기한 저장하지 않으려면 로그 그룹을 삭제하거나 로그가 자동으로 삭제되는 보존 기간을 구성하십시오.