

# CloudFormation StackSets でのドリフト検出の実行
<a name="stacksets-drift"></a>

スタックとスタックに含まれるリソースを CloudFormation で管理している場合でも、ユーザーは CloudFormation の外部でそれらのリソースを変更できます。ユーザーは、リソースを作成した基盤となるサービスを使用してリソースを直接編集できます。StackSet でドリフト検出を実行すると、その StackSet に属するスタックインスタンスのいずれかが予想される構成と異なっているか、または*ドリフト*しているかを判断できます。

**Topics**
+ [CloudFormation が StackSet でドリフト検出を実行する方法](#stacksets-drift-how)
+ [StackSet のドリフトを検出する (コンソール)](#stacksets-drift-console-procedure)
+ [StackSet のドリフトを検出する (AWS CLI)](#stacksets-drift-cli-procedure)
+ [StackSet でのドリフト検出の停止](#stacksets-drift-stop)

## CloudFormation が StackSet でドリフト検出を実行する方法
<a name="stacksets-drift-how"></a>

CloudFormation が StackSet でドリフト検出を実行する場合、StackSet 内の各スタックインスタンスに関連付けられたスタックでドリフト検出が実行されます。これを行うために、CloudFormation は、スタック内の各リソースの現在の状態を、スタックのテンプレート、および指定された入力パラメータで定義されているリソースの予想される状態と比較します。リソースの現在の状態が予想される状態と異なる場合、そのリソースはドリフトしたものとみなされます。スタック内の 1 つ以上のリソースがドリフトしている場合、スタック自体がドリフトしたとみなされ、スタックが関連付けられているスタックインスタンスもドリフトしたとみなされます。StackSet 内の 1 つ以上のスタックインスタンスがドリフトした場合、StackSet 自体がドリフトしたとみなされます。

ドリフト検出では、管理されていない変更、つまり CloudFormation の外部にあるスタックに加えられた変更を識別します。StackSet レベルではなく、CloudFormation を介してスタックに直接行った変更は、ドリフトとはみなされません。例えば、StackSet のスタックインスタンスに関連付けられたスタックがあるとします。CloudFormation を使用してそのスタックを更新して別のテンプレートを使用した場合、そのスタックのテンプレートが StackSet に属する他のスタックのテンプレートとは異なるようになった場合でも、ドリフトとはみなされません。これは、スタックが CloudFormation で予想されるテンプレートとパラメータ構成を一致させるためです。

CloudFormation がスタックでドリフト検出を実行する方法の詳細については、[ドリフト検出を使用してスタックとリソースへのアンマネージド型設定変更を検出する](using-cfn-stack-drift.md) を参照してください。

CloudFormation では各スタックで個別にドリフト検出を実行するため、スタックがドリフトしているかどうかを判断する際に、オーバーライドされたパラメータ値が考慮されます。スタックインスタンスでのテンプレートパラメータのオーバーライドの詳細については、「[CloudFormation StackSet 内のスタックのパラメータ値を上書きする](stackinstances-override.md)」を参照してください。

スタックインスタンスに関連付けられた[スタックで直接](using-cfn-stack-drift.md)ドリフト検出を実行する場合、これらのドリフト結果は [**StackSets**] コンソールページからは利用できません。

## StackSet のドリフトを検出する (コンソール)
<a name="stacksets-drift-console-procedure"></a>

**StackSet のドリフトを検出するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. **[StackSets]** ページで、ドリフト検出を実行する StackSet を選択します。

1. [**アクション**] メニューから、[**Detect drifts (ドリフトを検出)**] を選択します。

   CloudFormation により、選択された StackSet に対してドリフト検出が開始されたことを示す情報バーが表示されます。

1. オプション: ドリフト検出オペレーションの進行状況を監視するには:

   1. StackSet 名を選択して、**[Stackset の詳細]** ページを表示します。

   1. [**オペレーション**] タブを選択し、ドリフト検出オペレーションを選択してから、[**View drift details (ドリフトの詳細の表示)**] を選択します。

   CloudFormation に [**Operation details (オペレーションの詳細)**] ダイアログボックスが表示されます。

1. CloudFormation がドリフト検出オペレーションを完了するまで待ちます。ドリフト検出オペレーションが完了すると、CloudFormation によって、StackSet の **[ドリフトステータス]** と **[前回のドリフトチェック時刻]** が更新されます。これらのフィールドは、選択した StackSet の **[StackSet の詳細]** ページの **[概要]** タブにリストされます。

   StackSet に含まれるスタックインスタンスの数や、StackSet に含まれるリソースの数によっては、ドリフト検出オペレーションに時間がかかる場合があります。一度に実行できるドリフト検出オペレーションは、特定の StackSet で 1 つだけです。情報バーを閉じた後でも、CloudFormation によってドリフト検出オペレーションが継続されます。

1. StackSet 内のスタックインスタンスのドリフト検出結果を確認するには、**[スタックインスタンス]** タブを選択します。

   [**スタックの名前**] 列には、各スタックインスタンスに関連付けられたスタックの名前がリストされ、[**ドリフトステータス**] 列にはスタックのドリフトステータスがリストされます。スタックの 1 つ以上のリソースがドリフトした場合、スタックはドリフトしたと見なされます。

1. 特定のスタックインスタンスに関連付けられたスタックのドリフト検出結果を確認するには、次の手順を実行します。

   1. **[操作]** タブを選択します。

   1. 確認するドリフト検出結果のドリフト操作を選択します。分割パネルには、スタックインスタンスのステータスと選択した操作の理由が表示されます。ドリフト操作の場合、ステータス理由の列にはスタックインスタンスのドリフトステータスが表示されます。

   1. 確認するドリフト詳細のスタックインスタンスを選択し、**[リソースドリフトを表示]** を選択します。**「リソースドリフト」**ページの **[リソースドリフトステータス]** テーブルでは、各スタックリソースはそれぞれのドリフトのステータスと、リソースにドリフト検出が実行された最後の時間が一覧表示されます。各リソースの論理 ID と物理 ID は、それらを識別しやすくするために表示されます。

1. ドリフトステータスに基づいてリソースをソートするには、[**ドリフトステータス**] 列を使用します。

   変更されたリソースの詳細を表示する方法

   1. リソースを選択した状態で、**[ドリフト詳細の表示]** を選択します。

     CloudFormation には、その特定リソースのドリフト詳細ページが表示されます。このページには、リソースの違いが一覧表示されます。リソースの予想プロパティ値と現在のプロパティ値も一覧表示されます。
**注記**  
スタックが現在サインインしているリージョンとアカウントと異なるリージョンやアカウントに属している場合、**[ドリフトを検出]** ボタンは無効になり、詳細を表示できなくなります。

## StackSet のドリフトを検出する (AWS CLI)
<a name="stacksets-drift-cli-procedure"></a>

AWS CLI を使用してスタック全体のドリフトを検出するには、次の手順を使用します:

**StackSet のドリフトを検出するには**

1. StackSet 全体と関連するスタックインスタンスのドリフトを検出するには、[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/detect-stack-set-drift.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/detect-stack-set-drift.html) コマンドを使用します。

   次の例では、StackSet `stack-set-drift-example` でドリフト検出を開始します。

   ```
   aws cloudformation detect-stack-set-drift \
       --stack-set-name stack-set-drift-example
   ```

   出力:

   ```
   {
       "OperationId": "c36e44aa-3a83-411a-b503-cb611example"
   }
   ```

1. StackSet ドリフト検出オペレーションは長時間実行されるオペレーションとなる可能性があるため、[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html) コマンドを使用してドリフトオペレーションのステータスをモニタリングします。このコマンドは、**detect-stack-set-drift** コマンドによって返された StackSet オペレーション ID を受け取ります。

   次の例では、前の例のオペレーション ID を使用して、StackSet ドリフト検出オペレーションに関する情報を返します。この例では、オペレーションはまだ実行中です。この StackSet に関連付けられている 7 つのスタックインスタンスのうち、1 つのスタックインスタンスが既にドリフトしていて、2 つのインスタンスが同期しており、残り 4 つのスタックインスタンスのドリフト検出はまだ進行中であることがわかりました。1 つのインスタンスがドリフトしているため、StackSet 自体のドリフトステータスは `DRIFTED` になります。

   ```
   aws cloudformation describe-stack-set-operation \
       --stack-set-name stack-set-drift-example \
       --operation-id c36e44aa-3a83-411a-b503-cb611example
   ```

   出力:

   ```
   {
       "StackSetOperation": {
           "Status": "RUNNING",
           "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole",
           "OperationPreferences": {
               "RegionOrder": []
           },
           "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole",
           "StackSetDriftDetectionDetails": {
               "DriftedStackInstancesCount": 1,
               "TotalStackInstancesCount": 7,
               "LastDriftCheckTimestamp": "2019-12-04T20:34:28.543Z",
               "InSyncStackInstancesCount": 2,
               "InProgressStackInstancesCount": 4,
               "DriftStatus": "DRIFTED",
               "FailedStackInstancesCount": 0
           },
           "Action": "DETECT_DRIFT",
           "CreationTimestamp": "2019-12-04T20:33:13.673Z",
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example",
           "OperationId": "c36e44aa-3a83-411a-b503-cb611example"
       }
   }
   ```

   後で同じコマンドを実行した、この例ではドリフト検出操作が完了した後に返される情報を示しています。この StackSet に関連付けられている合計 7 つのスタックインスタンスのうち 2 つがドリフトしているため、StackSet 自体のドリフトステータスは `DRIFTED` になっています。

   ```
   aws cloudformation describe-stack-set-operation \
       --stack-set-name stack-set-drift-example \
       --operation-id c36e44aa-3a83-411a-b503-cb611example
   ```

   出力:

   ```
   {
       "StackSetOperation": {
           "Status": "SUCCEEDED",
           "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole",
           "OperationPreferences": {
               "RegionOrder": []
           } 
           "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole",
           "EndTimestamp": "2019-12-04T20:37:32.829Z",
           "StackSetDriftDetectionDetails": {
               "DriftedStackInstancesCount": 2,
               "TotalStackInstancesCount": 7,
               "LastDriftCheckTimestamp": "2019-12-04T20:36:55.612Z",
               "InSyncStackInstancesCount": 5,
               "InProgressStackInstancesCount": 0,
               "DriftStatus": "DRIFTED",
               "FailedStackInstancesCount": 0
           },
           "Action": "DETECT_DRIFT",
           "CreationTimestamp": "2019-12-04T20:33:13.673Z",
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example",
           "OperationId": "c36e44aa-3a83-411a-b503-cb611example"
       }
   }
   ```

1. StackSet ドリフト検出オペレーションが完了したら、**describe-stack-set**、**list-stack-instances**、**describe-stack-instance**、**list-stack-instance-resource-drifts** コマンドを使用して結果を確認します。

   [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set.html) コマンドには、**describe-stack-set-operation** コマンドで返されるのと同じ詳細なドリフト情報が含まれます。

   ```
   aws cloudformation describe-stack-set \
       --stack-set-name stack-set-drift-example
   ```

   出力:

   ```
   {
       "StackSet": {
           "Status": "ACTIVE",
           "Description": "Demonstration of drift detection on stack sets.",
           "Parameters": [],
           "Tags": [
               {
                   "Value": "Drift detection",
                   "Key": "Feature"
               }
           ], 
           "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole",
           "Capabilities": [],
           "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole",
           "StackSetDriftDetectionDetails": {
               "DriftedStackInstancesCount": 2,
               "TotalStackInstancesCount": 7,
               "LastDriftCheckTimestamp": "2019-12-04T20:36:55.612Z",
               "InProgressStackInstancesCount": 0,
               "DriftStatus": "DRIFTED",
               "DriftDetectionStatus": "COMPLETED",
               "InSyncStackInstancesCount": 5,
               "FailedStackInstancesCount": 0
           },
           "StackSetARN": "arn:aws:cloudformation:us-east-1:123456789012:stackset/stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example",
           "TemplateBody": [details omitted],
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22ebexample",
           "StackSetName": "stack-set-drift-example"
       }
   }
   ```

   [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instances.html) コマンドを使用して、各スタックインスタンスのドリフトステータスなど、StackSet に関連付けられたスタックインスタンスに関する概要情報を返すことができます。

   この例では、ドリフトステータスフィルターを `DRIFTED` に設定した状態で例の StackSet に **list-stack-instances** を実行すると、2 つのスタックインスタンスのうち、どちらが `DRIFTED` のドリフトステータスになっているかを特定できるようになります。

   ```
   aws cloudformation list-stack-instances \
       --stack-set-name stack-set-drift-example \
       --filters Name=DRIFT_STATUS,Values=DRIFTED
   ```

   出力:

   ```
   {
   "Summaries": [
           {
   "StackId": "arn:aws:cloudformation:eu-west-1:123456789012:stack/StackSet-stack-set-drift-example-b0fb6083-60c0-4e39-af15-2f071e0db90c/0e4f0940-16d4-11ea-93d8-0641cexample",
               "Status": "CURRENT",
               "Account": "012345678910",
               "Region": "eu-west-1",
               "LastDriftCheckTimestamp": "2019-12-04T20:37:32.687Z",
               "DriftStatus": "DRIFTED",
               "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample",
               "LastOperationId": "c36e44aa-3a83-411a-b503-cb611example"
           },
           {
               "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example",
               "Status": "CURRENT",
               "Account": "123456789012",
               "Region": "us-east-1",
               "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z",
               "DriftStatus": "DRIFTED",
               "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample",
               "LastOperationId": "c36e44aa-3a83-411a-b503-cb611example"
           },
           
           [additional stack instances omitted]
    
       ]
   }
   ```

   [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-instance.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-instance.html) コマンドでもこの情報は返されますが、以下の例のように 1 つのスタックインスタンスに対する情報です。

   ```
   aws cloudformation describe-stack-instance \
       --stack-set-name stack-set-drift-example \
       --stack-instance-account 012345678910 --stack-instance-region us-east-1
   ```

   出力:

   ```
   {
       "StackInstance": {
           "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example",
           "Status": "CURRENT",
           "Account": "123456789012",
           "Region": "us-east-1",
           "ParameterOverrides": [],
           "DriftStatus": "DRIFTED",
           "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z",
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample",
           "LastOperationId": "c36e44aa-3a83-411a-b503-cb611example"
       }
   }
   ```

1. どのスタックインスタンスがドリフトしたかを特定したら、**list-stack-instances** コマンドまたは **describe-stack-instance** コマンドによって返されるスタックインスタンスに関する情報を使用して、[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instance-resource-drifts.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instance-resource-drifts.html) コマンドを実行できます。このコマンドは、スタックでどのリソースが、特定のドリフト操作でドリフトしたかに関する詳細情報を返します。

   次の例では、`--stack-instance-resource-drift-statuses` パラメーターを使用して、以前のドリフト操作の例で変更または削除されたリソースのスタックドリフト情報を要求しています。リクエストは、2 つのプロパティに関する詳細とそれぞれの変更された値を含め、変更された 1 つのリソースに関する情報を返します。リソースは削除されていません。

   ```
   aws cloudformation list-stack-instance-resource-drifts \
       --stack-set-name my-stack-set-with-resource-drift \
       --stack-instance-account 123456789012 \
       --stack-instance-region us-east-1 \
       --operation-id c36e44aa-3a83-411a-b503-cb611example \
       --stack-instance-resource-drift-statuses MODIFIED DELETED
   ```

   出力:

   ```
   {
       "Summaries": [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/my-stack-set-with-resource-drift/489e5570-df85-11e7-a7d9-50example",
               "ResourceType": "AWS::SQS::Queue",
               "Timestamp": "2018-03-26T17:23:34.489Z",
               "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/123456789012/my-stack-with-resource-drift-Queue-494PBHCO76H4",
               "StackResourceDriftStatus": "MODIFIED",
               "PropertyDifferences": [
                   {
                       "PropertyPath": "/DelaySeconds",
                       "ActualValue": "120",
                       "ExpectedValue": "20",
                       "DifferenceType": "NOT_EQUAL"
                   },
                   {
                       "PropertyPath": "/RedrivePolicy/maxReceiveCount",
                       "ActualValue": "12",
                       "ExpectedValue": "10",
                       "DifferenceType": "NOT_EQUAL"
                   }
               ],
               "LogicalResourceId": "Queue"
           }
       ]
   }
   ```

## StackSet でのドリフト検出の停止
<a name="stacksets-drift-stop"></a>

StackSet のドリフト検出は長時間実行されるオペレーションになる可能性があるため、StackSet で現在実行中のドリフト検出オペレーションを停止するのが望ましい場合があります。

**StackSet のドリフト検出を停止するには (コンソール)**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. **[StackSets]** ページで、StackSet の名前を選択します。

   CloudFormation に選択した StackSet の **[StackSets の詳細]** ページが表示されます。

1. [**StackSets details (セットのスタックセットの詳細)**] ページで、[**オペレーション**] タブを選択し、ドリフト検出オペレーションを選択します。

1. [**Stop operation (オペレーションを停止)**] を選択します。

**StackSet のドリフト検出を停止するには (AWS CLI)**
+ [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/stop-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/stop-stack-set-operation.html) コマンドを使用します。ドリフト検出 StackSet オペレーションの StackSet 名とオペレーション ID の両方を指定する必要があります。

  ```
  aws cloudformation stop-stack-set-operation \
      --stack-set-name stack-set-drift-example \
      --operation-id 624af370-311a-11e8-b6b7-500cexample
  ```