CloudFormation에서 DELETE_FAILED 상태 또는 DELETE_IN_PROGRESS 상태로 멈춘 Lambda 지원 사용자 지정 리소스의 문제를 삭제하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 8월 23일

AWS CloudFormation에서 AWS Lambda 지원 사용자 지정 리소스가 DELETE_FAILED 상태 또는 DELETE_IN_PROGRESS 상태로 멈췄습니다. 사용자 지정 리소스를 삭제하고 싶습니다

간략한 설명

다음 솔루션 중 하나를 선택합니다.

  • DELETE_FAILED 상태로 멈춘 사용자 지정 리소스 삭제
  • DELETE_IN_PROGRESS 상태로 멈춘 사용자 지정 리소스 삭제

해결 방법

DELETE_FAILED 상태로 멈춘 사용자 지정 리소스 삭제

Lambda 지원 사용자 지정 리소스에 삭제 요청을 처리할 논리가 없는 경우 스택을 삭제하려고 하면 오류 메시지가 표시됩니다. 사용자 지정 리소스에 잘못된 삭제 논리가 포함되어 있는 경우에도 오류가 발생할 수 있습니다. 오류 메시지는 다음과 같습니다. “사용자 지정 리소스가 예상 시간 내에 안정화되지 않았습니다(Custom Resource failed to stabilize in expected time).” 스택 상태가 DELETE_FAILED로 변경됩니다.

스택을 삭제하려면 다음 단계를 수행합니다.

1.    CloudFormation 콘솔을 엽니다.

2.    DELETE_FAILED 상태로 멈춘 사용자 지정 리소스를 포함하는 스택을 선택합니다.

3.    [작업]을 선택한 후 [스택 삭제]를 선택합니다.

4.    보관할 리소스 목록을 제공하는 팝업 창에서 DELETE_FAILED 상태로 멈춘 사용자 지정 리소스를 선택합니다. 그리고 [삭제(Delete)]를 선택합니다.

5.    [작업]을 선택한 후 [스택 삭제]를 선택합니다.

스택 상태가 DELETE_COMPLETE로 변경됩니다.

참고: 사용자 지정 리소스는 실제 리소스가 아니므로, 스택 삭제 후 사용자 지정 리소스를 정리하지 않아도 됩니다.

DELETE_IN_PROGRESS 상태로 멈춘 사용자 지정 리소스 삭제

사용자 지정 리소스를 삭제하는 동안 스택이 DELETE_IN_PROGRESS 상태로 멈추면 스택에 삭제 요청을 처리하는 논리가 누락되었을 수 있습니다. 또는 스택에 잘못된 삭제 논리가 포함될 수 있습니다.

스택을 강제로 삭제하려면 수동으로 SUCCESS 신호를 전송해야 합니다. 신호에는 ResponseURLRequestId 값에 포함되며, 이 값은 CloudFormation에서 Lambda로 전송되는 이벤트에 모두 포함됩니다.

1.    Lambda 함수가 이벤트 세부 정보를 기록하는지 확인합니다.

Lambda 함수에 이벤트를 로그에 인쇄하는 논리가 포함되어 있지 않으면 ResponseURLRequestId 값을 가져올 수 없습니다. 이 값은 수동 신호를 보내는 데 필요합니다. 이 경우 CloudFormation 스택이 시간 초과될 때까지 약 1시간 동안 기다렸다가 DELETE_FAILED 상태가 됩니다. 그리고 DELETE_FAILED 상태로 멈춘 있는 사용자 지정 리소스 삭제 섹션의 단계를 완료하여 스택을 삭제합니다.

참고:Lambda 함수에 다음 논리가 이미 있는 경우 2단계로 이동합니다.

논리 예:

exports.handler = function(event, context) {
    console.log("REQUEST RECEIVED:\n" + JSON.stringify(event));
...
}

2.    CloudFormation 템플릿에서 사용자 지정 리소스가 요청을 전송하는 Lambda 함수 이름을 식별합니다. AWS::CloudFormation::CustomResource 또는 Custom::String 리소스의 ServiceToken 속성에서 함수 이름을 찾을 수 있습니다. 예를 들어 다음과 같습니다.

MyCustomResource: 
  Type: "Custom::PingTester"
  Properties: 
    ServiceToken:
      !Sub |
        arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction

3.    Lambda 콘솔을 엽니다.

4.    탐색 창에서 [함수(Functions)]를 선택하고 1단계에서 식별한 함수를 선택합니다. 예를 들어, awsexamplelambdafunction은 이전 코드 예제의 함수 이름입니다.

5.    [모니터링(Monitoring)] 탭을 선택하고 [CloudWatch에서 로그 보기(View logs in CloudWatch)]를 선택합니다.

6.    Amazon CloudWatch 콘솔에서 최신 로그를 선택합니다.

참고: 함수가 로그 스트리밍을 위해 Amazon CloudWatch Logs에 대한 액세스 권한을 보유하는 경우에만 CloudWatch 로그를 볼 수 있습니다.

7.    최신 로그에서 RequestTypeDelete로 설정된 이벤트를 식별하고, RequestId, ResponseURL, StackId, LogicalResourceIdPhysicalResourceId에 대한 값을 복사합니다. 예를 들어 다음과 같습니다.

Received event: {
  "RequestType": "Delete",
  "ServiceToken": "arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction",
  "ResponseURL": "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",
  "StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2",
  "RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
  "LogicalResourceId": "MyCustomResource",
  "PhysicalResourceId": "test-MyCustomResource-1URTEVUHSKSKDFF",
  "ResourceType": "Custom::PingTester"

8.    응답 객체의 SUCCESS 응답 신호를 삭제 요청으로 전송하려면 다음 명령을 실행합니다. 7단계에서 복사한 값을 포함해야 합니다.

$ 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
  '

CloudFormation 스택 이벤트에서 사용자 지정 리소스의 상태가 DELETE_COMPLETE로 변경됩니다.