AWS Lambda는 자동으로 Lambda 함수를 모니터링하고 로그 항목을 Amazon CloudWatch로 보냅니다. Lambda 함수는 함수의 각 인스턴스에 대한 CloudWatch Logs 로그 그룹 및 로그 스트림과 함께 제공됩니다. Lambda 런타임 환경은 각 간접 호출에 대한 세부 정보와 함수 코드의 기타 출력을 로그 스트림으로 전송합니다. CloudWatch Logs에 대한 자세한 내용은 Lambda에서 CloudWatch Logs 사용 섹션을 참조하세요.
함수 코드의 로그를 출력하려면 콘솔 객체stdout
또는 stderr
에 쓰는 로깅 라이브러리를 사용할 수 있습니다.
Sections
로깅 도구 및 라이브러리 사용
Powertools for AWS Lambda(TypeScript)
Lambda 컨텍스트, 콜드 스타트 및 구조 로깅 출력에서 JSON으로 주요 필드 캡처
지시 시 Lambda 호출 이벤트 로깅(기본적으로 비활성화됨)
로그 샘플링을 통해 호출 비율에 대해서만 모든 로그 인쇄(기본적으로 비활성화됨)
언제든지 구조화된 로그에 추가 키 추가
사용자 지정 로그 포맷터(Bring Your Own Formatter)를 사용하여 조직의 로깅 RFC와 호환되는 구조로 로그 출력
구조화된 로깅에 Powertools for AWS Lambda(TypeScript) 및 AWS SAM 사용
다음 단계에 따라 AWS SAM을 사용하는 통합 Powertools for AWS Lambda(TypeScript)hello world
메시지를 반환합니다.
사전 조건
이 섹션의 단계를 완료하려면 다음이 필요합니다.
-
Node.js 18.x 이상
-
AWS SAM CLI 버전 1.75 이상. 이전 버전의 AWS SAM CLI가 있는 경우 AWS SAM CLI 업그레이드를 참조하세요.
샘플 AWS SAM 애플리케이션 배포
-
Hello World TypeScript 템플릿을 사용하여 애플리케이션을 초기화합니다.
sam init --app-template hello-world-powertools-typescript --name sam-app --package-type Zip --runtime nodejs18.x
-
앱을 빌드합니다.
cd sam-app && sam build
-
앱을 배포합니다.
sam deploy --guided
-
화면에 표시되는 프롬프트를 따릅니다. 대화형 환경에서 제공되는 기본 옵션을 수락하려면
Enter
을 누릅니다.참고
HelloWorldFunction에 권한 부여가 정의되어 있지 않을 수 있습니다. 괜찮습니다?에 대해
y
를 입력합니다. -
배포된 애플리케이션의 URL을 가져옵니다.
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
API 엔드포인트 호출:
curl
<URL_FROM_PREVIOUS_STEP>
성공하면 다음과 같은 결과가 응답됩니다.
{"message":"hello world"}
-
함수에 대한 로그를 가져오려면 sam logs를 실행합니다. 자세한 내용은 AWS Serverless Application Model 개발자 안내서에서 로그 관련 작업을 참조하세요.
sam logs --stack-name sam-app
출력은 다음과 같습니다.
2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.552000 START RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Version: $LATEST 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.594000 2022-08-31T09:33:10.557Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390556,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[{"Name":"ColdStart","Unit":"Count"}]}]},"service":"helloWorld","ColdStart":1} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.595000 2022-08-31T09:33:10.595Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"level":"INFO","message":"This is an INFO log - sending HTTP 200 - hello world response","service":"helloWorld","timestamp":"2022-08-31T09:33:10.594Z"} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.655000 2022-08-31T09:33:10.655Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390655,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[]}]},"service":"helloWorld"} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.754000 END RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.754000 REPORT RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Duration: 201.55 ms Billed Duration: 202 ms Memory Size: 128 MB Max Memory Used: 66 MB Init Duration: 252.42 ms XRAY TraceId: 1-630f2ad5-1de22b6d29a658a466e7ecf5 SegmentId: 567c116658fbf11a Sampled: true
-
이는 인터넷을 통해 액세스할 수 있는 퍼블릭 API 엔드포인트입니다. 테스트 후에는 엔드포인트를 삭제하는 것이 좋습니다.
sam delete
로그 보존 관리
함수를 삭제해도 로그 그룹이 자동으로 삭제되지 않습니다. 로그를 무기한 저장하지 않으려면 로그 그룹을 삭제하거나 경과 후 CloudWatch가 로그를 자동으로 삭제하는 보존 기간을 구성하세요. 로그 보존을 설정하려면 AWS SAM 템플릿에 다음을 추가합니다.
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
# Omitting other properties
LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}"
RetentionInDays: 7
구조화된 로깅에 Powertools for AWS Lambda(TypeScript) 및 AWS CDK 사용
다음 단계에 따라 AWS CDK을 사용하는 통합 Powertools for AWS Lambda(TypeScript)hello world
메시지를 반환합니다.
사전 조건
이 섹션의 단계를 완료하려면 다음이 필요합니다.
-
Node.js 18.x 이상
-
AWS SAM CLI 버전 1.75 이상. 이전 버전의 AWS SAM CLI가 있는 경우 AWS SAM CLI 업그레이드를 참조하세요.
샘플 AWS CDK 애플리케이션 배포
-
새 애플리케이션용 프로젝트 디렉터리를 생성합니다.
mkdir hello-world cd hello-world
-
앱을 초기화합니다.
cdk init app --language typescript
-
@types/aws-lambda
패키지를 개발 종속성으로 추가합니다. npm install -D @types/aws-lambda
-
Powertools Logger 유틸리티
를 설치합니다. npm install @aws-lambda-powertools/logger
-
lib 디렉터리를 엽니다. hello-world-stack.ts라는 이름의 파일이 있어야 합니다. 이 디렉터리에 hello-world.function.ts와 hello-world.ts하는 2개의 새 파일을 만듭니다.
-
hello-world.function.ts를 열고 파일에 다음 코드를 추가합니다. Lambda 함수의 코드입니다.
import { APIGatewayEvent, APIGatewayProxyResult, Context } from 'aws-lambda'; import { Logger } from '@aws-lambda-powertools/logger'; const logger = new Logger(); export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { logger.info('This is an INFO log - sending HTTP 200 - hello world response'); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
-
hello-world.ts를 열고 파일에 다음 코드를 추가합니다. 여기에는 Lambda 함수를 생성하고, Powertools용 환경 변수를 구성하고, 로그 보존을 1주일로 설정하는 NodeJSFunction 구성체가 포함됩니다. 또한 REST API를 생성하는 LambdaRestAPI 구성체도 포함되어 있습니다.
import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; import { RetentionDays } from 'aws-cdk-lib/aws-logs'; import { CfnOutput } from 'aws-cdk-lib'; export class HelloWorld extends Construct { constructor(scope: Construct, id: string) { super(scope, id); const helloFunction = new NodejsFunction(this, 'function', { environment: { Powertools_SERVICE_NAME: 'helloWorld', LOG_LEVEL: 'INFO', }, logRetention: RetentionDays.ONE_WEEK, }); const api = new LambdaRestApi(this, 'apigw', { handler: helloFunction, }); new CfnOutput(this, 'apiUrl', { exportName: 'apiUrl', value: api.url, }); } }
-
hello-world-stack.ts를 엽니다. 이 코드는 AWS CDK 스택을 정의하는 코드입니다. 코드를 다음으로 바꿉니다.
import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { HelloWorld } from './hello-world'; export class HelloWorldStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new HelloWorld(this, 'hello-world'); } }
-
프로젝트 디렉터리로 돌아갑니다.
cd hello-world
-
애플리케이션 배포
cdk deploy
-
배포된 애플리케이션의 URL을 가져옵니다.
aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?ExportName==`apiUrl`].OutputValue' --output text
-
API 엔드포인트 호출:
curl
<URL_FROM_PREVIOUS_STEP>
성공하면 다음과 같은 결과가 응답됩니다.
{"message":"hello world"}
-
함수에 대한 로그를 가져오려면 sam logs를 실행합니다. 자세한 내용은 AWS Serverless Application Model 개발자 안내서에서 로그 관련 작업을 참조하세요.
sam logs --stack-name HelloWorldStack
출력은 다음과 같습니다.
2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.047000 START RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Version: $LATEST 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.050000 { "level": "INFO", "message": "This is an INFO log - sending HTTP 200 - hello world response", "service": "helloWorld", "timestamp": "2022-08-31T14:48:37.048Z", "xray_trace_id": "1-630f74c4-2b080cf77680a04f2362bcf2" } 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.082000 END RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.082000 REPORT RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Duration: 34.60 ms Billed Duration: 35 ms Memory Size: 128 MB Max Memory Used: 57 MB Init Duration: 173.48 ms
-
이는 인터넷을 통해 액세스할 수 있는 퍼블릭 API 엔드포인트입니다. 테스트 후에는 엔드포인트를 삭제하는 것이 좋습니다.
cdk destroy
Lambda 콘솔에서 로그 보기
Lambda 함수를 호출한 후 Lambda 콘솔을 사용하여 로그 출력을 볼 수 있습니다.
포함된 코드 편집기에서 코드를 테스트할 수 있는 경우 실행 결과에서 로그를 찾을 수 있습니다. 콘솔 테스트 기능을 사용하여 함수를 간접적으로 호출하면 세부 정보 섹션에서 로그 출력을 찾을 수 있습니다.
CloudWatch 콘솔에서 로그 보기
Amazon CloudWatch 콘솔을 사용하여 모든 Lambda 함수 호출에 대한 로그를 볼 수 있습니다.
CloudWatch 콘솔에서 로그를 보려면
-
CloudWatch 콘솔에서 로그 그룹 페이지
를 엽니다. -
함수(/aws/lambda/
your-function-name
)에 대한 로그 그룹을 선택합니다. -
로그 스트림을 선택합니다.
각 로그 스트림은 함수의 인스턴스에 해당합니다. 로그 스트림은 Lambda 함수를 업데이트할 때, 그리고 여러 동시 호출을 처리하기 위해 추가 인스턴스가 생성될 때 나타납니다. 특정 호출에 대한 로그를 찾으려면 AWS X-Ray로 함수를 계측하는 것이 좋습니다. X-Ray는 요청 및 로그 스트림에 대한 세부 정보를 기록합니다.