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

최종 업데이트 날짜: 2019년 11월 11일

사용자 지정 리소스가 AWS CloudFormation에서 DELETE_FAILED 상태 또는 DELETE_IN_PROGRESS 상태로 멈춰 있습니다. 사용자 지정 리소스를 삭제하려면 어떻게 해야 합니까?

간략한 설명

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

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

​해결 방법

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

AWS Lambda 지원 사용자 지정 리소스에서 Delete 요청을 처리하는 로직이 누락된 상태에서 스택을 삭제하려고 하면 "Custom Resource failed to stabilize in expected time" 오류 메시지가 표시됩니다. 또한 스택 상태가 DELETE_FAILED로 변경됩니다.

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

1.    AWS CloudFormation 콘솔을 엽니다.

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

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

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

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

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

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

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

DELETE_IN_PROGRESS 상태인 스택을 삭제할 수 없으면 스택에 Delete 요청을 처리할 로직이 누락되었을 수 있습니다. 올바른 로직을 추가하려면 다음 단계를 완료하여 SUCCESS 신호를 AWS CloudFormation에 수동으로 전송해야 합니다.

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

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

2.    Lambda 콘솔을 엽니다.

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

4.    [모니터링] 탭을 선택하고 [CloudWatch에서 로그 보기]를 선택합니다.

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

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

6.    최신 로그에서 RequestType이 Delete인 이벤트를 식별하고, 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"

7.    6단계의 이벤트 로그 출력을 보려면 Lambda 함수를 시작할 때 다음 console.log() 호출을 입력합니다.

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

중요: 앞의 출력은 ResponseURL, StackId, PhysicalResourceId, LogicalResourceIdRequestId를 포함하는 요청 객체를 보여줍니다. 8단계에서 이 요청 객체를 사용합니다. 이 출력은 각 요청과 함께 AWS CloudFormation에서 생성된 미리 서명된 ResponseURL이 포함되어 있기 때문에 필요합니다.

8.    Delete 요청으로 응답 객체에 SUCCESS 응답 신호를 전송하려면 6단계에서 복사한 값을 사용하여 curl 명령을 실행합니다. 다음 예제를 참조하십시오.

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

사용자 지정 리소스 상태가 DELETE_COMPLETE로 변경됩니다.