Go Lambda 함수 로깅·모니터링하기

Go Lambda 함수 로깅·모니터링하기 (Log and monitor Go Lambda functions)

AWS Lambda는 사용자를 대신해 Lambda 함수를 자동으로 모니터링하고 로그를 Amazon CloudWatch로 보내요. Lambda 함수에는 CloudWatch Logs 로그 그룹과 함수 인스턴스마다 로그 스트림이 있어요. Lambda 런타임 환경은 각 호출에 대한 세부 정보를 로그 스트림으로 보내고, 함수 코드의 로그와 기타 출력도 전달해요.

이 페이지는 Lambda 함수 코드에서 로그 출력을 만들고 AWS Command Line Interface, Lambda 콘솔, 또는 CloudWatch 콘솔로 로그에 접근하는 방법을 설명해요.

출처: AWS Lambda 개발자 안내서

본문

로그를 반환하는 함수 만들기

함수 코드에서 로그를 출력하려면 fmt 패키지의 메서드나, stdout·stderr에 쓰는 로깅 라이브러리를 사용할 수 있어요. 다음 예시는 log 패키지를 사용해요.

예제 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: 243 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 런타임은 각 호출에 대해 START, END, REPORT 줄을 기록해요. REPORT 줄은 다음 세부 정보를 제공해요.

REPORT 줄 데이터 필드

  • RequestId – 호출의 고유 요청 ID예요.
  • Duration – 함수의 핸들러 메서드가 이벤트를 처리하는 데 쓴 시간이에요.
  • Billed Duration – 호출에 대해 청구된 시간이에요.
  • Memory Size – 함수에 할당된 메모리 양이에요.
  • Max Memory Used – 함수가 사용한 메모리 양이에요. 호출이 실행 환경을 공유하면 Lambda는 모든 호출에 걸친 최대 사용 메모리를 보고해요. 이 동작으로 보고되는 값이 예상보다 높을 수 있어요.
  • Init Duration – 첫 번째 요청에 대해 런타임이 함수를 로드하고 핸들러 메서드 밖의 코드를 실행하는 데 걸린 시간이에요.
  • XRAY TraceId – 추적된 요청의 AWS X-Ray 트레이스 ID예요.
  • SegmentId – 추적된 요청의 X-Ray 세그먼트 ID예요.
  • Sampled – 추적된 요청의 샘플링 결과예요.

Lambda 콘솔에서 로그 보기

Lambda 콘솔로 Lambda 함수를 호출한 후 로그 출력을 볼 수 있어요. 코드가 임베디드 Code 편집기에서 테스트 가능하다면 실행 결과에서 로그를 찾을 수 있어요. 콘솔 테스트 기능으로 함수를 호출하면 Details 섹션에서 Log output을 찾을 수 있어요.

CloudWatch 콘솔에서 로그 보기

Amazon CloudWatch 콘솔로 모든 Lambda 함수 호출의 로그를 볼 수 있어요.

CloudWatch 콘솔에서 로그를 보려면

  1. CloudWatch 콘솔에서 Log groups 페이지를 엽니다.
  2. 함수의 로그 그룹(/aws/lambda/your-function-name)을 선택합니다.
  3. 로그 스트림을 선택합니다.

각 로그 스트림은 함수의 인스턴스 하나에 해당해요. 로그 스트림은 Lambda 함수를 업데이트할 때와 동시 호출을 처리하기 위해 추가 인스턴스가 생성될 때 나타나요. 특정 호출의 로그를 찾으려면 AWS X-Ray로 함수를 계측할 것을 권장해요. X-Ray는 트레이스에 요청과 로그 스트림에 대한 세부 정보를 기록해요.

AWS Command Line Interface(AWS CLI)로 로그 보기

AWS CLI는 명령줄 셸의 명령으로 AWS 서비스와 상호작용할 수 있는 오픈소스 도구예요. 이 섹션의 단계를 완료하려면 AWS CLI 버전 2가 있어야 해요.

AWS CLI로 --log-type 명령 옵션을 사용해 호출의 로그를 검색할 수 있어요. 응답에는 호출에서 최대 4KB의 base64로 인코딩된 로그가 담긴 LogResult 필드가 포함돼요.

예제 — 로그 ID 검색

다음 예시는 my-function이라는 함수의 LogResult 필드에서 로그 ID를 검색하는 방법을 보여줘요.

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 --cli-binary-format raw-in-base64-out | base64 --decode

다음과 같은 출력이 보여야 해요.

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: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB

base64 유틸리티는 Linux, macOS, Ubuntu on Windows에서 사용할 수 있어요. macOS 사용자는 base64 -D가 필요할 수 있어요.

예제 get-logs.sh 스크립트

같은 명령 프롬프트에서 다음 스크립트를 사용해 마지막 5개의 로그 이벤트를 다운로드해요. 스크립트는 sed로 출력 파일에서 따옴표를 제거하고, 로그가 사용 가능해질 시간을 주기 위해 15초 동안 sleep해요. 출력에는 Lambda의 응답과 get-log-events 명령의 출력이 포함돼요. 이 코드 샘플의 내용을 복사해 Lambda 프로젝트 디렉토리에 get-logs.sh로 저장하세요.

#!/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --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 stream1 --limit 5

예제 — macOS와 Linux(전용)

같은 명령 프롬프트에서 macOS·Linux 사용자는 스크립트가 실행 가능하도록 다음 명령을 실행해야 할 수 있어요.

chmod -R 755 get-logs.sh

예제 — 마지막 5개 로그 이벤트 검색

같은 명령 프롬프트에서 다음 스크립트를 실행해 마지막 5개 로그 이벤트를 가져와요.

./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: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}

로그 삭제

로그 그룹은 함수를 삭제해도 자동으로 삭제되지 않아요. 로그를 무기한 저장하지 않으려면 로그 그룹을 삭제하거나, 로그가 자동으로 삭제되는 보존 기간을 구성하세요.

더 알아보기 (Learn more)