

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

# 設計您的應用程式以正常處理執行個體終止
<a name="gracefully-handle-instance-termination"></a>

 本主題說明您可以用來防止 Amazon EC2 Auto Scaling 群組終止尚未準備好終止的 Amazon EC2 執行個體的功能。根據預設，Auto Scaling 無法查看執行個體上執行的應用程式。它可以在您的應用程式能夠正常關閉或完成其指派的任務之前終止執行個體。這些功能可讓您的應用程式有時間完成進行中的工作、傳輸狀態，或在執行個體終止之前執行清除。您可以根據應用程式的需求，個別或組合使用它們。

 這些功能對於具狀態工作負載特別有用，其中機群中的每個執行個體都具有與其他執行個體不同的資料、任務或狀態。在沒有正常關機的情況下終止具狀態的執行個體，可能會導致長時間執行的任務從一開始就重新啟動、減少資料備援或資料遺失，以及中斷進行中的交易或運算。若要正常關閉具狀態執行個體，其工作負載應該耗盡 （完成所有目前指派的任務） 或傳輸 （將任務、資料或組態移至另一個作用中的執行個體）。

**Topics**
+ [終止生命週期關聯](#gracefully-handle-instance-termination-lifecycle-hooks)
+ [執行個體縮減保護](#gracefully-handle-instance-termination-scale-in-protection)
+ [自訂終止政策](#gracefully-handle-instance-termination-custom-termination-policy)
+ [執行個體生命週期政策](#gracefully-handle-instance-termination-instance-lifecycle-policy)
+ [完全暫停終止](#gracefully-handle-instance-termination-suspend-terminate)
+ [限制](#gracefully-handle-instance-termination-limitations)
+ [範例方案](#gracefully-handle-instance-termination-examples)

## 終止生命週期關聯
<a name="gracefully-handle-instance-termination-lifecycle-hooks"></a>

 終止生命週期關聯可延長已選擇終止之 Amazon EC2 執行個體的生命週期。它提供額外的時間來完成目前指派給執行個體的進行中工作，或儲存進度並將工作轉移到另一個執行個體。

 對於許多工作負載，終止生命週期掛鉤可能足以正常關閉為終止選取的執行個體上的應用程式。這是最佳方法，如果捨棄終止生命週期動作，則無法用於防止終止。如果您的工作負載對終止生命週期動作失敗的容錯能力較低，請結合您的終止生命週期關聯來設定[執行個體生命週期政策](https://docs.aws.amazon.com/autoscaling/ec2/userguide/instance-lifecycle-policy.html)，以保留執行個體。

 若要使用終止生命週期掛鉤，您需要知道何時選取執行個體進行終止。有兩種方式可以得知：


| 選項 | Description | 最適合用於 | 文件的連結 | 
| --- | --- | --- | --- | 
| 執行個體內部 |  執行個體中繼資料服務 (IMDS) 是安全的端點，您可以直接從執行個體輪詢執行個體的狀態。如果中繼資料帶回 Terminated，則您的執行個體就會排程終止。 |  必須在執行個體終止前對執行個體執行動作的應用程式。 |  [ 擷取目標生命週期狀態 ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/retrieving-target-lifecycle-state-through-imds.html)  | 
| 執行個體外部 |  當執行個體終止時，會產生事件通知。您可以使用 Amazon EventBridge、Amazon SQS、Amazon SNS 或 建立規則 AWS Lambda 來擷取這些事件，並使用 Lambda 函數叫用 等回應。 |  需要在執行個體之外採取動作的應用程式。 |  [ 設定通知目標 ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/prepare-for-lifecycle-notifications.html#lifecycle-hook-notification-target)  | 

 若要使用 lifecycle hook，您還需要知道執行個體何時可以完全終止。Amazon EC2 Auto Scaling 在收到 [ CompleteLifecycleAction ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html) API 呼叫或逾時經過之前，不會終止執行個體，以先發生者為準。

 預設情況下，由於終止 lifecycle hook 的作用，執行個體可以繼續執行一小時 (活動訊號逾時)。如果一小時的時間不足以完成生命週期動作，您可以設定預設逾時。當生命週期動作正在進行時，您可以使用 [ RecordLifecycleActionHeartbeat ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_RecordLifecycleActionHeartbeat.html) API 呼叫來延長逾時。

 如需詳細資訊，請參閱[Amazon EC2 Auto Scaling lifecycle hook](lifecycle-hooks.md)。

## 執行個體縮減保護
<a name="gracefully-handle-instance-termination-scale-in-protection"></a>

 您可以使用執行個體縮減保護來控制要在縮減事件期間選擇終止的執行個體，尤其是防止正在處理長時間執行任務的執行個體遭到終止。例如，執行容器化工作負載時，通常希望保護所有執行個體，並僅為沒有目前或排程任務的執行個體移除保護。執行個體可以繼續輪詢新任務，並在指派新任務時重新啟用保護。

 您可以在 Auto Scaling 群組層級和執行個體層級啟用縮減保護。當您在 Auto Scaling 群組層級啟用縮減保護時，只會在建立新執行個體時受到保護。對於現有的執行個體，您可以個別啟用保護。

 應用程式可以從執行個體本身設定保護，或從管理每個執行個體是否可終止的集中式控制平面設定保護。我們建議針對大型機群或需要頻繁切換保護時採用集中式方法，因為它可讓您批次呼叫 [ SetInstanceProtection](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_SetInstanceProtection.html)，並避免 API 限流問題。

 如需詳細資訊，請參閱[使用執行個體縮減保護來控制執行個體終止](ec2-auto-scaling-instance-protection.md)。

## 自訂終止政策
<a name="gracefully-handle-instance-termination-custom-termination-policy"></a>

 如同執行個體縮減保護，自訂終止政策可協助您防止 Amazon EC2 Auto Scaling 群組終止特定 EC2 執行個體。無論您的自訂終止政策為何，仍可以終止運作狀態不佳的執行個體。

 您的 Auto Scaling 群組使用預設終止政策來判斷其先終止的 Amazon EC2 執行個體。如果您想要進一步控制哪些執行個體先終止，您可以使用 Lambda 函數實作自訂終止政策。Auto Scaling 會在需要選取執行個體以進行終止時呼叫此函數，而且只會終止函數傳回的執行個體。如果函數錯誤、逾時或傳回空白清單，Auto Scaling 不會終止任何執行個體，除非執行個體運作狀態不佳。

 當您的應用程式可以識別哪些執行個體處於閒置狀態或可安全終止時，自訂終止政策非常有用。這通常需要可跨群組追蹤工作負載的控制平面。

 如需詳細資訊，請參閱[使用 Lambda 建立自訂終止政策](lambda-custom-termination-policy.md)。

## 執行個體生命週期政策
<a name="gracefully-handle-instance-termination-instance-lifecycle-policy"></a>

 執行個體生命週期政策可在捨棄終止生命週期動作時提供 Amazon EC2 Auto Scaling 終止的保護。與單獨使用生命週期掛鉤不同，執行個體生命週期政策旨在確保執行個體在正常關機程序未成功完成時移至保留狀態。

 當 Auto Scaling 選取要終止的執行個體時，系統會叫用您設定的終止生命週期掛鉤，而您的應用程式會開始正常的關閉程序。如果使用 成功完成終止生命週期動作`CONTINUE`，執行個體會正常終止。不過，如果因任何原因捨棄終止生命週期動作，執行個體生命週期政策會將執行個體移至保留狀態，而不是將其終止。保留的執行個體不會計入 Auto Scaling 群組所需的容量，因此會自動啟動替換執行個體。除非您使用 [TerminateInstanceInAutoScalingGroup ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html) API 手動終止保留的執行個體，否則會針對保留的執行個體及其替換產生標準 Amazon EC2 費用。

 若要使用此功能，您必須設定執行個體生命週期政策，並將`TerminateHookAbandon`保留觸發條件設定為 `retain`，以及至少一個終止生命週期關聯。由於保留的執行個體會產生持續的 Amazon EC2 成本，且需要手動動作，因此監控至關重要。您應該啟用 CloudWatch 指標，例如 `GroupTerminatingRetainedInstances`並建立 CloudWatch 警示，以便在執行個體進入保留狀態時提醒您。

 如需詳細資訊，請參閱[使用執行個體生命週期政策控制執行個體保留](instance-lifecycle-policy.md)。

## 完全暫停終止
<a name="gracefully-handle-instance-termination-suspend-terminate"></a>

 如果您需要完全控制 Amazon EC2 Auto Scaling 群組中的所有 EC2 執行個體終止，請暫停`Terminate`程序。 Amazon EC2 只有在上述選項未提供您服務所需的控制時，才建議使用此選項。透過呼叫 [ SuspendProcesses ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_SuspendProcesses.html) 來暫停`Terminate`程序，您可以防止 Auto Scaling 因任何原因嘗試終止，但使用者向 [TerminateInstanceInAutoScalingGroup API ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html)請求啟動的終止除外。

 如需詳細資訊，請參閱[暫停和繼續 Amazon EC2 Auto Scaling 程序](as-suspend-resume-processes.md)。

## 限制
<a name="gracefully-handle-instance-termination-limitations"></a>

**重要**  
 在 Amazon EC2 Auto Scaling 上設計應用程式以正常處理執行個體終止時，請記住下列限制。

### 運作狀態不佳的執行個體會略過一些保護
<a name="gracefully-handle-instance-termination-unhealthy-bypass"></a>

 如果執行個體運作狀態不佳，Amazon EC2 Auto Scaling 會開始終止執行個體，即使您已制定自訂終止政策或縮減保護。防止 Auto Scaling 取代運作狀態不佳執行個體的唯一方法是暫停 `HealthCheck`、 `ReplaceUnhealthy`或 `Terminate` 程序。您可以使用生命週期關聯和執行個體生命週期政策，允許應用程式正常關閉，或複製在終止運作狀態不佳的執行個體之前需要復原的任何資料。


| 功能 | 控制運作狀態良好的執行個體 | 控制運作狀態不佳的執行個體 | 
| --- | --- | --- | 
| 自訂終止政策 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/negative_icon.png) 否 | 
| 縮減保護 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/negative_icon.png) 否 | 
|  暫停 HealthCheck、 ReplaceUnhealthy或 Terminate 程序  | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | 
| lifecycle hook | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | 
| 執行個體生命週期政策 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | ![](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/success_icon.png) 是 | 

### 僅生命週期掛鉤並不保證正常關閉
<a name="gracefully-handle-instance-termination-hooks-no-guarantee"></a>

 根據預設，終止生命週期掛鉤會盡力運作。如果已捨棄終止生命週期動作，Amazon EC2 Auto Scaling 會繼續立即終止執行個體。您可以結合終止生命週期關聯與執行個體生命週期政策，在捨棄終止生命週期動作時保留執行個體。使用此組合：
+  Auto Scaling 觸發執行個體終止並從任何設定的 Elastic Load Balancing 負載平衡器耗盡完成後，您的終止生命週期關聯會嘗試正常關閉應用程式。
+  如果由於任何原因放棄終止生命週期動作，執行個體會移至保留狀態，而不是終止。
+  保留的執行個體會保持在目前的 Amazon EC2 狀態，可讓您手動完成關機程序或調查失敗。
+  您可以在完成必要的動作後呼叫 [ TerminateInstanceInAutoScalingGroup ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html) API，手動終止保留的執行個體。

 如需詳細資訊，請參閱[使用執行個體生命週期政策控制執行個體保留](instance-lifecycle-policy.md)。

### 某些執行個體市場選項可能會在有限通知的情況下中斷
<a name="gracefully-handle-instance-termination-spot-interruptions"></a>

 如果您在 Auto Scaling 群組中使用 Spot 執行個體和中斷容量保留等執行個體市場選項，Amazon EC2 可以隨時中斷並回收您的執行個體。這些中斷會略過所有 Amazon EC2 Auto Scaling 保護機制，包括：
+ 終止生命週期關聯
+ 執行個體縮減保護
+ 自訂終止政策
+ 執行個體生命週期政策
+ 暫停的程序

 當 Spot 執行個體收到中斷通知時，您有大約兩分鐘的時間來執行正常的關閉任務。雖然您可以使用終止生命週期關聯來回應 Spot 執行個體中斷，但即使生命週期關聯仍在進行中，執行個體仍會在兩分鐘時段結束時強制終止。執行個體生命週期政策也無法防止 Spot 執行個體中斷。

 如需處理 Spot 執行個體中斷的詳細資訊，請參閱《Amazon EC2 使用者指南》中的 [ Spot 執行個體中斷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)*和 Amazon EC2 *Spot 的最佳實務。 [ Amazon EC2 ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html) 

### 直接 Amazon EC2 終止會略過所有保護
<a name="gracefully-handle-instance-termination-direct-ec2-api"></a>

 如果您使用 Amazon EC2 [TerminateInstances API ](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TerminateInstances.html)直接終止 Auto Scaling 群組中的執行個體，則終止會略過所有 Amazon EC2 Auto Scaling 保護機制。

 若要終止 Auto Scaling 群組中的執行個體，同時遵守您設定的保護，請改用 [ TerminateInstanceInAutoScalingGroup ](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html) API。

## 範例方案
<a name="gracefully-handle-instance-termination-examples"></a>

 當您使用 Amazon EC2 Auto Scaling 時，您可以選擇 Auto Scaling 代表您處理多少機群管理，以及您對 EC2 執行個體終止決策保留多少直接控制。工作負載對執行個體終止越敏感，您可能想要保留的控制權就越高。下列範例說明具有不同公差層級和建議組態的工作負載：

### 範例 1：分散式資料庫節點 （低容錯能力）
<a name="gracefully-handle-instance-termination-example-database"></a>

 您會執行分散式資料庫，其中每個 EC2 執行個體會保留複寫係數為 3 的資料分割區。遺失保留相同分割區複本的多個執行個體可能會導致資料遺失或使該分割區無法使用。

 **挑戰：**Auto Scaling 終止執行個體的速度可能比將資料重新複寫到其他節點的速度更快，而且終止可能會降低您的容量，低於維護複寫因素所需的容量。

請考慮下列組態：
+  在所有資料庫執行個體上啟用[執行個體縮減保護](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)；只有在確認資料已在別處安全複寫之後，才能以程式設計方式將其移除。
+  設定具有延長逾時的[終止生命週期關聯](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)，並結合執行個體生命週期政策，以允許資料傳輸完成。
+  設定運作狀態最低百分比為 100% 的[執行個體維護政策](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-maintenance-policy.html)，以維持所需的容量。

### 範例 2：長時間執行的任務處理 （中等容錯能力）
<a name="gracefully-handle-instance-termination-example-job-processing"></a>

 您有 Amazon SQS 佇列，可收集長時間執行任務的傳入訊息。當新訊息送達時，EC2 執行個體會擷取訊息並啟動需要 3 小時才能處理的任務。隨著佇列的成長，Auto Scaling 會根據您的擴展政策新增執行個體。隨著佇列縮減，Auto Scaling 會終止執行個體。

 **挑戰：**Auto Scaling 可能會終止處理任務需要 3 小時的執行個體，而不是閒置的執行個體。任務可以在另一個執行個體上重新啟動，但您會失去重大進度。

請考慮下列組態：
+  設定[自訂終止政策](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lambda-custom-termination-policy.html)，先排定終止閒置執行個體的優先順序。
+  使用[終止生命週期掛鉤](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)來允許進行中的任務完成。
+  當[執行個體啟動任務時，以程式設計方式啟用執行個體縮減保護](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)，並在任務完成時將其移除。

### 範例 3：適用於測試環境的工作者機群 （高容錯能力）
<a name="gracefully-handle-instance-termination-example-test"></a>

 您可以執行執行自動化測試、CI/CD 管道任務或開發工作負載的 EC2 執行個體機群。這些工作者執行個體會從佇列中提取任務，如果任務失敗，則可以重新產生測試結果。

 **挑戰：**測試任務可能會在縮減事件期間中斷，但由於測試可以在不影響的情況下重試，因此您想要最佳化成本和簡單性，而不是零中斷可用性。

請考慮下列組態：
+  使用[終止生命週期關聯](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)來允許處理中的請求完成。
+  考慮使用 [ Spot 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)搭配容量最佳化配置策略，以進一步降低成本。