AWS CloudFormation에서 사용자 지정 리소스 오류를 해결하려고 합니다.
간략한 설명
사용자 지정 리소스 오류는 다음 두 범주로 분류됩니다.
- AWS Lambda 함수에서 오류가 발생하여 작업 실패: 이 오류는 사용자 지정 리소스가 FAILED 신호를 CloudFormation으로 보내는 경우 발생합니다. 이 오류는 일반적으로 사용자 지정 리소스를 지원하는 AWS Lambda 함수를 실행할 때 오류가 발생했음을 나타냅니다.
- 시간 초과 오류: 이 오류는 CloudFormation이 예상 기간 내에 사용자 지정 리소스로부터 응답을 받지 못하여 시간 초과로 이어지는 경우 발생합니다.
해결 방법
오류를 해결하려면 다음 단계를 수행하십시오.
Amazon CloudWatch 로그 확인
첫 번째 단계로, 두 가지 유형의 오류 모두에 대해 AWS Lambda의 Amazon CloudWatch 로그를 확인하십시오.
- CloudFormation 콘솔에서 오류 스택을 선택합니다. 그런 다음, Resources(리소스) 탭을 선택하여 사용자 지정 리소스를 지원하는 Lambda 함수의 물리적 ID를 찾습니다.
- 새 창에서 열려는 Lambda 함수를 선택합니다.
- Monitor(모니터) 탭을 선택합니다. 그런 다음, View CloudWatch logs(CloudWatch 로그 보기) 버튼을 선택합니다. 그러면 오류 해결을 위한 Lambda 함수 로그가 표시됩니다.
Lambda 함수가 CloudFormation 롤백 중에 삭제되었을 수 있습니다. 하지만 로그 그룹에는 CloudWatch 로그가 계속 유지될 수 있습니다. 로그를 찾으려면 다음 단계를 따르십시오.
-
CloudWatch 콘솔로 이동합니다.
-
왼쪽 메뉴에서 로그 그룹을 선택합니다.
-
검색 상자에 다음을 입력합니다.
/aws/lambda/<LambdaPhysicalName>
참고: LambdaPhysicalName은 CloudFormation 리소스 아래에서 찾을 수 있습니다.
CloudWatch 로그를 찾을 수 없는 경우 롤백 기능을 끈 상태로 스택을 재배포하십시오. 이렇게 하면 Lambda 함수의 동작과 잠재적 문제를 조사할 수 있습니다.
각 오류 유형 및 잠재적 원인 살펴보기
FAILED 신호 처리
다음과 같은 오류가 표시될 수 있습니다. "Received response status FAILED from custom resource. Message returned: <reason here>."
이 메시지는 사용자 지정 리소스를 지원하는 Lambda 함수에 오류가 발생했으며 예외 처리 로직이 있음을 나타냅니다.
다음 옵션에 따라 오류를 수정하십시오.
- 응답에 이유가 포함된 경우 오류 메시지를 검토합니다. 이러한 이유는 일반적으로 설명을 위한 것이며 CloudFormation 이벤트의 오류 메시지에 직접 표시됩니다.
- Lambda에 대한 CloudWatch 로그를 검토합니다. 오류 메시지가 명확하지 않거나 오류 발생 이유가 누락된 경우가 있습니다.
CloudFormation이 응답을 받지 못함
CloudFormation이 사용자 지정 리소스로부터 응답을 받지 못하여 시간 초과로 인해 스택이 실패합니다. 이 문제를 일으킬 수 있는 원인은 여러 가지가 있습니다. 다음 옵션을 검토하여 오류의 원인을 파악하십시오.
cfn-response 모듈을 올바르게 사용하는지 확인: 사용자 지정 리소스의 Lambda 함수에서 cfn-response 모듈을 사용하면 신호를 CloudFormation 스택으로 되돌려 보낼 수 있습니다. 모듈이 코드에서 올바르게 사용되지 않으면 CloudFormation은 필요한 응답을 받지 못합니다.
CloudWatch 로그 확인: CloudWatch 로그를 검토하여 코드 실행 중에 오류가 발생했는지 확인합니다. 이러한 오류로 인해 함수가 CloudFormation으로 신호를 보내지 못할 수 있습니다. 특히 코드에 예외 처리 로직이 없는 경우 더욱 그렇습니다.
Lambda 실행 시간 초과 확인: Lambda 함수의 시간 제한 설정이 작업을 완료할 수 있을 만큼 충분히 길어야 합니다. Lambda 함수의 최대 제한은 15분이라는 점을 기억하십시오.
Amazon Simple Storage Service(Amazon S3) 엔드포인트 액세스 확인: CloudFormation이 신호를 수신하려면 사용자 지정 리소스가 미리 서명된 Amazon Simple Storage Service(Amazon S3) URL에 액세스해야 합니다. Lambda 함수가 Virtual Private Cloud 내에 있는 경우에는 서브넷에 있어야 합니다. 서브넷은 NAT 게이트웨이를 통한 아웃바운드 트래픽을 허용하고 Amazon S3 엔드포인트 액세스를 위한 적절한 라우팅이 있어야 합니다.
Lambda 동시성 문제 고려: 제한 시간 후에 전송된 신호가 Lambda 로그에 표시되면 Lambda 동시성을 잠재적 원인으로 조사합니다. 동일한 리전에서 많은 수의 Lambda 함수가 동시에 실행될 때 시간 초과가 발생합니다. 동시 실행에 대한 Lambda 지표를 모니터링하십시오. 시간 초과를 줄이려면 함수에 대해 예약된 동시성을 사용하십시오.
IN_PROGRESS 상태에서 스택 수동 제거: 이 오류에서 CloudFormation은 사용자 지정 리소스가 제한 시간에 도달할 때까지 *_IN_PROGRESS 상태로 유지됩니다. 리소스가 FAIL로 표시되기까지 시간이 걸릴 수 있습니다. 사용자 지정 리소스를 빠르게 안정화하려면 cURL을 사용하여 직접 HTTP 요청을 생성하십시오. 이 작업을 수행하면 지연을 우회하여 시간 초과를 방지하는 경우가 있습니다. 이 요청을 수행하는 데 필요한 정보를 수집하려면 요청 객체의 세부 정보가 있어야 합니다.
예를 들어 다음과 같습니다.
$ curl -H 'Content-Type: ''' -X PUT -d '{ "Status": "SUCCESS",
"PhysicalResourceId": "test-CloudWatchtrigger-1URTEVUHSKSKDFF",
"StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2
",
"RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
"LogicalResourceId": "CloudWatchtrigger"
}' 'https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb
'
요청 객체가 올바르게 로깅된 경우 CloudWatch Logs에서 RequestID 및 사전 서명된 S3 URL을 찾을 수 있습니다. 자세한 내용은 CloudFormation에서 DELETE_FAILED 상태 또는 DELETE_IN_PROGRESS 상태로 멈춘 Lambda 지원 사용자 지정 리소스를 삭제하려면 어떻게 해야 합니까?를 참조하십시오.
관련 정보
CloudFormation을 사용하여 Lambda 지원 사용자 지정 리소스를 구현하는 모범 사례에는 어떤 것이 있습니까?