

# 전체 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"
           }
       ]
   }
   ```