AWS CloudFormation StackSets 문제 해결 - AWS CloudFormation

AWS CloudFormation StackSets 문제 해결

이 주제에는 몇 가지 일반적인 AWS CloudFormation StackSets 문제와 이러한 문제의 해결 방법이 제시되어 있습니다.

일반적인 스택 작업 실패 이유

문제: 스택 작업이 실패하고 스택 인스턴스 상태가 OUTDATED입니다.

원인: 스택 작업이 실패하는 여러 가지 일반적인 원인이 있습니다.

  • 템플릿에 지정된 리소스를 만들기 위한 대상 계정의 권한이 충분하지 않습니다.

  • AWS CloudFormation 템플릿에 오류가 있을 수 있습니다. AWS CloudFormation에서 템플릿을 확인하고 스택 세트를 만들기 전에 오류를 수정합니다.

  • 템플릿은 S3 버킷과 같이 고유해야 하지만 그렇지 않은 글로벌 리소스를 생성하려고 시도할 수 있습니다.

  • 지정된 대상 계정 번호가 존재하지 않습니다. 마법사의 배포 옵션 설정(Set deployment options) 페이지에서 지정한 대상 계정 번호를 확인합니다.

  • 관리자 계정과 대상 계정의 신뢰 관계가 없습니다.

  • 템플릿에 지정된 최대 리소스 수가 이미 대상 계정에 있습니다. 예를 들어, 대상 계정에서 허용된 IAM 역할 한도에 도달해도 템플릿이 IAM 역할을 더 만들 수 있습니다.

  • 스택 세트에 허용되는 최대 스택 수에 도달했습니다. 스택 세트당 최대 스택 수는 AWS CloudFormation 제한을 참조하세요.

해결 방법: 스택 세트를 생성하기 전에 대상 및 관리자 계정에 필요한 권한에 대한 자세한 내용은 스택 세트 작업에 대한 기본 권한 설정 단원을 참조하십시오.

실패한 스택 생성 또는 업데이트 작업 재시도

문제: 스택 생성 또는 업데이트 작업이 실패하고 스택 인스턴스 상태가 OUTDATED입니다. 스택 생성 또는 업데이트가 실패한 이유를 해결하려면 AWS CloudFormation 콘솔을 열고 DELETED(생성 작업 실패의 경우) 또는 FAILED(업데이트 작업 실패의 경우) 상태의 스택 이벤트를 봅니다. 스택 이벤트를 찾아보고 상태 사유 열을 찾습니다. 상태 사유 값이 스택 작업이 실패한 이유를 설명합니다.

스택 생성 실패의 근본적인 원인을 해결하고 스택을 생성할 준비가 되면 다음 단계를 수행하십시오.

해결 방법: 스택 작업을 재시도하려면 다음 단계를 수행합니다.

  1. 콘솔에서 작업이 실패한 스택이 포함된 스택 세트를 선택합니다.

  2. 작업 메뉴에서 Edit StackSet details(스택 세트 세부 정보 편집)를 선택하여 스택 생성 또는 업데이트를 다시 시도하십시오.

  3. Specify template(템플릿 지정) 페이지에서 동일한 AWS CloudFormation 템플릿을 사용하려면 기본 옵션인 현재 템플릿 사용을 유지합니다. 템플릿이 변경되어 스택 작업이 실패하고 수정된 템플릿을 업로드하려는 경우 Amazon S3에 템플릿 업로드를 선택한 다음 찾아보기를 선택하여 업데이트된 템플릿을 선택합니다. 수정된 템플릿 업로드가 완료되면 다음을 선택합니다.

  4. 세부 정보 지정 페이지에서 템플릿 관련 파라미터를 변경하지 않으려면 다음을 선택합니다.

  5. 원한다면 배포 설정 옵션(Set deployment options) 페이지에서 최대 동시 계정내결함성의 기본값을 변경합니다. 이러한 설정에 대한 자세한 내용은 스택 세트 작업 옵션 섹션을 참조하세요.

  6. 검토 페이지에서 선택 사항을 검토하고 확인란을 선택하여 필요한 IAM 기능을 승인합니다. 제출을 선택합니다.

  7. 스택이 성공적으로 업데이트되지 않은 경우 스택 생성에 방해가 되는 근본적인 문제를 해결한 후에 이 절차를 반복합니다.

스택 인스턴스 삭제 실패

문제: 스택 삭제가 실패했습니다.

원인: 종료 방지 기능이 활성화된 모든 스택에 대해 스택 삭제가 실패합니다.

솔루션: 스택에 종료 방지 기능이 활성화되어 있는지 확인합니다. 종료 방지 기능이 활성화되어 있으면 비활성화한 다음 스택 인스턴스 삭제를 다시 수행하십시오.

스택 가져오기 작업 실패

문제: 스택 가져오기 작업이 기존 스택을 새 스택 세트나 기존 스택 세트로 가져오지 못합니다. 스택 인스턴스가 INOPERABLE 상태입니다.

해결 방법: 다음 태스크를 완료하여 스택 가져오기 태스크를 되돌립니다.

  1. StackSet에서 스택 삭제 옵션을 사용하고 구성 중에 RetaInStacks를 활성화한 다음 스택 세트에서 스택 인스턴스 삭제를 계속합니다. 자세한 내용은 Delete stack instances from your stack set를 참조하세요.

  2. Stackset의 스택 인스턴스가 업데이트되어 INOPERABLE 스택 인스턴스가 제거된 것을 확인할 수 있습니다.

  3. 가져오기 실패 오류에 따라 스택 인스턴스를 수정하고 스택 가져오기 작업을 다시 시도합니다.

StackSets 작업에 대한 스택 인스턴스 실패 횟수

스택 인스턴스 실패 횟수는 스택 인스턴스가 프로비저닝 또는 업데이트에 실패할 경우 알립니다. 이러한 스택 인스턴스는 다음 중 하나 이상의 이유로 배포되지 않았습니다.

  • 비슷한 구성의 기존 리소스

  • AWS Identity and Access Management(IAM) 역할 등의 누락된 종속 항목

  • 기타 충돌 요인

최대 동시성으로 배포하려는 경우 최대 동시성 개수는 내결함성 개수보다 하나 더 많습니다. 예를 들어, 내결함성 개수가 9일 경우 최대 동시성 개수는 10 이하여야 합니다. 이렇게 하면 일부 스택 인스턴스가 업데이트에 실패해도 작업이 SUCCEEDED를 반환합니다. 내결함성 개수가 모든 실패를 허용하도록 설정되었으므로 새 스택 인스턴스 실패 횟수를 통해 작업이 조건부로만 성공했는지 확인할 수 있습니다.

AWS Management Console,AWS SDK 또는AWS CLI 를 사용하여 실패 횟수 및 필터 스택 인스턴스를 가져와서 재배포되어야 하는 인스턴스를 결정할 수 있습니다.

콘솔 사용

실패한 스택 인스턴스 수를 보려면 다음을 수행하세요.
  1. AWS CloudFormation 콘솔을 열고 StackSets를 선택합니다.

  2. StackSet를 선택한 다음 Operations(작업)를 선택합니다.

  3. Status(상태) 열에서 상태를 선택하여 상태 세부 정보를 봅니다. 상태 세부 정보에서 특정 작업에 대해 실패한 스택 인스턴스 수를 확인할 수 있습니다.

작업에 대한 스택 인스턴스의 계정, 리전 및 상태를 보려면 다음을 수행하세요.
  1. 상태 세부 정보에서 실패한 스택 인스턴스 수를 선택합니다. 예: Stack instances(스택 인스턴스): <number of failed stack instances>.

  2. 패널 헤더를 선택하여 측면 패널을 확장합니다. 측면 패널의 결과는 선택한 작업이 완료된 후의 스택 인스턴스 상태입니다.

작업에 대한 현재 스택 인스턴스 세부 정보를 보려면 다음을 수행하세요.
  1. Stack Instances(스택 인스턴스) 탭을 선택합니다.

  2. Last operation ID(마지막 작업 ID)로 필터링합니다. 결과는 마지막 인스턴스 수정 작업의 현재 상태와 상태 이유입니다. 이 필터를 AWS account, AWS region, Detailed Status(세부 상태) 및 Drift status(드리프트 상태)와 함께 사용하여 검색 결과를 더 세분화할 수 있습니다.

AWS CLI 사용

실패한 스택 인스턴스 수를 확인하려면 describe-stack-set-operation 또는 list-stack-set-operations를 호출하고 StatusDetails를 봅니다.

$ aws cloudformation describe-stack-set-operation --stack-set-name ss1 \ --operation-id 5550e62f-c822-4331-88fa-21c1d7bafc60
{ "StackSetOperation": { "OperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60", "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Action": "CREATE", "Status": "SUCCEEDED", "OperationPreferences": { "RegionOrder": [], "FailureToleranceCount": 10, "MaxConcurrentCount": 10 }, "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole", "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole", "CreationTimestamp": "2022-10-26T17:18:53.947000+00:00", "EndTimestamp": "2022-10-26T17:19:35.304000+00:00", "StatusDetails": { "FailedStackInstancesCount": 3 } } }
aws cloudformation list-stack-set-operations --stack-set-name ss1
{ "Summaries": [ { "OperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60", "Action": "CREATE", "Status": "SUCCEEDED", "CreationTimestamp": "2022-10-26T17:18:53.947000+00:00", "EndTimestamp": "2022-10-26T17:19:35.304000+00:00", "StatusDetails": { "FailedStackInstancesCount": 3 }, "OperationPreferences": { "RegionOrder": [], "FailureToleranceCount": 10, "MaxConcurrentCount": 10 } } ] }

특정 작업에 대한 기록 개요를 보려면 list-stack-set-operation-results를 사용하여 작업이 완료된 후 각 스택 인스턴스의 상태와 상태 이유를 확인합니다. 다음 예제를 보고 StatusStatusReason을 찾습니다.

aws cloudformation list-stack-set-operation-results --stack-set-name ss1 --operation-id 5550e62f-c822-4331-88fa-21c1d7bafc60 --filters Name=OPERATION_RESULT_STATUS,Values=FAILED
{ "Summaries": [ { "Account": "123456789012", "Region": "us-west-2", "Status": "FAILED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "AccountGateResult": { "Status": "SKIPPED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'." }, "OrganizationalUnitId": "" }, { "Account": "123456789012", "Region": "us-west-1", "Status": "FAILED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "AccountGateResult": { "Status": "SKIPPED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'." }, "OrganizationalUnitId": "" }, { "Account": "123456789012", "Region": "us-east-1", "Status": "FAILED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "AccountGateResult": { "Status": "SKIPPED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'." }, "OrganizationalUnitId": "" } ] }

DETAILED_STATUSLAST_OPERATION_ID 필터와 함께 list-stack-instances를 사용하여 스택 인스턴스 배포를 시도한 마지막 작업에서 실패한 스택 인스턴스 목록을 가져옵니다. DETAILED_STATUSLAST_OPERATION_ID가 있는 예제에서 --filters 플래그를 참조하세요.

aws cloudformation list-stack-instances --stack-set-name ss1 --filters Name=DETAILED_STATUS,Values=FAILED Name=LAST_OPERATION_ID,Values=5550e62f-c822-4331-88fa-21c1d7bafc60
{ "Summaries": [ { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-east-1", "Account": "123456789012", "Status": "OUTDATED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" }, { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-west-1", "Account": "123456789012", "Status": "OUTDATED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" }, { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-west-2", "Account": "123456789012", "Status": "OUTDATED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" } ] }

스택 인스턴스를 수정한 마지막 작업 ID를 찾으려면 list-stack-instances 또는 describe-stack-instance를 사용하여 LastOperationId를 가져옵니다.

aws cloudformation describe-stack-instance --stack-set-name ss1 --stack-instance-account 123456789012 --stack-instance-region us-east-2
{ "StackInstance": { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-west-2", "Account": "123456789012", "ParameterOverrides": [], "Status": "OUTDATED", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" } }