

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

# 透過漂移偵測功能，偵測堆疊和資源的未受管組態變更
<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\$1CHECKED 的漂移狀態。如需支援偏離偵測 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 追蹤資源屬性，請明確設定屬性值 (即使設為預設值)。

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

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

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

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

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

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


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

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


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

下表列出 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，然後執行漂移偵測。

# 在整個 CloudFormation 堆疊上偵測偏離
<a name="detect-drift-stack"></a>

在堆疊上執行漂移偵測操作會判斷堆疊是否已漂移其預期範本組態，然後針對堆疊中每個支援漂移偵測的資源，傳回其漂移狀態的詳細資訊。

**使用 偵測整個堆疊上的偏離 AWS 管理主控台**

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 從堆疊清單中選取要執行漂移偵測的堆疊。在 stack details (堆疊詳細資訊) 窗格中，選擇 **Stack actions (堆疊動作)**，然後選擇 **Detect drift (偵測偏移)**。  
![\[在 Stack actions (堆疊動作) 選單上針對所選堆疊選取 Detect drift for current stack (偵測目前堆疊的偏離) 命令。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/console-stacks-actions-detect-drift-1.png)

   CloudFormation 會顯示資訊列，說明已啟動所選堆疊的漂移偵測。

1. 等待 CloudFormation 完成漂移偵測操作。當漂移偵測操作完成後，CloudFormation 會更新堆疊的 **Drift status (漂移狀態)** 和 **Last drift check time (上次檢查漂移的時間)**。這些欄位會列在堆疊詳細資訊頁面之 **Stack info** (堆疊資訊) 窗格的 **Overview** (概觀) 區段。

   漂移偵測操作可能需要幾分鐘的時間，這取決於堆疊包含的資源數量。您在任一堆疊上同時間只能執行單一漂移偵測操作。即使關閉資訊列，CloudFormation 仍會繼續執行漂移偵測操作。

1. 檢閱堆疊及其資源的漂移偵測結果。在選取堆疊的情況下，從 **Stack actions (堆疊動作)** 選單中選取 **View drift results (檢視偏移結果)**。

   CloudFormation 會列出堆疊的整體漂移狀態，以及上次在堆疊或其任何個別資源上啟動漂移偵測的時間。如果堆疊的一個或多個資源已偏離，堆疊就視為已偏離。  
![\[所選堆疊的 Drift (漂移) 頁面，顯示整體堆疊漂移狀態、漂移偵測狀態，以及上次在堆疊或其個別資源上啟動漂移偵測的時間。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-overview-1.png)

   在 **Resource drift status (資源漂移狀態)** 區段中，CloudFormation 會列出每個堆疊資源、其漂移狀態，以及上次在資源上啟動漂移偵測的時間。每個資源會顯示邏輯 ID 和實體 ID，以協助您識別它們。此外，對於狀態為 **MODIFIED** 的資源，CloudFormation 會顯示資源偏離詳細資訊。

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

   1. 檢視已修改過的資源的詳細資訊。

     1. 在選取已修改資源的情況下，選取 **View drift details (檢視偏離詳細資訊)**。

       CloudFormation 會顯示該資源的偏離詳細資訊頁面。此頁面會顯示資源的預期和目前屬性值，以及兩者間的任何差異。

       若要強調差異，請在 **Differences (差異)** 區段選取屬性名稱。
       + **Details** (詳細資訊) 區段的 **Current** (目前) 欄位會以綠色反白顯示新增的屬性。
       + **Details** (詳細資訊) 區段的 **Expected** (預期) 欄位會以紅色反白顯示刪除的屬性。
       + 值已變更的屬性在 **Expected (預期)** 和 **Current (目前)** 欄中以黃色醒目提示。  
![\[Drift Details (漂移詳細資訊) 的 Resource drift status (資源漂移狀態) 頁面，其中包含堆疊中每個支援漂移偵測的資源的漂移資訊。詳細資訊包括偏離狀態及預期與目前的屬性值。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-drift-details-differences-1.png)

**使用 偵測整個堆疊上的偏離 AWS CLI**
**重要**  
檢閱堆疊的**上次偏離檢查時間**，並確認其早於資源偏離結果中顯示的時間戳記，以防止使用過時資料。

若要使用 偵測整個堆疊上的偏離 AWS CLI，請使用下列 AWS CLI 命令：
+ **detect-stack-drift**：在堆疊上啟動漂移偵測操作。
+ **describe-stack-drift-detection-status**：監控堆疊漂移偵測操作的狀態。
+ **describe-stack-resource-drifts**：檢閱堆疊漂移偵測操作的詳細資訊。

1. 使用 **detect-stack-drift**在整個堆疊上偵測偏離。指定堆疊名稱或 ARN。您也可以指定任何特定資源的邏輯 ID，作為此漂移偵測操作的篩選條件。

   ```
   aws cloudformation detect-stack-drift --stack-name my-stack-with-resource-drift
   ```

   輸出：

   ```
   {
       "StackDriftDetectionId": "624af370-311a-11e8-b6b7-500cexample"
   }
   ```

1. 由於堆疊漂移偵測操作可能會長時間執行，請使用 **describe-stack-drift-detection-status** 監控漂移操作的狀態。此命令接受 **detect-stack-drift** 命令傳回的堆疊漂移偵測 ID。

   在以下範例中，我們接受上述 **detect-stack-drift** 範例所傳回的堆疊漂移偵測 ID，並當作參數傳遞到 **describe-stack-drift-detection-status**。此參數傳回操作詳細資訊，其中指出漂移偵測操作已完成、單一堆疊資源已漂移，也因此整個堆疊視為已漂移。

   ```
   aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
   ```

   輸出：

   ```
   {
       "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
       "StackDriftDetectionId": "624af370-311a-11e8-b6b7-500cexample", 
       "StackDriftStatus": "DRIFTED", 
       "Timestamp": "2018-03-26T17:23:22.279Z", 
       "DetectionStatus": "DETECTION_COMPLETE", 
       "DriftedStackResourceCount": 1
   }
   ```

1. 當堆疊漂移偵測操作完成後，請使用 **describe-stack-resource-drifts** 命令來檢視結果，包括已漂移的資源的實際和預期屬性值。

   以下範例使用 `--stack-resource-drift-status-filters` 選項，以請求已修改或已刪除的資源的堆疊偏離資訊。該請求傳回已修改的一項資源的相關資訊，包括值已變更的兩個屬性的詳細資訊。未刪除任何資源。

   ```
   aws cloudformation describe-stack-resource-drifts --stack-name my-stack-with-resource-drift --stack-resource-drift-status-filters MODIFIED DELETED
   ```

   輸出：

   ```
   {
       "StackResourceDrifts": [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
               "ActualProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":120,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":12},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
               "ResourceType": "AWS::SQS::Queue", 
               "Timestamp": "2018-03-26T17:23:34.489Z", 
               "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/099908667365/my-stack-with-resource-drift-Queue-494PBHCO76H4", 
               "StackResourceDriftStatus": "MODIFIED", 
               "ExpectedProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":10},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
               "PropertyDifferences": [
                   {
                       "PropertyPath": "/DelaySeconds", 
                       "ActualValue": "120", 
                       "ExpectedValue": "20", 
                       "DifferenceType": "NOT_EQUAL"
                   }, 
                   {
                       "PropertyPath": "/RedrivePolicy/maxReceiveCount", 
                       "ActualValue": "12", 
                       "ExpectedValue": "10", 
                       "DifferenceType": "NOT_EQUAL"
                   }
               ], 
               "LogicalResourceId": "Queue"
           }
       ]
   }
   ```

# 在個別堆疊資源上偵測偏離
<a name="detect-drift-resource"></a>

您可以在堆疊內的特定資源上偵測偏離，而非整個堆疊。當您只需要判斷特定資源現在是否再次符合其預期範本組態時，這特別有用。

在資源上執行漂移偵測時，CloudFormation 也會更新整體堆疊漂移狀態和 **Last drift check time (上次漂移檢查時間)** (如適用)。例如，假設堆疊的偏離狀態為 `IN_SYNC`。您讓 CloudFormation 在該堆疊包含的一個或多個資源上執行漂移偵測，CloudFormation 會偵測到其中一個或多個資源已漂移。CloudFormation 將堆疊漂移狀態更新為 `DRIFTED`。反之，假設堆疊因為單一偏離的資源而處於偏離狀態 `DRIFTED`。如果您將該資源設回其預期的屬性值，然後在資源再次偵測偏離，CloudFormation 就會將資源偏離狀態和堆疊偏離狀態都更新為 `IN_SYNC`，您也就不需要在整個堆疊上再次偵測偏離。

**使用 偵測個別資源上的偏離 AWS 管理主控台**

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 從堆疊清單中，選取包含資源的堆疊。CloudFormation 會顯示該堆疊的堆疊詳細資訊。

1. 在左側瀏覽窗格的**Stacks (堆疊)** 下，選擇 **Stack actions (堆疊動作)**，然後選擇 **Detect drift (偵測偏離)**。

1. 在 **Resource drift status (資源偏離狀態)** 下，選擇資源，然後選取**Detect drift for resource (偵測資源的偏離)**。

   CloudFormation 在所選資源上執行漂移偵測。如果成功，CloudFormation 會更新資源的漂移狀態，以及整體堆疊漂移狀態 (如有必要)。CloudFormation 還會更新上次在資源和整個堆疊上執行漂移偵測的時間戳記。如果已修改資源，CloudFormation 會顯示資源的預期和目前屬性值的詳細偏離資訊。

1. 檢閱資源的漂移偵測結果。

   1. 檢視已修改過的資源的詳細資訊。

     1. 在選取已修改資源的情況下，選取 **View drift details (檢視偏離詳細資訊)**。

       CloudFormation 會顯示該資源的偏離詳細資訊，包括資源的預期和目前屬性值，以及兩者間的任何差異。

       若要強調差異，請在 **Differences (差異)** 區段選取屬性名稱。
       + **Details** (詳細資訊) 區段的 **Current** (目前) 欄位會以綠色反白顯示新增的屬性。
       + **Details** (詳細資訊) 區段的 **Expected** (預期) 欄位會以紅色反白顯示刪除的屬性。
       + 值已變更的屬性在 **Expected (預期)** 和 **Current (目前)** 欄中以黃色醒目提示。  
![\[Drift Details (漂移詳細資訊) 的 Resource drift status (資源漂移狀態) 頁面，其中包含堆疊中每個支援漂移偵測的資源的漂移資訊。詳細資訊包括偏離狀態及預期與目前的屬性值。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-drift-details-differences-1.png)

**使用 偵測個別資源上的偏離 AWS CLI**
+ 
**重要**  
檢閱堆疊資源的**上次偏離檢查時間**，並確認其早於資源偏離結果中顯示的時間戳記，以防止使用過時資料。

  若要使用 偵測個別資源上的偏離 AWS CLI，請使用 **detect-stack-resource-drift**命令。指定資源的邏輯 ID，以及資源所在的堆疊。

  以下範例在特定堆疊資源 `my-drifted-resource` 上執行偏離偵測操作。回應傳回的資訊可確認資源已修改，包括值已變更的兩個屬性的詳細資訊。

  ```
  aws cloudformation detect-stack-resource-drift \
      --stack-name my-stack-with-resource-drift \
      --logical-resource-id my-drifted-resource
  ```

  輸出：

  ```
  {
      "StackResourceDrift": {
          "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
          "ActualProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":120,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":12},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
          "ResourceType": "AWS::SQS::Queue", 
          "Timestamp": "2018-03-26T18:54:28.462Z", 
          "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/099908667365/my-stack-with-resource-drift-Queue-494PBHCO76H4", 
          "StackResourceDriftStatus": "MODIFIED", 
          "ExpectedProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":10},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
          "PropertyDifferences": [
              {
                  "PropertyPath": "/DelaySeconds", 
                  "ActualValue": "120", 
                  "ExpectedValue": "20", 
                  "DifferenceType": "NOT_EQUAL"
              }, 
              {
                  "PropertyPath": "/RedrivePolicy/maxReceiveCount", 
                  "ActualValue": "12", 
                  "ExpectedValue": "10", 
                  "DifferenceType": "NOT_EQUAL"
              }
          ], 
          "LogicalResourceId": "my-drifted-resource"
      }
  }
  ```

# 透過匯入作業解決漂移
<a name="resource-import-resolve-drift"></a>

在某些情況下，資源的組態已經從其預期組態中漂移，並且您想要接受新的組態作為預期組態。在大多數情況下，您會透過使用新組態更新堆疊範本中的資源來定義，然後執行堆疊更新來解決漂移結果。不過，如果新組態更新需要取代的資源屬性，則會在堆疊更新期間重新建立資源。如果您想要保留現有資源，可以使用資源匯入功能來更新資源並解決漂移結果，而不會導致資源被取代。

透過匯入作業解決資源的漂移包含下列基本步驟：
+ [將 DeletionPolicy 屬性 (設為「保留」) 新增至資源](#resource-import-resolve-drift-console-step-01-update-stack)。這可確保現有資源在從堆疊中移除時保留，而不是刪除它。
+ [從範本中移除資源，並執行堆疊更新作業](#resource-import-resolve-drift-console-step-02-remove-drift)。這會從堆疊中移除資源，但不會刪除它。
+ [在堆疊範本中描述資源的實際狀態，然後再將現有資源匯入堆疊](#resource-import-resolve-drift-console-step-03-update-template)。這會將資源新增回堆疊，並解決造成漂移結果的屬性差異。

如需資源匯入的詳細資訊，請參閱 [手動將 AWS 資源匯入 CloudFormation 堆疊](import-resources-manually.md)。如需支援匯入的資源清單，請參閱 [資源類型支援](resource-import-supported-resources.md)。

在此範例中，我們使用下列範本，名為 `templateToImport.json`。

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PROVISIONED",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 1
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

在此範例中，讓我們假設使用者變更了 CloudFormation 外部的資源。執行漂移檢測後，我們發現 `GamesTable` 已將 `BillingMode` 修改為 `PAY_PER_REQUEST`。如需關於漂移偵測的詳細資訊，請參閱 [透過漂移偵測功能，偵測堆疊和資源的未受管組態變更](using-cfn-stack-drift.md)。

![\[漂移結果會在主控台中顯示預期和實際結果。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/drift-results-gamestable.png)


我們的堆疊現已過時，而我們的資源卻是即時的，但我們還是希望能保留預期的資源組態。我們可以透過導入操作解決漂移而不中斷服務來做到這一點。

## 使用 CloudFormation 主控台透過匯入作業解決漂移
<a name="resource-import-resolve-drift-console"></a>

### 步驟 1. 使用保留刪除政策更新堆疊
<a name="resource-import-resolve-drift-console-step-01-update-stack"></a>

**使用具有 `Retain` 選項的 `DeletionPolicy` 屬性來更新堆疊**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，選擇已漂移的堆疊。

1. 選擇**更新**，然後從堆疊詳細資料窗格中選擇**取代目前的範本**。

1. 在**指定範本**頁面上，使用下列其中一種方法，透過 `Retain` 選項提供包含 `DeletionPolicy` 屬性的更新範本：
   + 選擇 **Amazon S3 URL**，然後在文字方塊中為您的範本指定 URL。
   + 選擇 **Upload a template file (上傳範本檔案)**，然後瀏覽您的範本。

   然後選擇**下一步**。

1. 複查**指定堆疊詳細資料**頁面，然後選擇**下一步**。

1. 檢閱**配置堆疊選項**頁面，並選擇**下一步**。

1. 在 **檢閱 *stack-name***頁面上，選擇**更新堆疊**。

*結果*：在堆疊的**事件**頁面上，狀態為 `UPDATE_COMPLETE`。

若要解決匯入作業的漂移，而不會中斷服務，請為您要從堆疊中移除的資源指定 `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)。在下列範例中，我們已將 [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) 屬性 (設為 `Retain`) 新增至 `GamesTable` 資源。

------
#### [ Example JSON ]

```
    "GamesTable": {
        "Type": "AWS::DynamoDB::Table",
        "DeletionPolicy": "Retain",
        "Properties": {
            "TableName": "Games",
```

------
#### [ Example YAML ]

```
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
```

------

### 步驟 2. 移除漂移的資源、相關參數和輸出
<a name="resource-import-resolve-drift-console-step-02-remove-drift"></a>

**移除漂移資源、相關參數和輸出**

1. 選擇**更新**，然後從堆疊詳細資料窗格中選擇**取代目前的範本**。

1. 在**指定範本**頁面上，使用下列其中一種方法，提供已更新範本的資源、相關參數和輸出：
   + 選擇 **Amazon S3 URL**，然後在文字方塊中為您的範本指定 URL。
   + 選擇 **Upload a template file (上傳範本檔案)**，然後瀏覽您的範本。

   然後選擇**下一步**。

1. 複查**指定堆疊詳細資料**頁面，然後選擇**下一步**。

1. 檢閱**配置堆疊選項**頁面，並選擇**下一步**。

1. 在 **檢閱 *stack-name***頁面上，選擇**更新堆疊**。

*結果*：**邏輯 ID** `GamesTable` 在堆疊的**事件**頁面 上的狀態為 `DELETE_SKIPPED`。

等待直到 CloudFormation 完成堆疊更新作業。堆疊更新作業完成後，請從堆疊範本移除資源、相關參數和輸出。然後，匯入更新的範本。完成這些動作之後，範例範本現在如下所示。

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

### 步驟 3。更新範本以符合資源的即時狀態
<a name="resource-import-resolve-drift-console-step-03-update-template"></a>

**更新範本以符合資源的即時狀態**

1. 若要匯入更新的範本，請選擇**堆疊動作**，然後選擇**將資源匯入堆疊**。  
![\[主控台中 Import resource into stack (將資源匯入堆疊) 的選項。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/stack-actions-import.png)

1. 請閱讀**匯入概觀**頁面，以取得您在此操作期間必須提供的項目清單，接著選擇**下一步**。

1. 在**指定範本**頁面上，使用以下其中一種方法提供您更新後的範本。
   + 選擇 **Amazon S3 URL**，然後在文字方塊中為您的範本指定 URL。
   + 選擇 **Upload a template file (上傳範本檔案)**，然後瀏覽您的範本。

   然後選擇**下一步**。

1. 在 **Identify resources (識別資源)** 頁面上，識別每個目標資源。如需詳細資訊，請參閱[資源識別碼](import-resources-manually.md#resource-import-identifiers-unique-ids)。

   1. 在 **Identifer property (識別碼屬性)** 下方，選擇資源識別碼類型。例如， `TableName` 屬性會識別 `AWS::DynamoDB::Table` 資源。

   1. 在**識別碼值**下方，輸入實際的屬性值。在範例範本中，用於 `GamesTable` 資源的 `TableName` 是 `Games`。

   1. 選擇**下一步**。

1. 檢閱**指定堆疊詳細資料**頁面，然後選擇**下一步**。

1. 在**匯入概觀**頁面上，檢閱要匯入的資源，然後選擇**匯入資源**。這會將 `AWS::DynamoDB::Table` 資源類型導回堆疊中。

*結果*：在此範例中，我們透過匯入作業解決資源漂移，而不會中斷服務。您可以在 Events (事件) 索引標籤的 CloudFormation 主控台中檢查匯入動作的進度。匯入的資源會有一個 `IMPORT_COMPLETE` 狀態，後接**資源匯入完成**的 `CREATE_COMPLETE` 狀態作為狀態原因。

等待直到 CloudFormation 完成堆疊更新作業。堆疊更新作業完成後，請更新範本，以符合資源的實際漂移狀態。例如，`BillingMode` 將設為 `PAY_PER_REQUEST` 和 `ReadCapacityUnits`，`WriteCapacityUnits` 將設為 `0`。

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "DeletionPolicy": "Retain",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PAY_PER_REQUEST",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 0,
                    "WriteCapacityUnits": 0
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
      ProvisionedThroughput:
        ReadCapacityUnits: 0
        WriteCapacityUnits: 0
```

------