CloudFormation コンソールまたは AWS CLI を使用したスタックセットドリフトの検出 - AWS CloudFormation

CloudFormation コンソールまたは AWS CLI を使用したスタックセットドリフトの検出

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

CloudFormation がスタックセットでドリフト検出を実行する方法

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

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

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

CloudFormation では各スタックで個別にドリフト検出を実行するため、スタックがドリフトしているかどうかを判断する際に、オーバーライドされたパラメータ値が考慮されます。スタックインスタンスでのテンプレートパラメータのオーバーライドの詳細については、「CloudFormation コンソールまたは AWS CLI を使用してパラメータ値を上書きする」を参照してください。

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

スタックセットのドリフトを検出するには (コンソール)
  1. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

  2. [StackSets] ページで、ドリフト検出を実行するスタックセットを選択します。

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

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

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

    1. スタックセット名を選択して、[Stackset details (スタックセットの詳細)] ページを表示します。

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

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

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

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

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

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

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

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

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

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

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

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

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

      CloudFormation には、その特定リソースのドリフト詳細ページが表示されます。このページには、リソースの違いが一覧表示されます。リソースの予想プロパティ値と現在のプロパティ値も一覧表示されます。

      注記

      スタックが現在サインインしているリージョンとアカウントと異なるリージョンやアカウントに属している場合、[ドリフトを検出] ボタンは無効になり、詳細を表示できなくなります。

スタックセットのドリフトを検出するには (AWS CLI)

AWS CLI を使用してスタック全体のドリフトを検出するには、次の aws cloudformation コマンドを使用します。

  • detect-stack-set-drift はスタックでドリフト検出オペレーションを開始します。

  • describe-stack-set-operation はスタックドリフト検出動作の状態を監視します。

  • ドリフト検出操作が完了したら、次のコマンドを使用して必要なドリフト情報を返します。

    • スタックセットに関する詳細情報(スタックセットで最後に完了したドリフト操作に関する詳細情報を含む)を返すには、describe-stack-set を使用します。(進行中のドリフト操作に関する情報は含まれません。)

    • 各インスタンスのドリフトステータスと最後にチェックされたドリフト時間を含む、スタックセットに属するスタックインスタンスのリストを返すには、list-stack-instances を使用します。

    • 特定のスタックインスタンスに関する詳細情報(ドリフトステータスや最後にチェックされたドリフト時間など)を返すには、describe-stack-instance を使用します。

    • list-stack-instance-resource-drifts を使用して、スタックインスタンス内にある各リソースのドリフトステータスに関する詳細情報と、スタックインスタンスのリソースドリフトに関する要約情報を返します。

  1. スタックセット全体と関連するスタックインスタンスのドリフトを検出するには、detect-stack-set-drift を使用します。

    次の例では、スタックセット stack-set-drift-example でドリフト検出を開始します。

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

    出力:

    { "OperationId": "c36e44aa-3a83-411a-b503-cb611example" }
  2. スタックセットドリフト検出オペレーションは長時間実行されるオペレーションとなる可能性があるため、describe-stack-set-operation を使用してドリフトオペレーションのステータスを監視します。このコマンドは、detect-stack-set-drift コマンドによって返されたスタックセットオペレーション ID を受け取ります。

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

    後で同じコマンドを実行した、この例ではドリフト検出操作が完了した後に返される情報を示しています。このスタックセットに関連付けられている合計 7 つのスタックインスタンスのうち 2 つがドリフトしているため、スタックセット自体のドリフトステータスは 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" } }
  3. スタックセット ドリフトの検出操作が完了したら、describe-stack-setlist-stack-instancesdescribe-stack-instancelist-stack-instance-resource-drifts コマンドを使用して結果を確認します。

    describe-stack-set コマンドには、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" } }

    list-stack-instances コマンドを使用して、各スタックインスタンスのドリフトステータスなど、スタックセットに関連付けられたスタックインスタンスに関する概要情報を返すことができます。

    この例では、ドリフトステータス フィルターを DRIFTED に設定した状態で例のスタックセットに 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] ] }

    describe-stack-instance コマンドでもこの情報は返されますが、以下の例のように 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" } }
  4. どのスタックインスタンスがドリフトしたかを特定したら、list-stack-instances コマンドまたは describe-stack-instance コマンドによって返されるスタックインスタンスに関する情報を使用して、list-stack-instance-resource-drifts を実行できます。このコマンドは、スタックでどのリソースが、特定のドリフト操作でドリフトしたかに関する詳細情報を返します。

    次の例では、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" } ] }

スタックセットでのドリフト検出の停止

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

AWS Management Console を使用してスタックセットのドリフト検出を停止するには
  1. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

  2. [StackSets] ページで、スタックセットの名前を選択します。

    CloudFormation に選択したスタック [StackSets details (スタックセットの詳細)] ページが表示されます。

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

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

AWS CLI を使用してスタックセットのドリフト検出を停止するには
  • stop-stack-set-operationコマンドを実行します。ドリフト検出スタックセットオペレーションのスタックセット名とオペレーション ID の両方を指定する必要があります。

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