

# 드리프트 감지를 사용하여 스택 및 리소스에 대한 비관리형 구성 변경 감지
<a name="using-cfn-stack-drift"></a>

CloudFormation을 통해 리소스를 관리하는 경우에도 사용자는 CloudFormation 외부의 리소스를 변경할 수 있습니다. 사용자는 리소스를 생성하는 기본 서비스를 사용하여 리소스를 직접 편집할 수 있습니다. 예를 들어 Amazon EC2 콘솔을 사용하여 CloudFormation 스택의 일부로 생성된 서버 인스턴스를 업데이트할 수 있습니다. 일부 변경 사항은 실수일 수 있으며, 일부는 시간에 민감한 작업 이벤트에 의도적으로 응답하는 것일 수 있습니다. 그와 무관하게 CloudFormation 외부에서의 변경 사항은 스택 업데이트 또는 삭제 작업을 복잡하게 만들 수 있습니다. 드리프트 감지를 사용하여 구성 변경이 CloudFormation 관리 외부에서 이루어진 스택 리소스를 식별할 수 있습니다. 교정 작업을 수행하여 스택 리소스가 스택 템플릿의 정의와 동기화될 수 있습니다. 예를 들어 드리프트된 리소스를 직접 업데이트하여 템플릿 정의가 일치할 수 있습니다. 드리프트 확인은 구성 일관성과 성공적인 스택 작업에 도움이 됩니다.

**Topics**
+ [드리프트란 무엇인가요?](#what-is-drift)
+ [드리프트 감지 상태 코드](#drift-status-codes)
+ [드리프트 감지 시 고려 사항](#drift-considerations)
+ [전체 CloudFormation 스택의 드리프트 감지](detect-drift-stack.md)
+ [개별 스택 리소스의 드리프트 감지](detect-drift-resource.md)
+ [가져오기 작업을 통한 드리프트 해결](resource-import-resolve-drift.md)

## 드리프트란 무엇인가요?
<a name="what-is-drift"></a>

드리프트 감지 기능을 사용하면 스택의 실제 구성이 예상 구성과 다르거나 *드리프트*했는지 여부를 감지할 수 있습니다. CloudFormation을 사용하여 전체 스택 또는 스택 내 개별 리소스의 드리프트를 감지합니다. 리소스는 실제 속성값이 예상 속성값과 다를 경우 드리프트 된 것으로 간주됩니다. 여기에는 속성 또는 리소스가 삭제된 경우가 포함됩니다. 스택은 하나 이상의 리소스가 드리프트 된 경우 드리프트 된 것으로 간주됩니다.

리소스가 드리프트되었는지 확인하려면 CloudFormation에서 템플릿 파라미터로 지정된 스택 템플릿 및 모든 값에서 정의된 예상 속성값을 확인합니다. 그런 다음 CloudFormation은 이러한 예상값을 스택에 현재 존재하는 리소스 속성의 실제 값과 비교합니다. 리소스는 하나 이상의 속성이 삭제되었거나 값이 변경된 경우 드리프트된 것으로 간주됩니다.

CloudFormation은 드리프트된 스택의 각 리소스에서 세부 정보를 생성합니다.

CloudFormation에서 드리프트 감지를 지원하는 AWS 리소스의 드리프트를 감지합니다. 드리프트 감지를 지원하지 않는 리소스는 드리프트 상태가 NOT\$1CHECKED로 할당됩니다. 드리프트 감지를 지원하는 AWS 리소스 목록은 [리소스 유형 지원](resource-import-supported-resources.md) 섹션을 참조하세요.

또한 CloudFormation에서는 *프로비저닝 가능한* 프라이빗 리소스 유형, 즉 프로비저닝 유형이 `FULLY_MUTABLE` 또는 `IMMUTABLE`인 프라이빗 리소스 유형에 대한 드리프트 감지를 지원합니다. 프라이빗 리소스 유형의 리소스에 대한 드리프트 감지를 수행하려면 계정에 등록한 리소스 유형의 기본 버전이 프로비저닝 가능해야 합니다. 리소스 프로비저닝 유형에 대한 자세한 내용은 *AWS CloudFormation API 참조*의 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html) 작업과 *AWS CLI Command Reference*의 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html) 명령의 `ProvisioningType` 파라미터를 참조하세요. 프라이빗 리소스에 대한 자세한 내용은 [CloudFormation 레지스트리를 통해 익스텐션 관리](registry.md) 섹션을 참조하세요.

상태가 `CREATE_COMPLETE`, `UPDATE_COMPLETE`, `UPDATE_ROLLBACK_COMPLETE` 및 `UPDATE_ROLLBACK_FAILED`인 스택에서 드리프트 감지를 수행할 수 있습니다.

스택의 드리프트를 감지할 때 CloudFormation에서 해당 스택에 속하는 중첩 스택의 드리프트를 감지하지 않습니다. 자세한 내용은 [중첩 스택을 사용하여 템플릿을 재사용 가능한 조각으로 분할](using-cfn-nested-stacks.md) 섹션을 참조하세요. 대신 중첩 스택에서 직접 드리프트 감지 작업을 개시할 수 있습니다.

**참고**  
CloudFormation에서 스택 템플릿을 통해 또는 템플릿 파라미터 지정을 통해 명시적으로 설정된 속성값에 대한 드리프트만을 감지합니다. 여기에는 리소스 속성에 대한 기본값이 포함되지 않습니다. CloudFormation에서 드리프트 확인을 목적으로 리소스 속성을 추적하도록 하려면 기본값으로 설정하는 경우에도 속성값을 명시적으로 설정합니다.

## 드리프트 감지 상태 코드
<a name="drift-status-codes"></a>

이 단원의 표에서는 드리프트 감지에 사용되는 다양한 상태 유형을 설명합니다.
+ **드리프트 감지 작업 상태**는 드리프트 작업의 현재 상태를 설명합니다.
+ **드리프트 상태** 

  스택 세트의 경우, 스택 세트에 속하는 스택 인스턴스의 드리프트 상태를 기준으로 스택 세트의 드리프트 상태를 전체적으로 설명합니다.

  스택 인스턴스의 경우, 연결된 스택의 드리프트 상태를 기준으로 스택 인스턴스의 드리프트 상태를 설명합니다.

  스택의 경우, 리소스의 드리프트 상태를 기준으로 스택의 드리프트 상태를 전체적으로 설명합니다.
+ **리소스 드리프트 상태**는 개별 리소스의 드리프트 상태를 설명합니다.

다음 표에서는 CloudFormation에서 스택 드리프트 감지 작업에 할당하는 상태 코드를 나열합니다.


| 드리프트 감지 작업 상태 | 설명 | 
| --- | --- | 
|  `DETECTION_COMPLETE`  |  드리프트 감지를 지원하는 스택의 모든 리소스에 대해 스택 드리프트 감지 작업이 완료되었습니다.  | 
|  `DETECTION_FAILED`  |  스택에 있는 하나 이상의 리소스에 대해 스택 드리프트 감지 작업이 실패했습니다. 결과는 CloudFormation에서 드리프트 감지가 완료된 리소스에 대해 제공됩니다.  | 
|  `DETECTION_IN_PROGRESS`  |  스택 드리프트 감지 작업이 현재 진행되고 있습니다.  | 

다음 표에서는 CloudFormation에서 스택에 할당하는 드리프트 상태 코드를 나열합니다.


| 드리프트 상태 | 설명 | 
| --- | --- | 
|  `DRIFTED`  |  스택의 경우: 스택이 예상 템플릿 구성과 다르거나 *드리프트*되었습니다. 스택은 하나 이상의 리소스가 드리프트 된 경우 드리프트 된 것으로 간주됩니다. 스택 인스턴스의 경우: 스택 인스턴스는 연결된 스택이 드리프트되면 드리프트된 것으로 간주됩니다. 스택 세트의 경우: 하나 이상의 스택 인스턴스가 드리프트되면 스택 세트가 드리프트된 것으로 간주됩니다.  | 
|  `NOT_CHECKED`  |  CloudFormation에서는 스택, 스택 세트 또는 스택 인스턴스가 예상 템플릿 구성과 다른지 여부를 확인하지 않았습니다.  | 
|  `IN_SYNC`  |  각 지원되는 리소스의 현재 구성이 예상 템플릿 구성과 일치합니다. 드리프트 감지를 지원하는 리소스가 없는 스택, 스택 세트 또는 스택 인스턴스도 IN\$1SYNC 상태가 됩니다.  | 

다음 표에서는 CloudFormation에서 스택 리소스에 할당하는 드리프트 상태 코드를 나열합니다.


| 리소스 드리프트 상태 | 설명 | 
| --- | --- | 
|  `DELETED`  |  리소스가 삭제되었기 때문에 리소스가 예상 템플릿 구성과 다릅니다.  | 
|  `MODIFIED`  |  리소스가 예상 템플릿 구성과 다릅니다.  | 
|  `NOT_CHECKED`  |  CloudFormation에서 리소스가 예상 템플릿 구성과 다른지 여부를 확인하지 않았습니다.  | 
|  `IN_SYNC`  |  리소스의 현재 구성이 예상 템플릿 구성과 일치합니다.  | 

다음 표에서는 CloudFormation에서 예상 템플릿 구성과 다른 리소스 속성에 할당하는 차이 유형 상태 코드를 나열합니다.


| 속성 차이 유형 | 설명 | 
| --- | --- | 
|  `ADD`  |  값이 배열 또는 목록 데이터 유형인 리소스 속성에 추가되었습니다.   | 
|  `REMOVE`  |  속성이 현재 리소스 구성에서 제거되었습니다.  | 
|  `NOT_EQUAL`  |  현재 속성값이 스택 템플릿에서 정의된 예상값과 다릅니다.  | 

## 드리프트 감지 시 고려 사항
<a name="drift-considerations"></a>

스택의 드리프트 감지를 수행하려면 사용자가 다음 권한을 보유해야 합니다.
+ 스택에 포함된 드리프트 감지를 지원하는 각 리소스에 대한 읽기 권한. 예를 들어 스택에 `AWS::EC2::Instance` 리소스가 포함된 경우 `ec2:DescribeInstances` 권한을 보유하고 스택에서 드리프트 감지를 수행해야 합니다.
+ `cloudformation:DetectStackDrift`
+ `cloudformation:DetectStackResourceDrift`
+ `cloudformation:BatchDescribeTypeConfigurations`

CloudFormation에 권한을 설정하는 방법에 대한 자세한 내용은 [AWS Identity and Access Management를 사용하여 CloudFormation 액세스 제어](control-access-with-iam.md) 섹션을 참조하세요.

특정 엣지 케이스에서 CloudFormation은 정확한 드리프트 결과를 항상 반환할 수는 없습니다. 드리프트 감지 결과를 적절하게 해석하려면 이러한 엣지 케이스를 인식해야 합니다.
+ 실제로 리소스에 대한 책임이 있는 기본 서비스로부터 속성에 공급되는 기본값인 경우 특정 케이스에서 속성 어레이에 포함된 객체는 드리프트로 보고됩니다.
+ 특정 리소스에는 관련 리소스와 연결 관계가 있습니다. 이를 통해 리소스에서 동일하거나 다른 템플릿에 정의된 또 다른 리소스에 대한 속성값을 연결 또는 제거할 수 있습니다. 예를 들어 `AWS::EC2::SecurityGroupIngress` 및 `AWS::EC2::SecurityGroupEgress` 리소스는 `AWS::EC2::SecurityGroup` 리소스에서 값을 연결 또는 제거하는 데 사용될 수 있습니다. 이러한 경우 CloudFormation에서 드리프트 비교 수행 전에 스택 템플릿을 분석합니다. 하지만 CloudFormation에서 스택에 걸쳐 이 분석을 수행할 수 없고, 정확한 드리프트 결과를 반환할 수 없습니다. 이 경우 연결된 리소스는 다른 스택에 위치합니다.

  드리프트 감지를 지원하고 다른 리소스로부터의 연결을 허용 또는 필요로 하는 리소스는 다음과 같습니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)
+ CloudFormation에서는 모든 리소스의 `KMSKeyId` 속성에 대해 드리프트 감지를 수행하지 않습니다. 여러 별칭에서 AWS KMS 키를 참조할 수 있기 때문에 CloudFormation에서 이 속성에 대한 정확한 드리프트 결과를 일관적으로 보장할 수 없습니다.
+ 특성에 따라 스택 템플릿에서 지정할 수 있는 특정 리소스 속성이 있습니다. CloudFormation에서는 결과로 나온 스택 리소스의 속성을 비교할 수 없습니다. 따라서 이러한 속성은 드리프트 감지 결과에 포함될 수 없습니다. 이러한 속성은 두 가지 넓은 범주로 나뉩니다.
  + CloudFormation에서 스택 템플릿의 최초 리소스 속성값으로 매핑할 수 없는 속성값입니다.

    예를 들어 CloudFormation에서 Lambda 함수의 소스 코드를 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) 리소스의 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html) 속성 유형으로 매핑할 수 없으므로 CloudFormation에서 이를 드리프트 감지 결과에 포함할 수 없습니다.
  + 리소스에 대해 책임이 있는 서비스에서 반환하지 않는 속성값입니다.

    설계 면에서 리소스가 속하는 서비스에 의해 반환되지 않는 특정 속성값이 있습니다. 암호 또는 노출되어서는 안 되는 기타 민감한 데이터와 같은 기밀 정보가 포함되는 경우가 있습니다. 예를 들어, IAM 서비스에서 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) 속성 유형의 `Password` 속성값을 반환하지 않으며, 따라서 CloudFormation은 드리프트 감지 결과에 포함될 수 없습니다.
  + 어레이에 있는 객체는 실제로 서비스 기본값이 될 수 있지만 수동으로 추가된 드리프트는 아닙니다.
+ 오탐지가 발생하는 경우 CloudFormation 콘솔의 피드백 링크를 사용하여 의견을 보내거나 [AWS re:Post](https://repost.aws/)을 통해 문의하세요.
+ 일부 속성에는 같지만 동일하지는 않은 입력 값이 있을 수 있습니다. 오탐지를 방지하려면 예상 구성이 실제 구성과 일치하는지 확인해야 합니다.
  + 예를 들어, 리소스 속성의 예상 구성은 1024MB이고 동일한 리소스 속성의 실제 구성은 1GB일 수 있습니다. 1024MB와 1GB는 같지만 동일하지는 않습니다.

    이 리소스 속성에서 드리프트 감지를 실행하면 드리프트된 결과를 알립니다.

    이러한 오탐지를 방지하려면 리소스 속성의 예상 구성을 1024MB로 변경한 다음 드리프트 감지를 실행하세요.

# 전체 CloudFormation 스택의 드리프트 감지
<a name="detect-drift-stack"></a>

스택에서 드리프트 감지 작업을 수행하면 스택이 예정 템플릿 구성에서 드리프트되었는지 확인하고, 드리프트 감지를 지원하는 스택의 각 리소스에 대한 드리프트 상태 관련 세부 정보를 반환합니다.

**AWS Management Console을 사용하여 전체 스택의 드리프트를 감지하려면**

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. 스택 목록에서 드리프트 감지를 수행할 스택을 선택하십시오. 스택 세부 정보 창에서 **Stack actions(스택 작업)**를 선택한 후 **Detect drift(드리프트 감지)**를 선택합니다.  
![\[선택한 스택에 대해 스택 작업 메뉴에서 현재 스택의 드리프트 감지 명령 선택.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/console-stacks-actions-detect-drift-1.png)

   CloudFormation은 선택한 스택에 대해 드리프트 감지가 시작되었음을 나타내는 정보 표시줄을 표시합니다.

1. CloudFormation에서 드리프트 감지 작업을 완료할 때까지 기다립니다. 드리프트 감지 작업이 완료되면 CloudFormation은 스택의 [**드리프트 상태(Drift status)**] 및 [**마지막 드리프트 확인 시간(Last drift check time)**]을 업데이트합니다. 이 필드는 스택 세부 정보 페이지에서 **Stack info**(스택 정보) 창의 **Overview**(개요) 섹션에 나열됩니다.

   드리프트 감지 작업은 몇 분이 걸릴 수 있으며, 스택에 포함된 리소스의 수에 따라 다릅니다. 동시에 해당 스택에서 단일 드리프트 감지 작업만을 실행할 수 있습니다. CloudFormation은 정보 표시줄을 닫은 후에도 드리프트 감지 작업을 계속합니다.

1. 스택 및 리소스에 대한 드리프트 감지 결과를 검토합니다. 스택을 선택한 상태에서 **Stack actions(스택 작업)** 메뉴에서 **View drift results(드리프트 결과 보기)**를 선택하십시오.

   CloudFormation은 스택 또는 개별 리소스에서 드리프트 감지가 개시된 마지막 시간에 더해 스택의 전체 드리프트 상태를 나열합니다. 스택은 하나 이상의 리소스가 드리프트 된 경우 드리프트 된 것으로 간주됩니다.  
![\[선택한 스택의 드리프트 페이지는 전체 스택 드리프트 상태, 드리프트 감지 상태 및 스택 또는 개별 리소스에서 드리프트 감지가 개시된 마지막 시간을 표시.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-overview-1.png)

   [**리소스 드리프트 상태(Resource drift status)**] 섹션에서 CloudFormation은 각 스택 리소스, 드리프트 상태 및 리소스에서 드리프트 감지가 개시된 마지막 시간을 나열합니다. 각 리소스의 논리적 ID 및 물리적 ID가 표시되어 식별에 도움이 됩니다. 추가로 상태가 **MODIFIED**인 리소스의 경우 CloudFormation에서 리소스 드리프트 세부 정보를 표시합니다.

   **드리프트 상태** 열을 사용하여 드리프트 상태에 따라 리소스를 정렬할 수 있습니다.

   1. 수정된 리소스의 세부 정보를 보려면

     1. 수정된 리소스를 선택한 상태에서 **View drift details(드리프트 세부 정보 보기)**를 선택하십시오.

       CloudFormation은 해당 리소스에 대한 드리프트 세부 정보 페이지를 표시합니다. 이 페이지는 리소스의 예상 및 현재 속성 값, 그리고 둘 사이의 차이를 나열합니다.

       차이를 강조 표시하려면 **차이** 섹션에서 속성 이름을 선택하십시오.
       + 추가된 속성은 **Details**(세부 정보) 섹션의 **Current**(현재) 열에 녹색으로 강조 표시됩니다.
       + 삭제된 속성은 **Details**(세부 정보) 섹션의 **Expected**(예상) 열에 붉은색으로 강조 표시됩니다.
       + 값이 변경된 속성의 경우 **Expected** 및 **현재** 열 모두에서 노란색으로 강조 표시됩니다.  
![\[드리프트 세부 정보 페이지의 리소스 드리프트 상태 섹션에는 드리프트 감지를 지원하는 스택의 각 리소스에 대한 드리프트 정보가 포함되어 있습니다. 세부 정보에는 드리프트 상태와 예상 및 현재 속성 값이 포함되어 있습니다.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-drift-details-differences-1.png)

**AWS CLI을 사용하여 전체 스택의 드리프트를 감지하려면**
**중요**  
스택의 **마지막 드리프트 확인 시간**을 검토하고 오래된 데이터를 사용하지 않도록 리소스 드리프트 결과에 표시된 타임스탬프보다 이전인지 확인합니다.

AWS CLI를 사용하여 전체 스택의 드리프트를 감지하려면 AWS CLI 명령을 사용합니다.
+ **detect-stack-drift**는 스택의 드리프트 감지 작업을 개시합니다.
+ **describe-stack-drift-detection-status**는 스택 드리프트 감지 작업의 상태를 모니터링합니다.
+ **describe-stack-resource-drifts**는 스택 드리프트 감지 작업의 세부 정보를 검토합니다.

1. **detect-stack-drift**를 사용하여 전체 스택의 드리프트를 감지합니다. 스택 이름 또는 ARN을 지정합니다. 또한 이 드리프트 감지 작업에 대한 필터로 사용하고자 하는 특정 리소스의 논리적 ID를 지정할 수도 있습니다.

   ```
   aws cloudformation detect-stack-drift --stack-name my-stack-with-resource-drift
   ```

   출력:

   ```
   {
       "StackDriftDetectionId": "624af370-311a-11e8-b6b7-500cexample"
   }
   ```

1. 스택 드리프트 감지 작업은 오래 걸릴 수 있기 때문에 **describe-stack-drift-detection-status**를 사용하여 스택 드리프트 감지 작업의 상태를 모니터링합니다. 이 명령은 **detect-stack-drift** 명령에서 반환된 스택 드리프트 감지 ID를 가져옵니다.

   아래 예제에서 위 예제의 **detect-stack-drift**에서 반환된 스택 드리프트 감지 ID를 가져와 이를 파라미터로 **describe-stack-drift-detection-status**에 전달했습니다. 파라미터는 드리프트 감지 작업이 완료되었고, 단일 스택 리소스가 드리프트되었으며, 전체 스택이 결과적으로 드리프트된 것으로 간주되는 것을 보여주는 작업 세부 정보를 반환합니다.

   ```
   aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
   ```

   출력:

   ```
   {
       "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
       "StackDriftDetectionId": "624af370-311a-11e8-b6b7-500cexample", 
       "StackDriftStatus": "DRIFTED", 
       "Timestamp": "2018-03-26T17:23:22.279Z", 
       "DetectionStatus": "DETECTION_COMPLETE", 
       "DriftedStackResourceCount": 1
   }
   ```

1. 스택 드리프트 감지 작업이 완료될 때 **describe-stack-resource-drifts** 명령을 사용하여 결과를 검토합니다. 결과에는 드리프트된 리소스에 대한 실제 및 예상 속성 값이 포함됩니다.

   아래 예에서는 `--stack-resource-drift-status-filters` 옵션을 사용하여 수정 또는 삭제된 리소스에 대한 스택 드리프트 정보를 요청합니다. 요청을 통해 수정된 리소스에 대한 정보가 반환되며, 여기에는 값이 변경된 속성에 대한 세부 정보가 포함됩니다. 삭제된 리소스가 없었습니다.

   ```
   aws cloudformation describe-stack-resource-drifts --stack-name my-stack-with-resource-drift --stack-resource-drift-status-filters MODIFIED DELETED
   ```

   출력:

   ```
   {
       "StackResourceDrifts": [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
               "ActualProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":120,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":12},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
               "ResourceType": "AWS::SQS::Queue", 
               "Timestamp": "2018-03-26T17:23:34.489Z", 
               "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/099908667365/my-stack-with-resource-drift-Queue-494PBHCO76H4", 
               "StackResourceDriftStatus": "MODIFIED", 
               "ExpectedProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":10},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
               "PropertyDifferences": [
                   {
                       "PropertyPath": "/DelaySeconds", 
                       "ActualValue": "120", 
                       "ExpectedValue": "20", 
                       "DifferenceType": "NOT_EQUAL"
                   }, 
                   {
                       "PropertyPath": "/RedrivePolicy/maxReceiveCount", 
                       "ActualValue": "12", 
                       "ExpectedValue": "10", 
                       "DifferenceType": "NOT_EQUAL"
                   }
               ], 
               "LogicalResourceId": "Queue"
           }
       ]
   }
   ```

# 개별 스택 리소스의 드리프트 감지
<a name="detect-drift-resource"></a>

전체 스택이 아닌 하나의 스택 내 특정 리소스의 드리프트를 감지할 수 있습니다. 이는 특히 특정 리소스가 예상 템플릿 구성과 일치하는지 다시 확인해야 하는 경우 유용합니다.

리소스의 드리프트 감지를 수행할 때 CloudFormation에서는 전체 스택 드리프트 상태와 해당되는 경우 [**마지막 드리프트 확인 시간(Last drift check time)**]을 업데이트합니다. 예를 들어 드리프트 상태가 `IN_SYNC`인 스택이 있다고 가정합니다. CloudFormation에서 스택에 포함된 하나 이상의 리소스에 드리프트 감지를 수행하도록 하고, CloudFormation에서 하나 이상의 리소스가 드리프트되었음을 감지합니다. CloudFormation은 스택 드리프트 상태를 `DRIFTED`로 업데이트합니다. 반대로 드리프트된 단일 리소스로 인해 드리프트 상태가 `DRIFTED`인 스택이 있다고 가정합니다. 리소스를 예상 속성 값으로 설정한 다음 다시 리소스의 드리프트를 탐지하는 경우 CloudFormation에서 전체 스택에 대한 드리프트를 다시 탐지할 필요 없이 리소스 드리프트 상태 및 스택 드리프트 상태 모두를 `IN_SYNC`로 업데이트합니다.

**AWS Management Console을 사용하여 개별 리소스의 드리프트를 감지하려면**

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. 스택 목록에서 리소스가 포함된 스택을 선택합니다. CloudFormation이 해당 스택에 대한 스택 세부 정보를 표시합니다.

1. 왼쪽 탐색 창의 **스택**에서 **스택 동작**을 선택한 다음 **드리프트 감지**를 선택합니다.

1. **리소스 드리프트 상태**에서 리소스를 선택한 다음 **리소스 드리프트 상태**를 선택합니다.

   CloudFormation에서는 선택한 리소스의 드리프트 감지를 수행합니다. 성공하면 CloudFormation은 리소스의 드리프트 상태를 업데이트하고 필요한 경우 전체 스택 드리프트 상태를 업데이트합니다. CloudFormation은 또한 드리프트 감지가 리소스 및 스택 전체에서 마지막으로 수행된 시간에 대한 타임스탬프를 업데이트합니다. 리소스가 수정된 경우 CloudFormation에서 리소스의 예상 및 현재 속성 값에 대한 세부 드리프트 정보를 표시합니다.

1. 리소스에 대한 드리프트 감지 결과를 검토합니다.

   1. 수정된 리소스의 세부 정보를 보려면

     1. 수정된 리소스를 선택한 상태에서 **View drift details(드리프트 세부 정보 보기)**를 선택하십시오.

       CloudFormation에서 리소스의 예상 및 현재 속성 값, 그리고 둘 사이의 차이를 비롯한 해당 리소스의 드리프트 세부 정보를 표시합니다.

       차이를 강조 표시하려면 **차이** 섹션에서 속성 이름을 선택하십시오.
       + 추가된 속성은 **Details**(세부 정보) 섹션의 **Current**(현재) 열에 녹색으로 강조 표시됩니다.
       + 삭제된 속성은 **Details**(세부 정보) 섹션의 **Expected**(예상) 열에 붉은색으로 강조 표시됩니다.
       + 값이 변경된 속성의 경우 **Expected** 및 **현재** 열 모두에서 노란색으로 강조 표시됩니다.  
![\[드리프트 세부 정보 페이지의 리소스 드리프트 상태 섹션에는 드리프트 감지를 지원하는 스택의 각 리소스에 대한 드리프트 정보가 포함되어 있습니다. 세부 정보에는 드리프트 상태와 예상 및 현재 속성 값이 포함되어 있습니다.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-drift-details-differences-1.png)

**AWS CLI을 사용하여 개별 리소스의 드리프트를 감지하려면**
+ 
**중요**  
스택 리소스의 **마지막 드리프트 확인 시간**을 검토하고 오래된 데이터를 사용하지 않도록 리소스 드리프트 결과에 표시된 타임스탬프보다 이전인지 확인합니다.

  AWS CLI를 사용하여 개별 리소스의 드리프트를 감지하려면 **detect-stack-resource-drift** 명령을 사용합니다. 리소스와 리소스가 포함된 스택의 논리적 ID를 지정합니다.

  다음 예에서는 특정 스택 리소스인 `my-drifted-resource`에서 드리프트 탐지 작업을 실행합니다. 응답을 통해 리소스가 수정되었음을 확인하는 정보가 반환되며, 여기에는 값이 변경된 속성에 대한 세부 정보가 포함됩니다.

  ```
  aws cloudformation detect-stack-resource-drift \
      --stack-name my-stack-with-resource-drift \
      --logical-resource-id my-drifted-resource
  ```

  출력:

  ```
  {
      "StackResourceDrift": {
          "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
          "ActualProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":120,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":12},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
          "ResourceType": "AWS::SQS::Queue", 
          "Timestamp": "2018-03-26T18:54:28.462Z", 
          "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/099908667365/my-stack-with-resource-drift-Queue-494PBHCO76H4", 
          "StackResourceDriftStatus": "MODIFIED", 
          "ExpectedProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":10},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
          "PropertyDifferences": [
              {
                  "PropertyPath": "/DelaySeconds", 
                  "ActualValue": "120", 
                  "ExpectedValue": "20", 
                  "DifferenceType": "NOT_EQUAL"
              }, 
              {
                  "PropertyPath": "/RedrivePolicy/maxReceiveCount", 
                  "ActualValue": "12", 
                  "ExpectedValue": "10", 
                  "DifferenceType": "NOT_EQUAL"
              }
          ], 
          "LogicalResourceId": "my-drifted-resource"
      }
  }
  ```

# 가져오기 작업을 통한 드리프트 해결
<a name="resource-import-resolve-drift"></a>

리소스의 구성이 의도된 구성에서 드리프트되어 새 구성을 의도된 구성으로 적용하려는 경우가 있을 수 있습니다. 대부분의 경우 스택 템플릿의 리소스 정의를 새 구성으로 업데이트하여 드리프트 결과를 해결한 다음 스택 업데이트를 수행합니다. 그러나 새 구성에서 교체가 필요한 리소스 속성을 업데이트하면 스택 업데이트 중에 리소스가 다시 생성됩니다. 기존 리소스를 유지하려면 리소스 가져오기 기능을 사용하여 리소스를 업데이트하고 리소스를 교체하지 않으면서 드리프트 결과를 해결할 수 있습니다.

가져오기 작업을 통해 리소스에 대한 드리프트를 해결하는 기본 단계는 다음과 같습니다.
+ [Retain으로 설정된 DeletionPolicy 속성을 리소스에 추가합니다](#resource-import-resolve-drift-console-step-01-update-stack). 이렇게 하면 기존 리소스가 스택에서 제거될 때 삭제되지 않고 보존됩니다.
+ [템플릿에서 리소스를 제거하고 스택 업데이트 작업을 실행합니다](#resource-import-resolve-drift-console-step-02-remove-drift). 이렇게 하면 스택에서 리소스가 제거되지만 삭제되지는 않습니다.
+ [스택 템플릿에서 리소스의 실제 상태를 설명한 다음 기존 리소스를 다시 스택으로 가져옵니다](#resource-import-resolve-drift-console-step-03-update-template). 이렇게 하면 리소스가 스택에 다시 추가되고 드리프트 결과를 유발하는 속성 차이가 해결됩니다.

리소스 가져오기에 대한 자세한 내용은 [수동으로 CloudFormation 스택에 AWS 리소스 가져오기](import-resources-manually.md) 섹션을 참조하세요. 가져오기를 지원하는 리소스의 목록은 [리소스 유형 지원](resource-import-supported-resources.md) 섹션을 참조하세요.

다음 예제에서는 `templateToImport.json`이라는 템플릿을 사용합니다.

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PROVISIONED",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 1
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

이 예제에서는 사용자가 CloudFormation 외부의 리소스를 변경했다고 가정해 보겠습니다. 드리프트 감지를 실행한 후 `GamesTable`의 `BillingMode`가 `PAY_PER_REQUEST`로 수정된 것을 발견했습니다. 드리프트 탐지에 대한 자세한 내용은 [드리프트 감지를 사용하여 스택 및 리소스에 대한 비관리형 구성 변경 감지](using-cfn-stack-drift.md) 섹션을 참조하세요.

![\[드리프트 결과가 콘솔에 예상 결과와 실제 결과로 표시됨.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/drift-results-gamestable.png)


스택이 오래되었고 리소스는 라이브 상태이지만 의도된 리소스 구성을 보존하려고 합니다. 가져오기 작업을 통해 서비스 중단 없이 드리프트를 해결하면 이렇게 할 수 있습니다.

## CloudFormation 콘솔을 사용하여 가져오기 작업으로 드리프트 해결
<a name="resource-import-resolve-drift-console"></a>

### 1단계. 보존 삭제 정책을 사용하여 스택 업데이트
<a name="resource-import-resolve-drift-console-step-01-update-stack"></a>

**`Retain` 옵션과 함께 `DeletionPolicy` 속성을 사용하여 스택을 업데이트하려면**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)에서 CloudFormation 콘솔을 엽니다.

1. **스택(Stacks)** 페이지에서 드리프트된 스택을 선택합니다.

1. **업데이트(Update)**를 선택한 다음 스택 세부 정보(Stack details) 창에서 **현재 템플릿 교체(Replace current template)**를 선택합니다.

1. **템플릿 지정(Specify template)** 페이지에서 다음 방법 중 하나를 사용하여 `Retain` 옵션과 함께 `DeletionPolicy` 속성이 포함되어 있는 업데이트된 템플릿을 제공합니다.
   + **Amazon S3 URL**을 선택한 다음, 텍스트 상자에 템플릿의 URL을 지정합니다.
   + **템플릿 파일 업로드**를 선택한 다음 템플릿을 찾습니다.

   그리고 **다음**을 선택합니다.

1. **스택 세부 정보 지정(Specify stack details)** 페이지를 검토하고 **다음(Next)**을 선택합니다.

1. **스택 옵션 구성(Configure stack options)** 페이지를 검토하고 **다음(Next)**을 선택합니다.

1. ***stack-name* 검토(Review stack-name)** 페이지에서 **스택 업데이트(Update stack)**를 선택합니다.

*결과*: 스택의 **이벤트(Events)** 페이지에서 상태가 `UPDATE_COMPLETE`입니다.

서비스를 중단하지 않고 가져오기 작업을 통해 드리프트를 해결하려면 스택에서 제거할 리소스에 대해 `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)를 지정합니다. 다음 예에서는 `Retain`으로 설정된 [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) 속성을 `GamesTable` 리소스에 추가했습니다.

------
#### [ Example JSON ]

```
    "GamesTable": {
        "Type": "AWS::DynamoDB::Table",
        "DeletionPolicy": "Retain",
        "Properties": {
            "TableName": "Games",
```

------
#### [ Example YAML ]

```
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
```

------

### 2단계. 드리프트된 리소스, 관련 파라미터 및 출력 제거
<a name="resource-import-resolve-drift-console-step-02-remove-drift"></a>

**드리프트된 리소스, 관련 파라미터 및 출력을 제거하려면**

1. **업데이트(Update)**를 선택한 다음 스택 세부 정보(Stack details) 창에서 **현재 템플릿 교체(Replace current template)**를 선택합니다.

1. **템플릿 지정(Specify template)** 페이지에서 다음 방법 중 하나를 사용하여 스택 템플릿에서 제거된 리소스, 관련 파라미터 및 출력을 업데이트된 템플릿에 제공합니다.
   + **Amazon S3 URL**을 선택한 다음, 텍스트 상자에 템플릿의 URL을 지정합니다.
   + **템플릿 파일 업로드**를 선택한 다음 템플릿을 찾습니다.

   그리고 **다음**을 선택합니다.

1. **스택 세부 정보 지정(Specify stack details)** 페이지를 검토하고 **다음(Next)**을 선택합니다.

1. **스택 옵션 구성(Configure stack options)** 페이지를 검토하고 **다음(Next)**을 선택합니다.

1. ***stack-name* 검토(Review stack-name)** 페이지에서 **스택 업데이트(Update stack)**를 선택합니다.

*결과*: 스택의 **Events**(이벤트) 페이지에서 **Logical ID**(논리적 ID) `GamesTable`이 `DELETE_SKIPPED` 상태입니다.

CloudFormation이 스택 업데이트 작업을 완료할 때까지 기다립니다. 스택 업데이트 작업이 완료되면 스택 템플릿에서 리소스, 관련 파라미터 및 출력을 제거합니다. 그런 다음 업데이트된 템플릿을 가져옵니다. 이러한 작업을 완료한 후 예제 템플릿은 다음과 같습니다.

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

### 3단계. 리소스의 라이브 상태와 일치하도록 템플릿 업데이트
<a name="resource-import-resolve-drift-console-step-03-update-template"></a>

**리소스의 라이브 상태와 일치하도록 템플릿을 업데이트하려면**

1. 업데이트된 템플릿을 가져오려면 **스택 작업(Stack actions)**을 선택한 다음 **리소스를 스택으로 가져오기(Import resources into stack)**를 선택합니다.  
![\[콘솔의 스택으로 리소스 가져오기 옵션.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/stack-actions-import.png)

1. **가져오기 개요(Import overview)** 페이지에서 이 작업 중에 제공해야 하는 항목 목록을 검토한 후 **다음(Next)**을 선택합니다.

1. **Specify template(템플릿 지정)** 페이지에서 다음 방법 중 하나를 사용하여 업데이트된 템플릿을 제공합니다.
   + **Amazon S3 URL**을 선택한 다음, 텍스트 상자에 템플릿의 URL을 지정합니다.
   + **템플릿 파일 업로드**를 선택한 다음 템플릿을 찾습니다.

   그리고 **다음**을 선택합니다.

1. **Identify resources(리소스 식별)** 페이지에서 각 대상 리소스를 식별합니다. 자세한 내용은 [리소스 식별자](import-resources-manually.md#resource-import-identifiers-unique-ids) 섹션을 참조하세요.

   1. **Identifier property(식별자 속성)**에서 리소스 식별자의 유형을 선택합니다. 예를 들어, `TableName` 속성은 `AWS::DynamoDB::Table` 리소스를 식별합니다.

   1. **식별자 값(Identifier value)**에서 실제 속성 값을 입력합니다. 예제 템플릿에서 `GamesTable` 리소스의 `TableName`은 `Games`입니다.

   1. **다음**을 선택합니다.

1. **스택 세부 정보 지정(Specify stack details)** 페이지를 검토하고 **다음(Next)**을 선택합니다.

1. **가져오기 개요(Import overview)** 페이지에서 가져올 리소스를 검토한 다음 **리소스 가져오기(Import resources)**를 선택합니다. 그러면 `AWS::DynamoDB::Table` 리소스 유형을 다시 스택으로 가져오게 됩니다.

*결과*: 이 예제에서는 서비스를 중단하지 않고 가져오기 작업을 통해 리소스 드리프트를 해결했습니다. CloudFormation 콘솔의 [이벤트(Events)] 탭에서 가져오기 작업의 진행 상황을 확인할 수 있습니다. 가져온 리소스가 `IMPORT_COMPLETE` 상태가 된 다음 `CREATE_COMPLETE` 상태가 되고 상태 이유로 **리소스 가져오기 완료(Resource import complete)**가 표시됩니다.

CloudFormation이 스택 업데이트 작업을 완료할 때까지 기다립니다. 스택 업데이트 작업이 완료되면 리소스의 실제 드리프트된 상태와 일치하도록 템플릿을 업데이트합니다. 예를 들어 `BillingMode`는 `PAY_PER_REQUEST` 및 `ReadCapacityUnits`로 설정되고 `WriteCapacityUnits`는 `0`으로 설정됩니다.

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "DeletionPolicy": "Retain",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PAY_PER_REQUEST",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 0,
                    "WriteCapacityUnits": 0
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
      ProvisionedThroughput:
        ReadCapacityUnits: 0
        WriteCapacityUnits: 0
```

------