

# CloudFormation StackSets 문제 해결
<a name="stacksets-troubleshooting"></a>

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

**Topics**
+ [일반적인 스택 작업 실패 이유](#common-reasons-for-stack-operation-failure)
+ [실패한 스택 생성 또는 업데이트 작업 재시도](#retrying-failed-stack-creation-or-update-operations)
+ [스택 인스턴스 삭제 실패](#stack-instance-delete-fails)
+ [스택 가져오기 작업 실패](#stack-import-fails)
+ [StackSets 작업에 대한 스택 인스턴스 실패 횟수](#stack-instance-failure-count-for-stackset-operations)

## 일반적인 스택 작업 실패 이유
<a name="common-reasons-for-stack-operation-failure"></a>

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

**원인:** 스택 작업이 실패하는 여러 가지 일반적인 원인이 있습니다.
+ 템플릿에 지정된 리소스를 만들기 위한 대상 계정의 권한이 충분하지 않습니다.
+ CloudFormation 템플릿에 오류가 있을 수 있습니다. CloudFormation에서 템플릿을 확인하고 StackSet를 생성하기 전에 오류를 수정합니다.
+ 템플릿은 S3 버킷과 같이 고유해야 하지만 그렇지 않은 글로벌 리소스를 생성하려고 시도할 수 있습니다.
+ 지정된 대상 계정 번호가 존재하지 않습니다. 마법사의 **배포 옵션 설정**(Set deployment options) 페이지에서 지정한 대상 계정 번호를 확인합니다.
+ 관리자 계정과 대상 계정의 신뢰 관계가 없습니다.
+ 템플릿에 지정된 최대 리소스 수가 이미 대상 계정에 있습니다. 예를 들어, 대상 계정에서 허용된 IAM 역할 한도에 도달해도 템플릿이 IAM 역할을 더 만들 수 있습니다.
+ StackSet에 허용되는 최대 스택 수에 도달했습니다. StackSet당 최대 스택 수는 [CloudFormation 할당량 이해](cloudformation-limits.md) 섹션을 참조하세요.

**해결 방법:** StackSet를 생성하기 전에 대상 및 관리자 계정에 필요한 권한에 대한 자세한 내용은 [관리자 계정의 모든 사용자에게 모든 대상 계정의 스택을 관리할 권한 제공](stacksets-prereqs-self-managed.md#stacksets-prereqs-accountsetup) 섹션을 참조하세요.

## 실패한 스택 생성 또는 업데이트 작업 재시도
<a name="retrying-failed-stack-creation-or-update-operations"></a>

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

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

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

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

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

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

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

1. 원한다면 **배포 설정 옵션**(Set deployment options) 페이지에서 **최대 동시 계정** 및 **내결함성**의 기본값을 변경합니다. 이러한 설정에 대한 자세한 내용은 [StackSet 작업 옵션](stacksets-concepts.md#stackset-ops-options) 섹션을 참조하세요.

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

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

## 스택 인스턴스 삭제 실패
<a name="stack-instance-delete-fails"></a>

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

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

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

## 스택 가져오기 작업 실패
<a name="stack-import-fails"></a>

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

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

1. **StackSet에서 스택 삭제** 옵션을 사용하고 구성 중에 **RetaInStacks**를 활성화한 다음 StackSet에서 스택 인스턴스 삭제를 계속합니다. 자세한 내용은 [CloudFormation StackSet에서 스택 삭제](stackinstances-delete.md) 섹션을 참조하세요.

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

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

## StackSets 작업에 대한 스택 인스턴스 실패 횟수
<a name="stack-instance-failure-count-for-stackset-operations"></a>

스택 인스턴스 실패 횟수는 스택 인스턴스가 프로비저닝 또는 업데이트에 실패할 경우 알립니다. 이러한 스택 인스턴스는 다음 중 하나 이상의 이유로 배포되지 않았습니다.
+ 비슷한 구성의 기존 리소스
+ AWS Identity and Access Management(IAM) 역할 등의 누락된 종속 항목
+ 기타 충돌 요인

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

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

### 콘솔 사용
<a name="stack-instance-failure-count-for-stackset-operations-console-examples"></a>

**실패한 스택 인스턴스 수를 보려면 다음을 수행하세요.**

1. [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)을 열고 **StackSet**를 선택합니다.

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

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

**작업에 대한 스택 인스턴스의 계정, 리전 및 상태를 보려면 다음을 수행하세요.**

1. 상태 세부 정보에서 실패한 스택 인스턴스 수를 선택합니다. *예:* **Stack instances(스택 인스턴스): `<number of failed stack instances>`**.

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

**작업에 대한 현재 스택 인스턴스 세부 정보를 보려면 다음을 수행하세요.**

1. **Stack Instances**(스택 인스턴스) 탭을 선택합니다.

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

### AWS CLI 사용
<a name="stack-instance-failure-count-for-stackset-operations-cli-examples"></a>

실패한 스택 인스턴스 수를 확인하려면 `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`를 사용하여 작업이 완료된 후 각 스택 인스턴스의 상태와 상태 이유를 확인합니다. 다음 예제를 보고 `Status`와 `StatusReason`을 찾습니다.

```
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_STATUS` 및 `LAST_OPERATION_ID` 필터와 함께 `list-stack-instances`를 사용하여 스택 인스턴스 배포를 시도한 마지막 작업에서 실패한 스택 인스턴스 목록을 가져옵니다. `DETAILED_STATUS` 및 `LAST_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"
    }
}
```