PowerShell Lambda 함수 로그 및 모니터링

PowerShell Lambda 함수 로그 및 모니터링 (Log and monitor Powershell Lambda functions)

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

이 페이지는 Lambda 함수 코드에서 로그 출력을 생성하고 AWS Command Line Interface, Lambda 콘솔 또는 CloudWatch 콘솔을 사용해 로그에 액세스하는 방법을 설명합니다.

출처: AWS Lambda 개발자 안내서

본문

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

함수 코드에서 로그를 출력하려면 Microsoft.PowerShell.Utility의 cmdlet 또는 stdout이나 stderr에 쓰는 로깅 모듈을 사용할 수 있습니다. 다음 예제는 Write-Host를 사용합니다.

예시 function/Handler.ps1 – 로깅:

#Requires -Modules @{ModuleName='AWSPowerShell.NetCore';ModuleVersion='3.3.618.0'}
Write-Host `## Environment variables
Write-Host AWS_LAMBDA_FUNCTION_VERSION=$Env:AWS_LAMBDA_FUNCTION_VERSION
Write-Host AWS_LAMBDA_LOG_GROUP_NAME=$Env:AWS_LAMBDA_LOG_GROUP_NAME
Write-Host AWS_LAMBDA_LOG_STREAM_NAME=$Env:AWS_LAMBDA_LOG_STREAM_NAME
Write-Host AWS_EXECUTION_ENV=$Env:AWS_EXECUTION_ENV
Write-Host AWS_LAMBDA_FUNCTION_NAME=$Env:AWS_LAMBDA_FUNCTION_NAME
Write-Host PATH=$Env:PATH
Write-Host `## Event
Write-Host (ConvertTo-Json -InputObject $LambdaInput -Compress -Depth 3)

로그 형식 예시:

START RequestId: 56639408-xmpl-435f-9041-ac47ae25ceed Version: $LATEST
Importing module ./Modules/AWSPowerShell.NetCore/3.3.618.0/AWSPowerShell.NetCore.psd1
[Information] - ## Environment variables
[Information] - AWS_LAMBDA_FUNCTION_VERSION=$LATEST
[Information] - AWS_LAMBDA_LOG_GROUP_NAME=/aws/lambda/blank-powershell-function-18CIXMPLHFAJJ
[Information] - AWS_LAMBDA_LOG_STREAM_NAME=2020/04/01/[$LATEST]53c5xmpl52d64ed3a744724d9c201089
[Information] - AWS_EXECUTION_ENV=AWS_Lambda_dotnet6_powershell_1.0.0
[Information] - AWS_LAMBDA_FUNCTION_NAME=blank-powershell-function-18CIXMPLHFAJJ
[Information] - PATH=/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin
[Information] - ## Event
[Information] -
{
    "Records": [
        {
            "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
            "receiptHandle": "MessageReceiptHandle",
            "body": "Hello from SQS!",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1523232000000",
                "SenderId": "123456789012",
                "ApproximateFirstReceiveTimestamp": "1523232000001"
            },
            ...
END RequestId: 56639408-xmpl-435f-9041-ac47ae25ceed
REPORT RequestId: 56639408-xmpl-435f-9041-ac47ae25ceed	Duration: 3906.38 ms	Billed Duration: 9867 ms	Memory Size: 512 MB	Max Memory Used: 367 MB	Init Duration: 5960.19 ms
XRAY TraceId: 1-5e843da6-733cxmple7d0c3c020510040	SegmentId: 3913xmpl20999446	Sampled: true

.NET 런타임은 각 호출에 대해 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 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 유틸리티를 사용해 로그를 디코딩합니다. 다음 예제는 my-function의 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

AWS CLI 버전 2를 사용하는 경우 cli-binary-format 옵션이 필요합니다. 기본 설정으로 만들려면 aws configure set cli-binary-format raw-in-base64-out을 실행하세요. 자세한 내용은 AWS Command Line Interface User Guide for Version 2의 AWS CLI 지원 글로벌 명령줄 옵션을 참조하세요.

다음과 같은 출력이 표시되어야 합니다:

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, Windows의 Ubuntu에서 사용할 수 있습니다. macOS 사용자는 base64 -D를 사용해야 할 수 있습니다.

get-logs.sh 스크립트 예시:

같은 명령 프롬프트에서 다음 스크립트를 사용해 마지막 5개 로그 이벤트를 다운로드합니다. 스크립트는 sed를 사용해 출력 파일에서 따옴표를 제거하고, 로그를 사용할 수 있게 될 시간을 주기 위해 15초간 대기합니다. 출력에는 Lambda의 응답과 get-log-events 명령의 출력이 포함됩니다.

다음 코드 샘플 내용을 복사해 Lambda 프로젝트 디렉터리에 get-logs.sh로 저장합니다.

AWS CLI 버전 2를 사용하는 경우 cli-binary-format 옵션이 필요합니다. 기본 설정으로 만들려면 aws configure set cli-binary-format raw-in-base64-out을 실행하세요. 자세한 내용은 AWS Command Line Interface User Guide for Version 2의 AWS CLI 지원 글로벌 명령줄 옵션을 참조하세요.

#!/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)

  • Lambda 고급 로깅 제어
  • PowerShell Lambda 함수
  • CloudWatch Logs 모니터링