

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

# 透過漂移偵測功能，偵測堆疊和資源的未受管組態變更
<a name="using-cfn-stack-drift"></a>

正當您透過 CloudFormation 管理資源時，使用者可以在 CloudFormation 的外部變更這些資源。使用者可以使用建立資源的基礎服務來直接編輯資源。例如，您可以使用 Amazon EC2 主控台來更新已建立成為 CloudFormation 堆疊一部分的伺服器執行個體。有些變更可能是意外，有些則是為了回應時間急迫性運作事件而刻意為之。無論如何，在 CloudFormation 外部所做的變更會使堆疊更新或刪除操作變得複雜。您可以使用漂移偵測來識別已在 CloudFormation 管理之外發生組態變更的堆疊資源。然後，您可以採取矯正動作，讓堆疊資源與堆疊範本中的定義再次同步，例如直接更新偏離的資源，以符合其範本定義。解決偏離有助於確保組態一致性和成功的堆疊操作。

**Topics**
+ [什麼是偏離？](#what-is-drift)
+ [漂移偵測狀態碼](#drift-status-codes)
+ [偵測偏離時的考量](#drift-considerations)
+ [在整個 CloudFormation 堆疊上偵測偏離](detect-drift-stack.md)
+ [在個別堆疊資源上偵測偏離](detect-drift-resource.md)
+ [透過匯入作業解決漂移](resource-import-resolve-drift.md)

## 什麼是偏離？
<a name="what-is-drift"></a>

漂移偵測可讓您偵測堆疊的實際組態是否不同於 (或已*漂移*) 其預期組態。使用 CloudFormation 在整個堆疊或堆疊內的個別資源上偵測偏離。如果資源的任何實際屬性值不同於預期的屬性值，資源就視為已偏離。這包括是否已刪除屬性或資源。如果堆疊的一個或多個資源已偏離，堆疊就視為已偏離。

為了判斷資源是否已漂移，CloudFormation 會決定堆疊範本中定義的預期資源屬性值，以及指定為範本參數的任何值。CloudFormation 接著會比較目前存在於堆疊中的資源屬性的預期值與實際值。如果資源的一個或多個屬性已遭刪除，或值已變更，資源就視為已偏離。

CloudFormation 會針對堆疊中已偏離的每個資源產生詳細資訊。

CloudFormation 會偵測那些支援偏離偵測 AWS 的資源上的偏離。不支援資源漂移偵測的資源會指派為 NOT\_CHECKED 的漂移狀態。如需支援偏離偵測 AWS 的資源清單，請參閱 [資源類型支援](resource-import-supported-resources.md)。

此外，CloudFormation 還支援*可佈建*之私有資源類型的漂移偵測；也就是說，佈建類型為 `FULLY_MUTABLE` 或 `IMMUTABLE`。若要對私人資源類型的資源執行漂移偵測，您在帳號中註冊之資源類型的預設版本必須是可佈建的資源。如需有關資源佈建類型的詳細資訊，請參閱《*AWS CloudFormation API 參考*》中 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html) 動作的 `ProvisioningType`，與《*AWS CLI 命令參考*》中 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html) 命令的該參數。如需私有資源的詳細資訊，請參閱 [使用 CloudFormation 登錄檔管理擴充功能](registry.md)。

您可以在處於下列狀態的堆疊上執行漂移偵測：`CREATE_COMPLETE`、`UPDATE_COMPLETE`、`UPDATE_ROLLBACK_COMPLETE` 和 `UPDATE_ROLLBACK_FAILED`。

在堆疊上偵測偏離時，CloudFormation 不會在任何屬於該堆疊的巢狀堆疊上偵測偏離。如需詳細資訊，請參閱[運用巢狀堆疊，將範本分割成可重複使用的部分](using-cfn-nested-stacks.md)。反而是，您可以直接在巢狀堆疊上啟動漂移偵測操作。

**注意**  
CloudFormation 只會針對透過堆疊範本或經由指定範本參數而明確設定的屬性值，判斷是否偏離。這不包含資源屬性的預設值。如果是為了判斷偏離而讓 CloudFormation 追蹤資源屬性，請明確設定屬性值 (即使設為預設值)。CloudFormation 也會偵測堆疊層級標籤的偏離。

## 漂移偵測狀態碼
<a name="drift-status-codes"></a>

本節中的表格描述用於漂移偵測的各種狀態類型：
+ **漂移偵測操作狀態**描述漂移操作的目前狀態。
+ **Drift status (偏離狀態)** 

  針對「堆疊集合」，這會描述整個堆疊集合的偏離狀態，而此狀態是以屬於該堆疊集合堆疊執行個體的偏離狀態為基礎。

  針對「堆疊執行個體」，這會描述堆疊執行個體的偏離狀態，而此狀態是以其相關聯堆疊的偏離狀態為基礎。

  針對「堆疊」，這會描述整個堆疊的偏離狀態，而此狀態是以其資源的偏離狀態為基礎。
+ **資源偏離狀態**描述個別資源的偏離狀態。

下表列出 CloudFormation 指派給堆疊漂移偵測操作的狀態代碼。


| 漂移偵測操作狀態 | Description | 
| --- | --- | 
| `DETECTION_COMPLETE` | 對於堆疊中支援漂移偵測的所有資源，堆疊漂移偵測操作已成功完成。 | 
| `DETECTION_FAILED` | 堆疊中至少一個資源的堆疊漂移偵測操作已失敗。CloudFormation 成功完成漂移偵測的資源會有結果。 | 
| `DETECTION_IN_PROGRESS` | 堆疊漂移偵測操作目前進行中。 | 

下表列出 CloudFormation 指派給堆疊的偏離狀態代碼。


| Drift status (偏離狀態) | Description | 
| --- | --- | 
| `DRIFTED` | 針對堆疊：堆疊不同於或已「偏離」**其預期範本組態。如果堆疊的一個或多個資源已偏離，堆疊就視為已偏離。<br />針對堆疊執行個體：如果與其相關聯的堆疊已發生偏離，則會將堆疊執行個體視為已偏離。<br />針對堆疊集合：如果有一或多個堆疊執行個體已發生偏離，則會將堆疊集合視為已偏離。 | 
| `NOT_CHECKED` | CloudFormation 尚未檢查堆疊、堆疊集合或堆疊執行個體是否與其預期範本組態不同。 | 
| `IN_SYNC` | 每個受支援資源的目前組態符合其預期範本組態。沒有支援漂移偵測資源的堆疊、堆疊集合，或堆疊執行個體，其狀態也會是 IN\_SYNC。 | 

下表列出 CloudFormation 指派給堆疊資源的偏離狀態代碼。


| 資源偏離狀態 | Description | 
| --- | --- | 
| `DELETED` | 資源不同於其預期範本組態，因為已刪除資源。 | 
| `MODIFIED` | 資源不同於其預期範本組態。 | 
| `NOT_CHECKED` | CloudFormation 未檢查資源是否不同於其預期範本組態。 | 
| `IN_SYNC` | 資源的目前組態符合其預期範本組態。 | 

針對不同於預期範本組態的資源屬性，下表列出 CloudFormation 指派這些資源屬性的差異類型狀態代碼。


| 屬性差異類型 | Description | 
| --- | --- | 
| `ADD` | 作為陣列或清單資料類型的資源屬性已新增一個值。 | 
| `REMOVE` | 已從目前的資源組態中移除屬性。 | 
| `NOT_EQUAL` | 目前的屬性值不同於堆疊範本中定義的預期值。 | 

## 偵測偏離時的考量
<a name="drift-considerations"></a>

為了在堆疊上成功執行漂移偵測，使用者必須有以下許可：
+ 對於堆疊包含的每個支援漂移偵測的資源，需要有讀取許可。例如，如果堆疊包含 `AWS::EC2::Instance` 資源，則您必須有 `ec2:DescribeInstances` 許可，才能在堆疊上執行漂移偵測。
+ `cloudformation:DetectStackDrift`
+ `cloudformation:DetectStackResourceDrift`
+ `cloudformation:BatchDescribeTypeConfigurations`

如需有關 CloudFormation 中的設定許可的詳細資訊，請參閱 [使用 控制 CloudFormation 存取 AWS Identity and Access Management](control-access-with-iam.md)。

在某些極端案例中，CloudFormation 可能無法總是傳回準確的偏離結果。您應該注意這些極端案例，以適當解讀您的漂移偵測結果。
+ 在某些情況下，屬性陣列包含的物件會回報為偏離，而事實上，它們是由負責資源的基礎服務提供給屬性的預設值。
+ 某些資源與相關資源之間存在附加關係，以致於一個資源實際上可能連接或移除其他資源 (在同一個或另一個範本中定義) 的屬性值。例如，`AWS::EC2::SecurityGroupIngress` 和 `AWS::EC2::SecurityGroupEgress` 資源可用來連接和移除 `AWS::EC2::SecurityGroup` 資源的值。在這些情況下，CloudFormation 在執行偏離比較之前會分析堆疊範本找出附加項。不過，CloudFormation 無法跨堆疊執行此分析，因此當附加的資源位於不同的堆疊時，可能不會傳回準確的偏離結果。

  支援漂移偵測且允許或需要從其他資源附加的資源包括：    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)
+ CloudFormation 不會在任何資源的 `KMSKeyId` 屬性上執行漂移偵測。由於多個別名可以參考 AWS KMS 金鑰，CloudFormation 無法保證此屬性的一致準確偏離結果。
+ 您在堆疊範本中可指定的某些資源屬性，在本質上，無法供 CloudFormation 與產生的堆疊資源中的屬性相互比較。因此，這些屬性無法納入漂移偵測結果中。這些屬性分為兩大類：
  + CloudFormation 無法映射的屬性值 (無法往回映射到它們在堆疊範本中的初始資源屬性值)。

    例如，CloudFormation 無法將 Lambda 函式的原始程式碼往回映射到 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) 資源的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html) 屬性類型，因此，CloudFormation 無法將它納入漂移偵測結果中。
  + 負責資源的服務不會傳回的屬性值。

    某些屬性值原本就不可能由資源所屬的服務傳回。這些通常包含機密資訊，例如，不應公開的密碼或其他敏感資料。例如，IAM 服務絕不會傳回 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) 屬性類型的 `Password` 屬性值，因此，CloudFormation 無法將它納入漂移偵測結果中。
  + 陣列中的物件實際上可能是服務預設，而不是手動新增的漂移。
+ 如果您發現任何誤報，請使用 CloudFormation 主控台的意見回饋連結來傳送您的意見，或透過 [AWS re:Post](https://repost.aws/) 聯絡我們。
+ 部分屬性的輸入值可能會相等但不相同。為避免誤報，您應確保預期組態與實際組態相符。
  + 例如，資源屬性的預期組態可能是 1024 MB，而相同資源屬性的實際組態可能是 1 GB。1024 MB 和 1 GB 相等，但不相同。

    如果在此資源屬性上執行漂移偵測，漂移偵測會發出漂移結果訊號。

    若要避免此誤報，請將資源屬性的預期組態變更為 1024 MB，然後執行漂移偵測。