Lambda의 실행 문제 해결
Lambda 런타임에서 함수 코드를 실행하면 이벤트가 일정 시간 동안 처리 중인 함수의 인스턴스에서 처리되거나 새 인스턴스를 초기화해야 할 수 있습니다. 함수 초기화 동안 핸들러 코드가 이벤트를 처리할 때 또는 함수가 응답을 반환하거나 반환하지 않을 때 오류가 발생할 수 있습니다.
함수 실행 오류는 코드, 함수 구성, 다운스트림 리소스 또는 권한 문제로 인해 발생할 수 있습니다. 함수를 직접 호출하면 Lambda의 응답에 함수 오류가 표시됩니다. 이벤트 소스 매핑으로 또는 다른 서비스를 통해 함수를 비동기적으로 호출하는 경우 로그, 배달 못한 편지 대기열 또는 on-failure 대상에 오류가 있을 수 있습니다. 오류 처리 옵션 및 재시도 동작은 함수를 호출하는 방법과 오류 유형에 따라 다릅니다.
함수 코드 또는 Lambda 런타임에서 오류를 반환하면 Lambda의 응답에서 상태 코드는 200 OK입니다. 응답에 오류가 있으면 X-Amz-Function-Error
라는 헤더로 표시됩니다. 400 및 500 시리즈 상태 코드는 호출 오류에 예약되어 있습니다.
Lambda: 실행 시간이 너무 오래 걸림
문제: 함수 실행에 너무 많은 시간이 소요됩니다.
코드가 로컬 시스템보다 Lambda에서 실행하는 데 더 오래 걸리는 경우, 함수에 사용할 수 있는 메모리 또는 처리 성능으로 인해 제한될 수 있습니다. 메모리와 CPU를 모두 관리하려면 추가 메모리를 사용하여 함수를 구성하세요.
Lambda: 로그 또는 추적이 나타나지 않음
문제: CloudWatch Logs에 로그가 나타나지 않습니다.
문제: 추적이 AWS X-Ray에 나타나지 않습니다.
함수는 CloudWatch Logs 및 X-Ray를 호출할 수 있는 권한이 필요합니다. 권한을 부여하려면 실행 역할을 업데이트하세요. 다음 관리형 정책을 추가하여 로그 및 추적을 활성화합니다.
-
AWSLambdaBasicExecutionRole
-
AWSXRayDaemonWriteAccess
함수에 권한을 추가할 때 코드나 구성에 대한 간단한 업데이트도 수행하세요. 그러면 자격 증명이 오래된 함수의 인스턴스 실행이 중지 및 대체됩니다.
참고
함수 호출 후 로그가 표시되는 데 5~10분 정도 걸릴 수 있습니다.
Lambda: 일부 함수 로그가 표시되지 않음
문제: 권한이 올바른 경우에도 CloudWatch Logs에서 함수 로그가 누락됨
AWS 계정에서 CloudWatch Logs 할당량 한도에 도달하면 CloudWatch는 함수 로깅을 제한합니다. 이 경우 함수가 출력하는 일부 로그는 CloudWatch Logs에 표시되지 않을 수 있습니다.
함수의 로그 출력 속도가 높아 Lambda에서 처리할 수 없는 경우에도 CloudWatch Logs에 로그 출력이 나타나지 않을 수 있습니다. Lambda에서 함수의 로그 생성 속도에 맞춰 CloudWatch로 로그를 전송할 수 없는 경우 로그를 삭제하여 함수 실행 속도가 느려지는 것을 방지합니다. 단일 로그 스트림의 로그 처리량이 2MB/s를 초과할 경우 삭제된 로그를 지속적으로 관찰해야 합니다.
함수가 JSON 형식의 로그를 사용하도록 구성된 경우 Lambda는 로그를 삭제하면 CloudWatch Logs에 logsDropped 이벤트를 보내려고 합니다. 하지만 CloudWatch가 함수의 로깅을 제한하면 해당 이벤트가 CloudWatch Logs에 도달하지 않을 수 있으므로 Lambda가 로그를 삭제할 때 레코드가 항상 표시되는 것은 아닙니다.
AWS 계정에서 CloudWatch Logs 할당량 한도에 도달했는지 확인하려면 다음을 수행합니다.
-
Service Quotas 콘솔
을 엽니다. -
탐색 창에서 AWS 서비스를 선택합니다.
-
AWS 서비스 목록에서 Amazon CloudWatch Logs를 검색합니다.
-
서비스 할당량 목록에서
CreateLogGroup throttle limit in transactions per second
,CreateLogStream throttle limit in transactions per second
,PutLogEvents throttle limit in transactions per second
할당량을 선택하여 사용률을 확인합니다.
또한 계정 사용률이 이러한 할당량에 지정한 한도를 초과할 경우 알리도록 CloudWatch 경보를 설정할 수 있습니다. 자세한 내용은 정적 임곗값을 기반으로 CloudWatch 경보 생성을 참조하세요.
CloudWatch Logs의 기본 할당량 한도가 사용 사례에 충분하지 않은 경우 할당량 증가를 요청할 수 있습니다.
Lambda: 실행이 완료되기 전에 함수가 반환됨
문제: (Node.js) 코드 실행을 완료하기 전에 함수가 반환됨
AWS SDK를 포함하는 많은 라이브러리가 비동기적으로 작동합니다. 네트워크를 호출하거나 응답을 기다려야 하는 다른 작업을 수행할 때 라이브러리는 백그라운드에서 작업의 진행 상황을 추적하는 promise라는 객체를 반환합니다.
promise가 응답으로 확인될 때까지 기다리려면 await
키워드를 사용하세요. 이렇게 하면 promise가 응답을 포함하는 객체로 확인될 때까지 핸들러 코드가 실행되지 않습니다. 코드에서 응답의 데이터를 사용할 필요가 없으면 promise를 런타임에 직접 반환 할 수 있습니다.
일부 라이브러리는 promise를 반환하지 않지만, 반환하는 코드로 래핑될 수 있습니다. 자세한 내용은 Node.js에서 Lambda 함수 핸들러 정의 섹션을 참조하세요.
AWS SDK: 버전 및 업데이트
문제: 런타임에 포함된 AWS SDK가 최신 버전이 아님
문제: 런타임에 포함된 AWS SDK가 자동으로 업데이트됨
스크립팅 언어의 런타임에는 AWS SDK가 포함되며 정기적으로 최신 버전으로 업데이트됩니다. 각 런타임의 현재 버전은 런타임 페이지에 나열됩니다. 최신 버전의 AWS SDK를 사용하거나 함수를 특정 버전으로 잠그려면 라이브러리를 함수 코드와 번들로 묶거나 Lambda 계층을 생성하면 됩니다. 종속성을 사용하여 배포 패키지를 만드는 방법에 대한 자세한 내용은 다음 항목을 참조하세요.
Python: 라이브러리가 잘못 로드됨
문제: (Python) 일부 라이브러리는 배포 패키지에서 올바르게 로드되지 않음
C 또는 C++로 작성된 확장 모듈이 있는 라이브러리는 Lambda(Amazon Linux)와 동일한 프로세서 아키텍처를 사용하는 환경에서 컴파일해야 합니다. 자세한 내용은 Python Lambda 함수에 대한 .zip 파일 아카이브 작업 단원을 참조하십시오.
Java: Java 11에서 Java 17로 업데이트한 후 함수가 이벤트를 처리하는 데 시간이 더 오래 걸립니다.
문제: (Java) Java 11에서 Java 17로 업데이트한 후 함수가 이벤트를 처리하는 데 시간이 더 오래 걸림
JAVA_TOOL_OPTIONS
파라미터를 사용하여 컴파일러를 조정하세요. Java 17 이상의 Java 버전용 Lambda 런타임은 기본 컴파일러 옵션을 변경합니다. 이 변경으로 수명이 짧은 함수의 콜드 스타트 시간이 개선되지만 이전 동작은 계산 집약적이고 오래 실행되는 함수에 더 적합합니다. Java 11 동작으로 되돌리려면 JAVA_TOOL_OPTIONS
를 -XX:-TieredCompilation
으로 설정합니다. JAVA_TOOL_OPTIONS
파라미터에 대한 자세한 내용은 JAVA_TOOL_OPTIONS 환경 변수에 대한 이해을 참조하세요.