スタックセット内のアンマネージド型の設定変更の検出 - AWS CloudFormation

スタックセット内のアンマネージド型の設定変更の検出

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

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

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

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

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

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

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

AWS マネジメントコンソール を使用してスタックのドリフトを検出するには

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. スタックインスタンスの [AWS アカウント]、[スタックの名前]、[AWS リージョン] をメモします。

    2. AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

      スタックインスタンスを含む AWS アカウントにログインします。

    3. スタックインスタンスを含む AWS リージョンを選択します。

    4. 左側のナビゲーションペインで、[スタック] を選択します。

    5. 表示するスタックを選択し、[ドリフト] を選択します。

      CloudFormation には、指定したスタックインスタンスに関連付けられたスタックの [ドリフト] ページを表示されます。

    [リソースのドリフトステータス] セクションに、CloudFormation で各スタックリソース、そのドリフトステータス、およびリソースで最後にドリフト検出が開始された時刻がリスト表示されます。各リソースの論理 ID と物理 ID は、それらを識別しやすくするために表示されます。さらに、ステータスが [MODIFIED (変更済み)] のリソースの場合、CloudFormation はリソースドリフトの詳細を表示します。

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

    1. 変更されたリソースの詳細を表示します。

      1. 変更されたリソースを選択した状態で、[View drift details (ドリフトの詳細を表示)] を選択します。

        CloudFormation により、そのリソースのドリフト詳細ページが表示されます。このページに、リソースの意図した値と現在のプロパティ値、およびその 2 つの違いがリスト表示されます。

        違いを強調表示するには、[違い] セクションでプロパティ名を選択します。

        • 追加されたプロパティは [詳細] セクションの列 [最新の] で緑色で強調表示されます。

        • 削除されたプロパティは [詳細] セクションの列 [Expected] で赤色で強調表示されます。

        • 値が変更されたプロパティは、[予定] 列と [Current (最新の)] 列の両方で青色で強調表示されます。

    
                    [ドリフトの詳細] ページのリソースのドリフトステータスセクションには、ドリフト検出をサポートするスタック内の各リソースのドリフト情報が含まれています。詳細には、ドリフトステータス、意図した値、現在のプロパティ値などがあります。

AWS CLI を使用してスタックセットのドリフトを検出するには

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

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

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

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

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

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

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

  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::012345678910: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::012345678910: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-stackinstances、および describe-stack-instance コマンドを使用して結果を確認します。

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

    この例では、サンプルスタックセットで list-stack-instances を実行することにより、ドリフトステータスが DRIFTED のある 2 つのスタックインスタンスを識別できます。

    aws cloudformation list-stack-instances --stack-set-name stack-set-drift-example { "Summaries": [ { "StackId": "arn:aws:cloudformation:ap-northeast-1:012345678910:stack/StackSet-stack-set-drift-example-29168cdd-e587-4709-8a1f-90f752ec65e1/1a8a98f0-16d4-11ea-9844-060a5example", "Status": "CURRENT", "Account": "012345678910", "Region": "ap-northeast-1", "LastDriftCheckTimestamp": "2019-12-04T20:36:18.481Z", "DriftStatus": "IN_SYNC", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample" }, { "StackId": "arn:aws:cloudformation:eu-west-1:012345678910: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" }, { "StackId": "arn:aws:cloudformation:us-east-1:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example", "Status": "CURRENT", "Account": "012345678910", "Region": "us-east-1", "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z", "DriftStatus": "DRIFTED", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample" }, [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:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example", "Status": "CURRENT", "Account": "012345678910", "Region": "us-east-1", "ParameterOverrides": [], "DriftStatus": "DRIFTED", "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z", "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample" } }
  4. どのスタックインスタンスがドリフトしたかを特定したら、list-stack-instances コマンドまたは describe-stack-instance コマンドによって返されるスタックインスタンスに関する情報を使用して、describe-stack-resource-drifts を実行できます。このコマンドは、スタック内のどのリソースがドリフトしたかに関する詳細情報を返します。

    次の例では、上記の例の list-stack-instances コマンドによって返されたドリフトしたスタックのいずれかのスタック ID を使用して、CloudFormation の外部で変更または削除されたリソースに関する詳細情報を返します。このスタックでは、AWS::SQS::Queue リソースの 2 つのプロパティ、DelaySecondsmaxReceiveCount が変更されています。

    aws cloudformation describe-stack-resource-drifts --stack-name arn:aws:cloudformation:us-east-1:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example --stack-resource-drift-status-filters "MODIFIED" "DELETED" { "StackResourceDrifts": [ { "StackId": "arn:aws:cloudformation:us-east-1:012345678910:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f8925a37c4", "ActualProperties": "{\"DelaySeconds\":10,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:012345678910:StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2-DLQ-1H0SQCOKALBDJ\",\"maxReceiveCount\":20},\"VisibilityTimeout\":60}", "ResourceType": "AWS::SQS::Queue", "Timestamp": "2019-12-04T20:33:57.261Z", "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/012345678910/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2-Queue-6FNDEY4AUEPV", "StackResourceDriftStatus": "MODIFIED", "ExpectedProperties": "{\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:012345678910:StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2-DLQ-1H0SQCOKALBDJ\",\"maxReceiveCount\":10},\"VisibilityTimeout\":60}", "PropertyDifferences": [ { "PropertyPath": "/DelaySeconds", "ActualValue": "10", "ExpectedValue": "20", "DifferenceType": "NOT_EQUAL" }, { "PropertyPath": "/RedrivePolicy/maxReceiveCount", "ActualValue": "20", "ExpectedValue": "10", "DifferenceType": "NOT_EQUAL" } ], "LogicalResourceId": "Queue" } ] }

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

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

AWS マネジメントコンソール を使用してスタックセットのドリフト検出を停止するには

  1. AWS CloudFormation コンソール (https://console.aws.amazon.com/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