偵測堆疊集合中非受管的組態變更 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

偵測堆疊集合中非受管的組態變更

即使您管理堆疊及其中包含的資源 CloudFormation,使用者也可以在以外變更這些資源 CloudFormation。使用者可以使用建立資源的基礎服務來直接編輯資源。藉由在堆疊集合上執行漂移偵測,您可以判斷是否有任何屬於該堆疊集合的堆疊執行個體與其預期組態出現差異 (或是產生了漂移)。

如何在堆棧集上 CloudFormation 執行漂移檢測

當在堆棧集上 CloudFormation 執行漂移檢測時,它會在與堆棧集中的每個堆棧實例相關聯的堆棧上執行漂移檢測。為了執行此作業, CloudFormation 會將堆疊中每個資源目前的狀態與該資源的預期狀態進行比較,如堆疊範本及任何指定輸入參數所定義。如果資源目前的狀態與預期狀態不同,便會將該資源視為已偏離。如果堆疊中有一或多個資源產生偏離,便會將堆疊本身視為已偏離,且也會將與該堆疊建立關聯的堆疊執行個體視為已偏離。如果堆疊中有一或多個堆疊執行個體產生偏離,也會將堆疊集合本身視為已偏離。

漂移偵測可識別未受管理的變更,也就是對堆疊之外所做的 CloudFormation變更。直 CloudFormation 接對堆棧而不是在堆棧集級別進行的更改不被視為漂移。例如,假設您有一個與堆疊集合中堆疊執行個體建立關聯的堆疊。如果您使 CloudFormation 用更新該堆棧以使用不同的模板,則不會被視為漂移,即使該堆棧現在具有與屬於堆棧集的任何其他堆棧不同的模板。這是因為堆疊仍然與其預期範本和 CloudFormation 中的參數組態相符。

如需如何在堆疊上 CloudFormation 執行漂移偵測的詳細資訊,請參閱偵測堆疊和資源的未受管組態變更

由於在每個堆疊上分別 CloudFormation 執行漂移偵測,因此在判斷堆疊是否已漂移時,會將任何重寫的參數值納入考量。如需覆寫堆疊執行個體中範本參數的詳細資訊,請參閱 覆寫堆疊執行個體上的參數

如果您直接在與堆疊執行個體相關聯的堆疊上執行漂移偵測,則這些漂移結果無法從StackSets主控台頁面取得。

使用偵測堆疊集上的漂移 AWS Management Console
  1. 請在以下位置開啟 AWS CloudFormation 主控台。 https://console.aws.amazon.com/cloudformation

  2. StackSets頁面上,選取您要執行漂移偵測的堆疊集。

  3. Actions (動作) 選單中,選取 Detect drifts (偵測偏離)

    CloudFormation 顯示資訊列,說明已針對所選堆疊組啟動漂移偵測。

  4. 選用:監控漂移偵測操作的進度:

    1. 選取堆疊集合名稱,以顯示 Stackset details (堆疊集合詳細資訊) 頁面。

    2. 選取 Operations (操作) 標籤、選取漂移偵測操作,然後選取 View drift details (檢視漂移詳細資訊)

    CloudFormation 顯示「作業詳細資訊」對話方塊。

  5. 等待漂移檢測操作 CloudFormation 完成。漂移偵測操作完成後,會 CloudFormation 更新堆疊集的漂移狀態和上次漂移檢查時間。這些欄位會列在所選堆疊集之StackSet 詳細資訊頁面的「概觀」頁籤上。

    漂移偵測操作可能會耗費一些時間,這取決於堆疊集合中所包含的堆疊執行個體數,及包含在堆疊集合中的資源數。您一次只能在指定的堆疊集上執行單一漂移偵測操作。 CloudFormation 即使您關閉資訊列,仍可繼續執行漂移偵測操作。

  6. 如要檢閱堆疊集合中堆疊執行個體的漂移偵測結果,請選取 Stack instances (堆疊執行個體) 標籤。

    Stack name (堆疊名稱) 行會列出與每個堆疊執行個體建立關聯的堆疊名稱,Drift status (偏離狀態) 行則會列出該堆疊的偏離狀態。如果堆疊的一個或多個資源已偏離,堆疊就視為已偏離。

  7. 檢閱與特定堆疊執行個體建立關聯的堆疊漂移偵測結果:

    1. 選擇操作子標籤。

    2. 選擇您想要檢視漂移偵測結果的漂移操作。分割面板將顯示堆疊執行個體狀態和所選操作的原因。對於漂移操作,狀態原因欄顯示堆疊執行個體的漂移狀態。

    3. 選擇您想檢視漂移詳細資訊的堆疊執行個體,然後選擇檢視資源漂移。在資源漂移頁面上,資源漂移狀態表單會列出每項堆疊資源及其漂移狀態,以及上次在資源上啟動漂移偵測的時間。每個資源會顯示邏輯 ID 和實體 ID,以協助您識別它們。

  8. 您可以根據資源的偏移狀態,使用 Drift status (偏離狀態) 欄排序資源。

    檢視已修改過的資源的詳細資訊:

    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 來傳回與堆疊執行個體中每項資源的漂移狀態有關的詳細資訊。

    • 使用 stack-instance-resource-drifts-summary 來傳回與某個堆疊執行個體的資源漂移有關的摘要資訊。

  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 來傳回堆疊集合漂移偵測操作的資訊。在此範例中,操作仍正在執行。在與堆疊集合建立關聯的七個堆疊執行個體中,已找到一個堆疊執行個體已產生漂移,兩個執行個體正在同步,而其餘四個堆疊執行個體的漂移偵測則仍在進行。由於一個執行個體已產生偏離,堆疊集合本身的偏離狀態現在是 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" } }

    稍後執行相同的命令,此範例便會顯示漂移偵測操作完成後傳回的資訊。與此堆疊集合建立關聯的七個堆疊執行個體中,有兩個已產生偏離,使堆疊集合本身的偏離狀態成為 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 命令來傳回與堆疊集合建立關聯的堆疊執行個體摘要資訊,包括每個堆疊執行個體的偏離狀態。

    在此範例中,在範例堆疊集合上執行 list-stack-instances 並將漂移狀態篩選設為 DRIFTED,可讓您識別哪兩個堆疊執行個體的漂移狀態為 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 命令也會傳回此資訊,但只會傳回單一堆疊執行個體的資訊,如以下範例所示。

    $ 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-instancesdescribe-stack-instance命令傳回的堆疊執行個體相關資訊來執行 list-stack-instance-resource- drifts。此命令會傳回堆疊中已為特定漂移操作產生漂移的資源的詳細資訊。

    以下範例使用 stack-instance-resource-drift-statuses 參數,以請求在上一個漂移操作範例中已修改或已刪除資源的堆疊漂移資訊。該請求傳回已修改的一項資源的相關資訊,包括它的兩項屬性及其更改值的詳細資訊。未刪除任何資源。

    $ 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. 請在以下位置開啟 AWS CloudFormation 主控台。 https://console.aws.amazon.com/cloudformation

  2. StackSets頁面上,選取堆疊集的名稱。

    CloudFormation 顯示所選堆疊集的StackSets 詳細資訊頁面。

  3. StackSets 詳細資訊頁面上,選取作索引標籤,然後選取漂移偵測操作。

  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