Amazon CloudWatch 로그를 다음과 같이 사용하기 AWS Lambda - AWS Lambda

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon CloudWatch 로그를 다음과 같이 사용하기 AWS Lambda

AWS Lambda은 자동으로 Lambda 함수를 모니터링하여 함수의 장애 문제를 해결하는 데 도움이 됩니다. 함수의 실행 역할에 필요한 권한이 있는 한, Lambda는 함수가 처리하는 모든 요청에 대한 로그를 캡처하여 Amazon Logs로 보냅니다. CloudWatch

코드에 로깅 문을 삽입하여 코드가 예상대로 작동하는지 확인할 수 있습니다. Lambda는 CloudWatch Logs와 자동으로 통합되고 코드의 모든 로그를 Lambda 함수와 연결된 로그 그룹으로 전송합니다. CloudWatch

기본적으로 Lambda는 /aws/lambda/<function name>라는 로그 그룹에 로그를 전송합니다. 함수가 로그를 다른 그룹으로 전송하도록 하려면 Lambda 콘솔, AWS Command Line Interface(AWS CLI) 또는 Lambda API를 사용하여 이를 구성할 수 있습니다. 자세한 내용은 로그 그룹 구성 CloudWatch 섹션을 참조하세요.

Lambda 콘솔, 콘솔, CloudWatch () 또는 API를 사용하여 Lambda 함수에 대한 로그를 볼 수 있습니다. AWS Command Line Interface AWS CLI CloudWatch

참고

함수 호출 후 로그가 표시되는 데 5~10분 정도 걸릴 수 있습니다.

사전 조건

실행 역할에는 로그를 Logs에 업로드할 권한이 필요합니다. CloudWatch Lambda에서 제공하는 AWSLambdaBasicExecutionRole AWS 관리형 정책을 사용하여 CloudWatch 로그 권한을 추가할 수 있습니다. 이 정책을 역할에 추가하려면 다음 명령을 실행합니다.

aws iam attach-role-policy --role-name your-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

자세한 설명은 Lambda 기능에 대한 AWS 관리형 정책 섹션을 참조하세요.

요금

Lambda 로그 사용에 대한 추가 요금은 없지만 CloudWatch 표준 로그 요금이 적용됩니다. 자세한 내용은 요금을 참조하십시오CloudWatch .

Lambda 함수에 대한 고급 로깅 제어 구성

함수의 로그를 캡처, 처리 및 사용하는 방법을 더 잘 제어할 수 있도록 Lambda는 다음과 같은 로깅 구성 옵션을 제공합니다.

  • 로그 형식 - 함수 로그의 경우 일반 텍스트와 구조화된 JSON 형식 중에서 선택

  • 로그 수준 - JSON 구조 로그의 경우 Lambda가 전송하는 로그의 세부 수준 (예: 오류, 디버그 또는 정보) CloudWatch 을 선택합니다.

  • 로그 그룹 - 함수가 CloudWatch 로그를 전송하는 로그 그룹을 선택합니다.

JSON 및 일반 텍스트 로그 형식 구성

로그 출력을 JSON 키 값 쌍으로 캡처하면 함수를 디버깅할 때 더 쉽게 검색하고 필터링할 수 있습니다. JSON 형식의 로그를 사용하면 로그에 태그와 컨텍스트 정보를 추가할 수도 있습니다. 이를 통해 대량의 로그 데이터를 자동으로 분석할 수 있습니다. 개발 워크플로가 Lambda 로그를 일반 텍스트로 사용하는 기존 도구를 사용하지 않는 한, 로그 형식으로 JSON을 선택하는 것이 좋습니다.

모든 Lambda 관리형 런타임의 경우 함수의 시스템 로그를 비정형 일반 텍스트 또는 JSON 형식으로 CloudWatch Logs에 보낼지 선택할 수 있습니다. 시스템 로그는 Lambda가 생성하는 로그이며 플랫폼 이벤트 로그라고도 합니다.

지원되는 런타임의 경우, 지원되는 내장 로깅 방법 중 하나를 사용하면 Lambda는 함수의 애플리케이션 로그(함수 코드가 생성하는 로그)를 구조화된 JSON 형식으로 출력할 수도 있습니다. 이러한 런타임에 대해 함수의 로그 형식을 구성할 때 선택한 구성이 시스템 및 애플리케이션 로그 모두에 적용됩니다.

지원되는 런타임의 경우 함수가 지원되는 로깅 라이브러리 또는 메서드를 사용하는 경우 구조화된 JSON으로 로그를 캡처하기 위해 Lambda의 기존 코드를 변경할 필요가 없습니다.

참고

JSON 로그 형식을 사용하면 메타데이터가 추가되고 로그 메시지가 일련의 키 값 쌍을 포함하는 JSON 객체로 인코딩됩니다. 이로 인해 함수의 로그 메시지 크기가 커질 수 있습니다.

지원되는 런타임 및 로깅 메서드

Lambda는 현재 다음 런타임에 대해 JSON 구조화된 애플리케이션 로그를 출력하는 옵션을 지원합니다.

런타임 지원되는 버전
Java Amazon Linux 1에서 Java 8을 제외한 모든 Java 런타임
Node.js Node.js 16 이상
Python Python 3.7 이상

Lambda가 함수의 애플리케이션 로그를 CloudWatch 구조화된 JSON 형식으로 전송하려면 함수가 다음과 같은 내장 로깅 도구를 사용하여 로그를 출력해야 합니다.

  • Java - LambdaLogger 로거 또는 Log4j2

  • Node.js - 콘솔 메서드console.trace, console.debug, console.log, console.info, console.errorconsole.warn

  • Python - 표준 Python logging 라이브러리

지원되는 런타임으로 고급 로깅 컨트롤을 사용하는 방법에 대한 자세한 내용은 AWS Lambda 함수 로깅(Java), AWS Lambda 함수 로깅(Node.js)AWS Lambda 함수 로깅(Python)을 참조하십시오.

다른 관리형 Lambda 런타임의 경우, Lambda는 현재 구조화된 JSON 형식의 시스템 로그 캡처만 기본적으로 지원합니다. 하지만 JSON 형식의 로그 출력 출력에 대해 AWS Lambda용 Powertools와 같은 로깅 도구를 사용하면 모든 런타임에서 구조화된 JSON 형식으로 애플리케이션 로그를 캡처할 수 있습니다.

기본 로그 형식

현재 모든 Lambda 런타임의 기본 로그 형식은 일반 텍스트입니다.

이미 AWS Lambda용 Powertools과 같은 로깅 라이브러리를 사용하여 함수 로그를 JSON 구조 형식으로 생성하고 있다면 JSON 로그 형식 지정을 선택하면 코드를 변경할 필요가 없습니다. Lambda는 이미 JSON으로 인코딩된 로그를 이중 인코딩하지 않으므로 함수의 애플리케이션 로그는 이전과 같이 계속 캡처됩니다.

시스템 로그의 JSON 형식

함수의 로그 형식을 JSON으로 구성하면 각 시스템 로그 항목(플랫폼 이벤트)이 다음 키가 있는 키 값 쌍을 포함하는 JSON 객체로 캡처됩니다.

  • "time" - 로그 메시지가 생성된 시간

  • "type" - 로그되는 이벤트 유형

  • "record" - 로그 출력 내용

"record" 값 형식은 로그되는 이벤트 유형에 따라 달라집니다. 자세한 내용은 텔레메트리 API Event 객체 유형 섹션을 참조하세요. 시스템 로그 이벤트에 할당된 로그 수준에 대한 자세한 내용은 시스템 로그 수준 이벤트 매핑을 참조하세요.

비교를 위해 다음 두 예제는 일반 텍스트 형식과 구조화된 JSON 형식 모두에서 동일한 로그 출력을 보여줍니다. 대부분의 경우 시스템 로그 이벤트는 JSON 형식으로 출력할 때 일반 텍스트로 출력할 때보다 더 많은 정보를 포함합니다.

예 일반 텍스트
2023-03-13 18:56:24.046000 fbe8c1 INIT_START Runtime Version: python:3.9.v18 Runtime Version ARN: arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0
예 구조화된 JSON
{ "time": "2023-03-13T18:56:24.046Z", "type": "platform.initStart", "record": { "initializationType": "on-demand", "phase": "init", "runtimeVersion": "python:3.9.v18", "runtimeVersionArn": "arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0" } }
참고

Lambda 텔레메트리 API은 항상 JSON 형식으로 STARTREPORT 등의 플랫폼 이벤트를 방출합니다. Lambda가 보내는 시스템 로그의 형식을 구성해도 Lambda 텔레메트리 CloudWatch API 동작에는 영향을 주지 않습니다.

애플리케이션 로그의 JSON 형식

함수의 로그 형식을 JSON으로 구성하면 지원되는 로깅 라이브러리 및 메서드를 사용하여 작성된 애플리케이션 로그 출력이 다음 키와 함께 키 값 페어를 포함하는 JSON 객체로 캡처됩니다.

  • "timestamp" - 로그 메시지가 생성된 시간

  • "level" - 메시지에 할당된 로그 수준

  • "message" - 로그 메시지의 내용

  • "requestId"(Python 및 Node.js) 또는 "AWSrequestId"(Java) - 함수 간접 호출을 위한 고유한 요청 ID

함수에서 사용하는 런타임 및 로깅 방법에 따라 이 JSON 객체에 추가 키 페어가 포함될 수도 있습니다. 예를 들어 Node.js에서 함수가 console 메서드를 통해 여러 인수를 사용하여 오류 객체를 기록하는 경우 JSON 객체에는 키 errorMessage, errorType, stackTrace와 함께 추가 키 값 페어가 포함됩니다. 다양한 Lambda 런타임에서 JSON 형식 로그에 대한 자세한 내용은 AWS Lambda 함수 로깅(Python), AWS Lambda 함수 로깅(Node.js), AWS Lambda 함수 로깅(Java) 섹션을 참조하세요.

참고

Lambda가 타임스탬프 값에 사용하는 키는 시스템 로그와 애플리케이션 로그마다 다릅니다. 시스템 로그의 경우 Lambda는 "time" 키를 사용하여 텔레메트리 API와의 일관성을 유지합니다. 애플리케이션 로그의 경우 Lambda는 지원되는 런타임 의 규칙을 따르며 "timestamp"를 사용합니다.

비교를 위해 다음 두 예제는 일반 텍스트 형식과 구조화된 JSON 형식 모두에서 동일한 로그 출력을 보여줍니다.

예 일반 텍스트
2023-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
예 구조화된 JSON
{ "timestamp":"2023-10-27T19:17:45.586Z", "level":"INFO", "message":"some log message", "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189" }

함수의 로그 형식 설정

함수의 로그 형식을 구성하려면 Lambda 콘솔 또는 AWS Command Line Interface(AWS CLI)을 사용할 수 있습니다. 및 UpdateFunctionConfigurationLambda API 명령, AWS Serverless Application Model AWS SAM (AWS::Serverless::Function) 리소스 CreateFunction및 리소스를 사용하여 함수의 로그 형식을 구성할 수도 있습니다. AWS CloudFormation AWS::Lambda::Function

함수의 로그 형식을 변경해도 Logs에 CloudWatch 저장된 기존 로그에는 영향을 주지 않습니다. 새 로그만 업데이트된 형식을 사용합니다.

함수의 로그 형식을 JSON으로 변경하고 로그 수준을 설정하지 않으면 Lambda는 함수의 애플리케이션 로그 수준과 시스템 로그 수준을 정보로 자동 설정합니다. 즉, Lambda는 INFO 수준 이하의 로그 출력만 Logs로 전송합니다. CloudWatch 애플리케이션 및 시스템 로그 수준 필터링에 대한 자세한 내용은 로그 수준 필터링 섹션을 참조하세요.

참고

Python 런타임의 경우 함수의 로그 형식이 일반 텍스트로 설정된 경우 기본 로그 수준 설정은 경고입니다. 즉, Lambda는 WARN 수준 이하의 로그 출력만 Logs로 전송합니다. CloudWatch 함수의 로그 형식을 JSON으로 변경하면 이 기본 동작이 변경됩니다. Python에서 로깅에 대해 자세한 내용은 AWS Lambda 함수 로깅(Python) 섹션을 참조하세요.

임베디드 메트릭 형식 (EMF) 로그를 내보내는 Node.js 함수의 경우 함수의 로그 형식을 JSON으로 변경하면 메트릭을 CloudWatch 인식하지 못할 수 있습니다.

중요

함수가 Powertools for AWS Lambda (TypeScript) 또는 오픈 소스 EMF 클라이언트 라이브러리를 사용하여 EMF 로그를 내보내는 경우 PowertoolsEMF 라이브러리를 최신 버전으로 업데이트하여 로그를 계속 올바르게 파싱할 수 있도록 하십시오. CloudWatch JSON 로그 형식으로 전환하는 경우 함수에 내장된 지표와의 호환성을 확인하기 위한 테스트도 수행하는 것이 좋습니다. EMF 로그를 내보내는 node.js 함수에 대한 자세한 내용은 구조화된 JSON 로그가 포함된 임베디드 메트릭 형식(EMF) 클라이언트 라이브러리 사용을 참조하십시오.

함수의 로그 형식 구성하기(콘솔)
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수 선택

  3. 함수 구성 페이지에서 모니터링 및 작업 도구를 선택합니다.

  4. 로깅 구성 창에서 편집을 선택합니다.

  5. 로그 콘텐츠에서 로그 형식에 대해 텍스트 또는 JSON을 선택합니다.

  6. 저장을 선택합니다.

기존 함수의 로그 형식 변경하기(AWS CLI)
  • 기존 함수의 로그 형식을 변경하려면 update-function-configuration 명령을 사용합니다. LoggingConfig에서 LogFormat 옵션을 JSON 또는 Text로 설정합니다.

    aws lambda update-function-configuration \ --function-name myFunction --logging-config LogFormat=JSON
함수를 생성할 때 로그 형식 설정하기(AWS CLI)
  • 새 함수를 만들 때 로그 형식을 구성하려면 --logging-config 옵션을 create-function 명령에서 사용합니다. LogFormatJSON 또는 Text로 설정합니다. 다음 예제 명령은 Node.js 18 런타임을 사용하여 로그를 구조화된 JSON으로 출력하는 함수를 만듭니다.

    함수를 생성할 때 로그 형식을 지정하지 않으면 Lambda는 선택한 런타임 버전의 기본 로그 형식을 사용합니다. 기본 로깅 형식에 대한 자세한 내용은 기본 로그 형식을 참조하세요.

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --logging-config LogFormat=JSON

로그 수준 필터링

Lambda는 특정 세부 수준 이하의 로그만 Logs로 전송되도록 함수의 로그를 필터링할 수 있습니다. CloudWatch 함수의 시스템 로그(Lambda가 생성하는 로그)와 애플리케이션 로그(함수 코드가 생성하는 로그)에 대해 개별적으로 로그 수준 필터링을 구성할 수 있습니다.

지원되는 런타임 및 로깅 메서드의 경우 함수의 애플리케이션 로그를 필터링하기 위해 Lambda의 함수 코드를 변경할 필요가 없습니다.

다른 모든 런타임 및 로깅 메서드의 경우 함수 코드는 키 "level"과 키 값 쌍을 포함하는 JSON 형식의 객체로 로그 이벤트를 stdout 또는 stderr에 출력해야 합니다. 예를 들어, Lambda는 다음 stdout로의 출력을 DEBUG 수준 로그로 해석합니다.

print('{"level": "debug", "msg": "my debug log", "timestamp": "2023-11-02T16:51:31.587199Z"}')

"level" 값 필드가 유효하지 않거나 누락된 경우 Lambda는 로그 출력에 수준 INFO를 할당합니다. Lambda가 타임스탬프 필드를 사용하려면 유효한 RFC 3339 타임스탬프 형식으로 시간을 지정해야 합니다. 유효한 타임스탬프를 제공하지 않으면 Lambda는 로그에 레벨 INFO를 할당하고 타임스탬프를 추가합니다.

타임스탬프 키의 이름을 지정할 때는 사용 중인 런타임의 규칙을 따르십시오. Lambda는 관리형 런타임에서 사용되는 대부분의 일반적인 명명 규칙을 지원합니다. 예를 들어, .NET 런타임을 사용하는 함수에서 Lambda는 "Timestamp" 키를 인식합니다.

참고

로그 수준 필터링을 사용하려면 함수가 JSON 로그 형식을 사용하도록 구성해야 합니다. 현재 모든 Lambda 관리형 런타임의 기본 로그 형식은 일반 텍스트입니다. 함수의 로그 형식을 JSON으로 구성하는 방법을 알아보려면 함수의 로그 형식 설정을 참조하세요.

애플리케이션 로그(함수 코드로 생성된 로그)의 경우 다음 로그 수준 중에서 선택할 수 있습니다.

로그 수준 표준 사용량
TRACE(최대 세부 정보) 코드 실행 경로를 추적하는 데 사용되는 가장 세밀한 정보
DEBUG 시스템 디버깅에 대한 세부 정보
INFO 함수의 정상 작동을 기록하는 메시지
WARN 해결되지 않을 경우 예상치 못한 동작으로 이어질 수 있는 잠재적 오류에 대한 메시지
ERROR 코드가 예상대로 작동하지 못하게 하는 문제에 대한 메시지
FATAL(최소 세부 정보) 응용 프로그램 작동을 중지시키는 심각한 오류에 대한 메시지

로그 수준을 선택하면 Lambda는 해당 수준 이하의 로그를 Logs로 보냅니다. CloudWatch 예를 들어 함수의 애플리케이션 로그 수준을 WARN으로 설정하면 Lambda는 INFO 및 DEBUG 수준에서 로그 출력을 전송하지 않습니다. 로그 필터링의 기본 애플리케이션 로그 수준은 INFO입니다.

Lambda가 함수의 애플리케이션 로그를 필터링할 때 레벨이 없는 로그 메시지에는 로그 수준 INFO가 할당됩니다.

시스템 로그(Lambda 서비스에서 생성된 로그)의 경우 다음 로그 수준 중에서 선택할 수 있습니다.

로그 수준 사용량
DEBUG(최대 세부 정보) 시스템 디버깅에 대한 세부 정보
INFO 함수의 정상 작동을 기록하는 메시지
WARN(최소 세부 정보) 해결되지 않을 경우 예상치 못한 동작으로 이어질 수 있는 잠재적 오류에 대한 메시지

로그 수준을 선택하면 Lambda는 해당 수준 이하의 로그를 전송합니다. 예를 들어 함수의 시스템 로그 수준을 INFO로 설정하면 Lambda는 DEBUG 수준에서 로그 출력을 전송하지 않습니다.

기본적으로 Lambda는 시스템 로그 레벨을 INFO로 설정합니다. 이 설정을 사용하면 Lambda가 자동으로 "start" 메시지를 "report" 보내고 로깅합니다. CloudWatch 더 많거나 덜 상세한 시스템 로그를 수신하려면 로그 수준을 DEBUG 또는 WARN으로 변경합니다. Lambda가 다양한 시스템 로그 이벤트를 매핑하는 로그 수준 목록을 보려면 시스템 로그 수준 이벤트 매핑을 참조하세요.

로그 수준 필터링 구성

함수에 대한 애플리케이션 및 시스템 로그 수준 필터링을 구성하려면 AWS Command Line Interface(AWS CLI)에서 Lambda 콘솔을 사용할 수 있습니다. 및 UpdateFunctionConfigurationLambda API 명령, AWS Serverless Application Model AWS SAM (AWS::Serverless::Function) 리소스 CreateFunction및 리소스를 사용하여 함수의 로그 수준을 구성할 수도 있습니다. AWS CloudFormation AWS::Lambda::Function

코드에서 함수의 로그 수준을 설정하는 경우 이 설정은 구성된 다른 로그 수준 설정보다 우선합니다. 예를 들어 Python logging setLevel() 메서드를 사용하여 함수의 로깅 수준을 정보로 설정하는 경우 이 설정은 Lambda 콘솔을 사용하여 구성한 경고 설정보다 우선합니다.

기존 함수의 애플리케이션 또는 시스템 로그 수준 구성하기(콘솔)
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 함수 구성 페이지에서 모니터링 및 작업 도구를 선택합니다.

  4. 로깅 구성 창에서 편집을 선택합니다.

  5. 로그 콘텐츠에서 로그 형식에 대해 JSON이 선택되어 있는지 확인합니다.

  6. 라디오 버튼을 사용하여 함수에 대해 원하는 애플리케이션 로그 수준시스템 로그 수준을 선택합니다.

  7. 저장을 선택합니다.

기존 함수의 애플리케이션 또는 시스템 로그 수준 구성하기(AWS CLI)
  • 기존 함수의 애플리케이션 또는 시스템 로그 수준을 변경하려면 update-function-configuration 명령을 사용합니다. --system-log-levelDEBUG, INFO 또는 WARN중 하나로 설정합니다. --application-log-levelDEBUG, INFO WARN, ERROR 또는 FATAL 중 하나로 설정합니다.

    aws lambda update-function-configuration \ --function-name myFunction --system-log-level WARN \ --application-log-level ERROR
함수를 생성할 때 로그 수준 필터링 구성하기
  • 새 함수를 만들 때 로그 수준 필터링을 구성하려면 create-function 명령의 --system-log-level--application-log-level 옵션을 사용합니다. --system-log-levelDEBUG, INFO 또는 WARN중 하나로 설정합니다. --application-log-levelDEBUG, INFO WARN, WARN 또는 FATAL 중 하나로 설정합니다.

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --system-log-level WARN \ --application-log-level ERROR

시스템 로그 수준 이벤트 매핑

Lambda에서 생성된 시스템 수준 로그 이벤트의 경우 다음 표는 각 이벤트에 할당된 로그 수준을 정의합니다. 표에 나열된 이벤트에 대한 자세한 내용은 Lambda 텔레메트리 API Event 스키마 참조를 참조하세요.

이벤트 이름 Condition 지정된 로그 수준
initStart runtimeVersion is set INFO
initStart runtimeVersion is not set DEBUG
initRuntimeDone status=success DEBUG
initRuntimeDone status!=success WARN
initReport initializationType=snapstart INFO
initReport initializationType!=snapstart DEBUG
initReport status!=success WARN
restoreStart runtimeVersion is set INFO
restoreStart runtimeVersion is not set DEBUG
restoreRuntimeDone status=success DEBUG
restoreRuntimeDone status!=success WARN
restoreReport status=success INFO
restoreReport status!=success WARN
시작 - INFO
runtimeDone status=success DEBUG
runtimeDone status!=success WARN
report status=success INFO
report status!=success WARN
extension state=success INFO
extension state!=success WARN
logSubscription - INFO
telemetrySubscription - INFO
logsDropped - WARN
참고

Lambda 텔레메트리 API은 항상 전체 플랫폼 이벤트 세트를 방출합니다. Lambda가 보내는 시스템 로그의 수준을 구성해도 Lambda 텔레메트리 CloudWatch API 동작에는 영향을 미치지 않습니다.

사용자 지정 런타임을 사용한 애플리케이션 로그 수준 필터링

함수에 대한 애플리케이션 로그 레벨 필터링을 구성하면 Lambda는 AWS_LAMBDA_LOG_LEVEL 환경 변수를 사용하여 백그라운드에서 애플리케이션 로그 레벨을 설정합니다. 또한 Lambda는 AWS_LAMBDA_LOG_FORMAT 환경 변수를 사용하여 함수의 로그 형식을 설정합니다. 이러한 변수를 사용하여 Lambda 고급 로깅 제어를 사용자 지정 런타임에 통합할 수 있습니다.

Lambda 콘솔, AWS CLI 및 Lambda API로 사용자 지정 런타임을 사용하여 함수에 대한 로깅 설정을 구성하려면 이러한 환경 변수의 값을 확인하도록 사용자 지정 런타임을 구성합니다. 그런 다음 선택한 로그 형식 및 로그 수준에 따라 런타임의 로거를 구성할 수 있습니다.

로그 그룹 구성 CloudWatch

기본적으로 함수는 처음 호출될 때 함수의 이름이 지정된 /aws/lambda/<function name> 로그 그룹을 CloudWatch 자동으로 생성합니다. 기존 로그 그룹에 로그를 전송하도록 함수를 구성하거나 함수에 대한 새 로그 그룹을 생성하려면 Lambda 콘솔 또는 AWS CLI를 사용할 수 있습니다. CreateFunctionUpdateFunctionConfigurationLambda API 명령과 AWS SAM (AWS): :서버리스: :Function 리소스를 사용하여 사용자 지정 로그 그룹을 구성할 수도 있습니다. AWS Serverless Application Model

동일한 로그 그룹에 로그를 전송하도록 여러 Lambda 함수를 구성할 수 있습니다. CloudWatch 예를 들어 단일 로그 그룹을 사용하여 특정 애플리케이션을 구성하는 모든 Lambda 함수에 대한 로그를 저장할 수 있습니다. Lambda 함수에 대한 사용자 지정 로그 그룹을 사용하는 경우 Lambda가 생성하는 로그 스트림에는 함수 이름과 함수 버전이 포함됩니다. 이렇게 하면 여러 함수에 동일한 로그 그룹을 사용하더라도 로그 메시지와 함수 간의 매핑이 보존됩니다.

사용자 지정 로그 그룹의 로그 스트림 이름 지정 형식은 다음 규칙을 따릅니다.

YYYY/MM/DD/<function_name>[<function_version>][<execution_environment_GUID>]

사용자 지정 로그 그룹을 구성할 때 로그 그룹에 대해 선택하는 이름은 로그 이름 지정 규칙을 따라야 한다는 점에 유의하십시오. CloudWatch 또한 사용자 지정 로그 그룹 이름은 aws/ 문자열로 시작해서는 안 됩니다. aws/로 시작하는 사용자 지정 로그 그룹을 생성하는 경우 Lambda는 로그 그룹을 생성할 수 없습니다. 따라서 함수의 로그는 다음으로 CloudWatch 전송되지 않습니다.

함수의 로그 그룹 변경하기(콘솔)
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 함수 구성 페이지에서 모니터링 및 작업 도구를 선택합니다.

  4. 로깅 구성 창에서 편집을 선택합니다.

  5. 로깅 그룹 창에서 CloudWatch 로그 그룹에 대해 사용자 지정을 선택합니다.

  6. 사용자 지정 로그 그룹에서 함수가 로그를 보낼 CloudWatch 로그 그룹의 이름을 입력합니다. 기존 로그 그룹의 이름을 입력하면 함수가 해당 그룹을 사용합니다. 입력한 이름을 가진 로그 그룹이 없는 경우 Lambda는 해당 이름으로 함수에 대한 새 로그 그룹을 생성합니다.

함수의 로그 그룹 변경하기(AWS CLI)
  • 기존 함수의 로그 그룹을 변경하려면 update-function-configuration 명령을 사용합니다. 기존 로그 그룹의 이름을 지정하면 함수에서 해당 그룹을 사용합니다. 지정한 이름을 가진 로그 그룹이 없는 경우 Lambda는 해당 이름으로 함수에 대한 새 로그 그룹을 생성합니다.

    aws lambda update-function-configuration \ --function-name myFunction --log-group myLogGroup
함수를 생성할 때 사용자 지정 로그 그룹 지정하기(AWS CLI)
  • AWS CLI를 사용하여 새 Lambda 함수를 생성할 때 사용자 지정 로그 그룹을 지정하려면 --log-group 옵션을 사용하십시오. 기존 로그 그룹의 이름을 지정하면 함수에서 해당 그룹을 사용합니다. 지정한 이름을 가진 로그 그룹이 없는 경우 Lambda는 해당 이름으로 함수에 대한 새 로그 그룹을 생성합니다.

    다음 예제 명령은 myLogGroup이라는 로그 그룹에 로그를 보내는 Node.js Lambda 함수를 생성합니다.

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --log-group myLogGroup

실행 역할 권한

함수에 로그를 로그로 CloudWatch 보내려면 logs:PutLogEvents권한이 있어야 합니다. Lambda 콘솔을 사용하여 함수의 로그 그룹을 구성할 때 함수에 이 권한이 없는 경우 Lambda는 기본적으로 이를 함수의 실행 역할에 추가합니다. Lambda가 이 권한을 추가하면 CloudWatch 모든 로그 로그 그룹에 로그를 전송할 수 있는 권한을 함수에 부여합니다.

Lambda가 함수의 실행 역할을 자동으로 업데이트하지 않도록 하고 대신 수동으로 편집하려면 권한을 확장하고 필요한 권한 추가를 선택 취소합니다.

AWS CLI를 사용하여 함수의 로그 그룹을 구성하면 Lambda는 logs:PutLogEvents 권한을 자동으로 추가하지 않습니다. 함수의 실행 역할에 권한을 추가합니다(아직 권한이 없는 경우). 이 권한은 AWSLambdaBasicExecutionRole관리형 정책에 포함됩니다.

Lambda 콘솔을 사용하여 로그에 액세스

Lambda 콘솔을 사용하여 로그를 보려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 모니터(Monitor)를 선택합니다.

  4. 로그인 보기를 선택합니다 CloudWatch.

AWS CLI를 사용하여 로그에 액세스

AWS CLI은(는) 명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 섹션의 단계를 완료하려면 다음이 필요합니다.

AWS CLI를 사용하면 --log-type 명령 옵션을 통해 호출에 대한 로그를 검색할 수 있습니다. 호출에서 base64로 인코딩된 로그를 최대 4KB까지 포함하는 LogResult 필드가 응답에 포함됩니다.

예 로그 ID 검색

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

aws lambda invoke --function-name my-function out --log-type Tail

다음 결과가 표시됩니다:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
예 decode the logs

동일한 명령 프롬프트에서 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

cli-binary-format 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 aws configure set cli-binary-format raw-in-base64-out을(를) 실행하세요. 자세한 내용은 AWS CLI 지원되는 글로벌 명령줄 옵션을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

다음 결과가 표시됩니다.

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초 동안 대기합니다. 출력에는 Lambda의 응답과 get-log-events 명령의 출력이 포함됩니다.

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

cli-binary-format 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 aws configure set cli-binary-format raw-in-base64-out을(를) 실행하세요. 자세한 내용은 AWS CLI 지원되는 글로벌 명령줄 옵션을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

#!/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" }

런타임 함수 로깅

코드를 디버깅하고 예상대로 작동하는지 확인하기 위해 프로그래밍 언어에 대한 표준 로깅 기능을 사용하여 로그를 출력할 수 있습니다. Lambda 런타임은 함수의 로그 출력을 Logs에 업로드합니다. CloudWatch 언어별 지침은 다음 주제를 참조하세요.

다음 단계