리소스 프로비저닝 시 실패 처리 방법 선택 - AWS CloudFormation

리소스 프로비저닝 시 실패 처리 방법 선택

스택 작업에 실패하는 경우 이미 성공적으로 프로비저닝된 리소스를 롤백하고 매번 처음부터 다시 시작할 필요가 없습니다. 대신에 CREATE_FAILED 또는 UPDATE_FAILED 상태의 리소스 문제를 해결한 다음에 문제가 발생한 지점에서 프로비저닝을 재개할 수 있습니다.

이렇게 하려면 성공적으로 프로비저닝된 리소스 보존 옵션을 활성화해야 합니다. 이 옵션은 모든 스택 배포 및 변경 세트 작업에 사용할 수 있습니다.

  • 스택 생성의 경우 성공적으로 프로비저닝된 리소스 보존 옵션을 선택하면 CloudFormation에서는 성공적으로 생성된 리소스의 상태를 보존하고 실패한 리소스는 다음 업데이트 작업이 수행될 때까지 실패 상태로 유지합니다.

  • 업데이트 및 변경 세트 작업 중에 성공적으로 프로비저닝된 리소스 보존을 선택하면 성공한 리소스의 상태를 보존하면서 실패한 리소스를 마지막으로 알려진 안정 상태로 롤백합니다. 실패한 리소스는 UPDATE_FAILED 상태가 됩니다. 마지막으로 알려진 안정 상태가 없는 리소스는 다음 스택 작업 시 삭제됩니다.

스택 실패 옵션 개요

CloudFormation 콘솔, API 또는 AWS CLI에서 작업을 실행하기 전에 프로비저닝된 리소스 실패에 대한 동작을 지정합니다. 그런 다음 다른 수정 없이 리소스 배포 프로세스를 진행합니다. 운영 실패가 발생하면 CloudFormation은 각 독립 프로비저닝 경로의 첫 번째 실패 시 중지합니다. CloudFormation은 리소스 간의 종속 항목을 식별하여 독립 프로비저닝 작업을 병렬화합니다. 그런 다음 실패가 발생할 때까지 각 독립 프로비저닝 경로에서 리소스 프로비저닝을 진행합니다. 한 경로의 실패는 다른 프로비저닝 경로에 영향을 주지 않습니다. CloudFormation은 완료될 때까지 리소스를 계속 프로비저닝하거나 다른 실패 시 중지됩니다.

배포 프로세스를 계속하려면 문제를 수정합니다. CloudFormation은 이전에 성공적으로 프로비저닝할 수 없었던 리소스에 대한 프로비저닝 작업을 재시도하기 전에 필요한 업데이트를 수행합니다. Retry(재시도), Update(업데이트) 또는 Roll back(롤백) 작업을 제출하여 문제를 해결합니다. 예를 들어 Amazon EC2 인스턴스를 프로비저닝하고 EC2 인스턴스가 생성 작업 중 실패하는 경우 실패한 리소스를 즉시 롤백하는 대신 오류를 조사할 수 있습니다. 시스템 상태 확인 및 인스턴스 상태 확인을 검토한 다음 문제가 해결되면 Retry(재시도) 작업을 선택할 수 있습니다.

스택 작업이 실패하고 Stack failure options(스택 실패 옵션) 메뉴에서 Preserve successfully provisioned resources(성공적으로 프로비저닝된 리소스 보존)를 지정한 경우 다음 옵션을 선택할 수 있습니다.

  • Retry(재시도) – 실패한 리소스에 대한 프로비저닝 작업을 재시도하고 스택 작업이 성공적으로 완료되거나 다음 오류가 발생할 때까지 템플릿 프로비저닝을 계속합니다. AWS Identity and Access Management(IAM) 권한과 같이 템플릿 수정이 필요하지 않은 문제로 인해 리소스 프로비저닝에 실패한 경우 이 옵션을 선택합니다.

  • Update(업데이트) – 프로비저닝된 리소스는 템플릿 업데이트 시 업데이트됩니다. 생성 또는 업데이트에 실패한 리소스는 재시도됩니다. 템플릿 오류로 인해 리소스 프로비저닝에 실패하고 템플릿을 수정한 경우 이 옵션을 선택합니다. FAILED 상태인 스택을 업데이트할 때 스택 업데이트를 계속하려면 Stack failure options(스택 실패 옵션)에 대해 Preserve successfully provisioned resources(성공적으로 프로비저닝된 리소스 보존)를 선택해야 합니다.

  • Roll back(롤백) – CloudFormation은 스택을 마지막으로 알려진 안정 상태로 롤백합니다.

스택 롤백 일시 중지에 필요한 조건

생성된 리소스를 CloudFormation에서 자동으로 롤백하거나 삭제하지 않도록 하려면 다음과 같은 조건이 충족되어야 합니다.

  1. 스택을 생성하거나 업데이트할 때 성공적으로 프로비저닝된 리소스 보존 옵션을 선택해야 합니다. 그러면 전반적으로 스택 작업이 실패하더라도 성공적으로 생성된 리소스를 삭제하지 않도록 CloudFormation에 지시합니다.

  2. 스택 작업이 실패하여 스택 상태가 CREATE_FAILED 또는 UPDATE_FAILED입니다.

참고

변경할 수 없는 업데이트 유형은 지원되지 않습니다.

성공적으로 프로비저닝된 리소스 보존(콘솔)

Create stack
스택 생성 작업 중 성공적으로 프로비저닝된 리소스 보존
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. Create stack(스택 생성)을 선택한 다음 With new resources (standard)(새 리소스 사용(표준))를 선택합니다.

  3. Specify template(템플릿 지정) 페이지에서 다음 옵션 중 하나를 사용하여 스택 템플릿을 선택합니다.

    • 템플릿 준비 완료

    • 샘플 템플릿 사용

    • Application Composer에서 빌드

    설정을 수락하고 Next(다음)를 선택합니다.

  4. Specify stack details(스택 세부 정보 지정) 페이지의 Stack name(스택 이름) 상자에 스택 이름을 입력합니다.

  5. Parameters(파라미터) 섹션에서 스택 템플릿에 정의된 파라미터를 지정합니다.

    기본값을 사용하여 파라미터를 사용하거나 변경할 수 있습니다.

  6. 파라미터값에 만족하면 Next(다음)를 선택합니다.

  7. Configure stack options(스택 옵션 구성) 페이지에서 스택에 대한 추가 옵션을 설정할 수 있습니다.

  8. Stack failure options(스택 실패 옵션)에서 Preserve successfully provisioned resources(성공적으로 프로비저닝된 리소스 보존)를 선택합니다.

  9. 스택 옵션에 만족하면 Next(다음)를 선택합니다.

  10. Review(검토) 페이지에서 스택을 검토하고 Create stack(스택 생성)을 선택합니다.

결과: 생성에 실패한 리소스는 스택 작업이 실패할 때 스택이 롤백되지 않도록 스택 상태를 CREATE_FAILED로 전환합니다. 성공적으로 프로비저닝된 리소스는 CREATE_COMPLETE 상태입니다. Stack events(스택 이벤트) 탭에서 스택을 모니터링할 수 있습니다.

Update stack
스택 업데이트 작업 중 성공적으로 프로비저닝된 리소스 보존
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. 업데이트할 스택을 선택하고 Update(업데이트)를 선택합니다.

  3. Update stack(스택 지정) 페이지에서 다음 옵션 중 하나를 사용하여 스택 템플릿을 선택합니다.

    • Use current template(현재 템플릿 사용)

    • Replace current template(현재 템플릿 교체)

    • Application Composer에서 템플릿 편집

    설정을 수락하고 Next(다음)를 선택합니다.

  4. Specify stack details(스택 세부 정보 지정) 페이지에서 스택 템플릿에 정의된 파라미터를 지정합니다.

    기본값을 사용하여 파라미터를 사용하거나 변경할 수 있습니다.

  5. 파라미터값에 만족하면 Next(다음)를 선택합니다.

  6. Configure stack options(스택 옵션 구성) 페이지에서 스택에 대한 추가 옵션을 설정할 수 있습니다.

  7. Behavior on provisioning failure(프로비저닝 실패에 대한 동작)에서 Preserve successfully provisioned resources(성공적으로 프로비저닝된 리소스 보존)를 선택합니다.

  8. 스택 옵션에 만족하면 Next(다음)를 선택합니다.

  9. Review(검토) 페이지에서 스택을 검토하고 Update stack(스택 업데이트)을 선택합니다.

결과: 업데이트에 실패한 리소스는 스택 상태를 UPDATE_FAILED로 전환하고 마지막으로 알려진 안정 상태로 롤백합니다. 마지막으로 알려진 안정 상태가 없는 리소스는 다음 스택 작업 시 CloudFormation에 의해 삭제됩니다. 성공적으로 프로비저닝된 리소스는 CREATE_COMPLETE 또는 UPDATE_COMPLETE 상태입니다. Stack events(스택 이벤트) 탭에서 스택을 모니터링할 수 있습니다.

Change set
참고

CREATE_FAILED 또는 UPDATE_FAILED 상태의 스택에 대해 변경 세트를 시작할 수 있지만 UPDATE_ROLLBACK_FAILED 상태의 스택에 대해 변경 세트를 시작할 수 없습니다.

변경 세트 작업 중 성공적으로 프로비저닝된 리소스 보존
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. 시작하려는 변경 세트가 포함된 스택을 선택한 다음 Change sets(변경 세트) 탭을 선택합니다.

  3. 변경 세트를 선택한 다음 Execute(실행)를 선택합니다.

  4. Execute change set(변경 세트 실행)에서 Preserve successfully provisioned resources(성공적으로 프로비저닝된 리소스 보존) 옵션을 선택합니다.

  5. Execute change set(변경 세트 실행)를 선택합니다.

결과: 업데이트에 실패한 리소스는 스택 상태를 UPDATE_FAILED로 전환하고 마지막으로 알려진 안정 상태로 롤백합니다. 마지막으로 알려진 안정 상태가 없는 리소스는 다음 스택 작업 시 CloudFormation에 의해 삭제됩니다. 성공적으로 프로비저닝된 리소스는 CREATE_COMPLETE 또는 UPDATE_COMPLETE 상태입니다. Stack events(스택 이벤트) 탭에서 스택을 모니터링할 수 있습니다.

성공적으로 프로비저닝된 리소스 보존(AWS CLI)

Create stack
스택 생성 작업 중 성공적으로 프로비저닝된 리소스 보존

create-stack 작업 중 --disable-rollback 옵션이나 on-failure DO_NOTHING 열거를 선택합니다.

  1. --disable-rollback 옵션을 사용하여 create-stack 명령에 스택 이름과 템플릿을 제공합니다.

    aws cloudformation create-stack --stack-name myteststack \ --template-body file://template.yaml \ --disable-rollback

    명령은 다음 출력을 반환합니다.

    {     "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  2. describe-stacks 명령을 사용하여 스택의 상태를 설명합니다.

    aws cloudformation describe-stacks --stack-name myteststack

    명령은 다음 출력을 반환합니다.

    {     "Stacks":  [         {             "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",             "Description": "AWS CloudFormation Sample Template",             "Tags": [],             "Outputs": [],             "StackStatusReason": “The following resource(s) failed to create: [MyBucket]”,             "CreationTime": "2013-08-23T01:02:15.422Z",             "Capabilities": [],             "StackName": "myteststack",             "StackStatus": "CREATE_FAILED",             "DisableRollback": true         }     ] }
Update stack
스택 업데이트 작업 중 성공적으로 프로비저닝된 리소스 보존
  1. --disable-rollback 옵션을 사용하여 update-stack 명령에 기존 스택 이름과 템플릿을 제공합니다.

    aws cloudformation update-stack --stack-name myteststack \ --template-url https://s3.amazonaws.com/amzn-s3-demo-bucket/updated.template --disable-rollback

    명령은 다음 출력을 반환합니다.

    {     "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  2. describe-stacks 또는 describe-stack-events 명령을 사용하여 스택의 상태를 설명합니다.

    aws cloudformation describe-stacks --stack-name myteststack

    명령은 다음 출력을 반환합니다.

    { "Stacks":  [         {             "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",             "Description": "AWS CloudFormation Sample Template",             "Tags": [],             "Outputs": [],             "CreationTime": "2013-08-23T01:02:15.422Z",             "Capabilities": [],             "StackName": "myteststack",             "StackStatus": "UPDATE_COMPLETE",             "DisableRollback": true         }     ] }
Change set
참고

CREATE_FAILED 또는 UPDATE_FAILED 상태의 스택에 대해 변경 세트를 시작할 수 있지만 UPDATE_ROLLBACK_FAILED 상태의 스택에 대해 변경 세트를 시작할 수 없습니다.

변경 세트 작업 중 성공적으로 프로비저닝된 리소스 보존

execute-change-set 작업 중 --disable-rollback 옵션을 지정합니다.

  1. --disable-rollback 옵션을 사용하여 execute-change-set 명령에 스택 이름과 템플릿을 제공합니다.

    aws cloudformation execute-change-set --stack-name myteststack \ --change-set-name my-change-set --template-body file://template.yaml

    명령은 다음 출력을 반환합니다.

    {  "Id": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/my-change-set/bc9555ba-a949-xmpl-bfb8-f41d04ec5784",  "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  2. --disable-rollback 옵션으로 변경 세트를 시작합니다.

    aws cloudformation execute-change-set --stack-name myteststack \ --change-set-name my-change-set -–disable-rollback
  3. describe-stacks 또는 describe-stack-events 명령을 사용하여 스택의 상태를 결정합니다.

    aws cloudformation describe-stack-events --stack-name myteststack

    명령은 다음 출력을 반환합니다.

    { "StackEvents": [ { "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896", "EventId": "49c966a0-7b74-11ea-8071-024244bb0672", "StackName": "myteststack", "LogicalResourceId": " MyBucket", "PhysicalResourceId": "myteststack-MyBucket-abcdefghijk1", "ResourceType": "AWS::S3::Bucket", "Timestamp": "2020-04-10T21:43:17.015Z", "ResourceStatus": "UPDATE_FAILED" "ResourceStatusReason": "User XYZ is not allowed to perform S3::UpdateBucket on MyBucket" } }
  4. 권한 오류를 수정하고 작업을 다시 시도합니다.

    aws cloudformation update-stack --stack-name myteststack \ --use-previous-template --disable-rollback

    명령은 다음 출력을 반환합니다.

    {     "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
  5. describe-stacks 또는 describe-stack-events 명령을 사용하여 스택의 상태를 설명합니다.

    aws cloudformation describe-stacks --stack-name myteststack

    명령은 다음 출력을 반환합니다.

    {     "Stacks":  [         {             "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",             "Description": "AWS CloudFormation Sample Template",             "Tags": [],             "Outputs": [],             "CreationTime": "2013-08-23T01:02:15.422Z",             "Capabilities": [],             "StackName": "myteststack",             "StackStatus": "UPDATE_COMPLETE",             "DisableRollback": true         }     ] }

스택 롤백

rollback-stack 명령을 사용하여 스택 상태가 CREATE_FAILED 또는 UPDATE_FAILED인 스택을 마지막 안정 상태로 롤백할 수 있습니다.

다음 rollback-stack 명령에서는 지정된 스택을 롤백합니다.

aws cloudformation rollback-stack --stack-name myteststack

명령은 다음 출력을 반환합니다.

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896" }
참고

rollback-stack 작업은 마지막으로 알려진 안정 상태가 없는 스택을 삭제합니다.