

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

# Amazon EC2 Auto Scaling lifecycle hook
<a name="lifecycle-hooks"></a>

Amazon EC2 Auto Scaling 提供將 lifecycle hook 新增到 Auto Scaling 群組的能力。這些掛鉤可讓您建立了解 Auto Scaling 執行個體生命週期中之事件的解決方案，然後在對應的生命週期事件發生時對執行個體執行自訂動作。lifecycle hook 提供指定的時間 (預設為一小時)，以便在執行個體轉換到下一個狀態之前等待動作完成。

作為结合使用 lifecycle hook 與 Auto Scaling 執行個體的範例：
+ 水平擴展事件發生時，新啟動的執行個體會完成啟動序列，並轉換到等待狀態。當執行個體處於等待狀態時，其會執行指令碼以下載和安裝應用程式所需的軟體套件，確保執行個體在開始接收流量之前已經完全準備妥當。當指令碼安成軟體的安裝後，其會傳送 **complete-lifecycle-action** 命令以繼續。
+ 發生縮減事件時，lifecycle hook 會在執行個體終止前將其暫停，並使用 Amazon EventBridge 傳送通知給您。當執行個體處於等待狀態時，您可以在執行個體完全終止之前叫用 AWS Lambda 函數或連線到執行個體以下載日誌或其他資料。

lifecycle hook 的常見用途是控制何時使用 Elastic Load Balancing 註冊執行個體。透過將啟動 lifecycle hook 新增至 Auto Scaling 群組，您可以確保引導指令碼已成功完成，且執行個體上的應用程式已準備好接受流量，然後在 lifecycle hook 結束時向負載平衡器註冊執行個體。

**Topics**
+ [lifecycle hook 可用性](#lifecycle-hooks-availability)
+ [考量和限制](#lifecycle-hook-considerations)
+ [相關資源](#lifecycle-hook-related-resources)
+ [Auto Scaling 群組中的生命週期關聯運作方式](lifecycle-hooks-overview.md)
+ [準備新增 lifecycle hook](prepare-for-lifecycle-notifications.md)
+ [使用執行個體生命週期政策控制執行個體保留](instance-lifecycle-policy.md)
+ [擷取目標生命週期狀態](retrieving-target-lifecycle-state-through-imds.md)
+ [將生命週期掛鉤新增至 Auto Scaling 群組](adding-lifecycle-hooks.md)
+ [在 Auto Scaling 群組中完成生命週期動作](completing-lifecycle-hooks.md)
+ [教學課程：使用執行個體中繼資料擷取生命週期狀態](tutorial-lifecycle-hook-instance-metadata.md)
+ [教學課程：設定叫用 Lambda 函數的 lifecycle hook](tutorial-lifecycle-hook-lambda.md)

## lifecycle hook 可用性
<a name="lifecycle-hooks-availability"></a>

下表列出可用於各種案例的 lifecycle hook。


| 事件 | 執行個體啟動或終止¹ | [執行個體生命週期上限](asg-max-instance-lifetime.md)：取代執行個體 | [執行個體重新整理](asg-instance-refresh.md)：取代執行個體 | [容量重新平衡](ec2-auto-scaling-capacity-rebalancing.md)：取代執行個體 | [暖集區](ec2-auto-scaling-warm-pools.md)：進入和離開暖集區的執行個體 | 
| --- | --- | --- | --- | --- | --- | 
| 執行個體啟動 | ✓ | ✓ | ✓ | ✓ | ✓ | 
| 執行個體終止 | ✓ | ✓ | ✓ | ✓ | ✓ | 

¹ 適用於所有啟動和終止，無論是自動還是手動啟動，例如當您呼叫 `SetDesiredCapacity` 或 `TerminateInstanceInAutoScalingGroup` 操作時。在您連接或分開執行個體、將執行個體移入和移出待命模式或使用強制刪除選項刪除群組時不適用。

## lifecycle hook 的考量與限制
<a name="lifecycle-hook-considerations"></a>

配合使用生命週期關聯時，請記住下列考量事項和限制：
+ Amazon EC2 Auto Scaling 提供自己的生命週期，協助管理 Auto Scaling 群組。此生命週期與其他 EC2 執行個體的生命週期不同。如需詳細資訊，請參閱[Amazon EC2 Auto Scaling 執行個體生命週期](ec2-auto-scaling-lifecycle.md)。暖集區中的執行個體也有自己的生命週期，如 [暖集區中的執行個體生命週期狀態轉換](warm-pool-instance-lifecycle.md#lifecycle-state-transitions) 中所述。
+  根據預設，終止生命週期掛鉤會盡力運作。如果終止生命週期關聯逾時或遭到捨棄，Amazon EC2 Auto Scaling 會繼續立即終止執行個體。您可以結合終止生命週期關聯與執行個體保留的執行個體生命週期政策。如需詳細資訊，請參閱[使用執行個體生命週期政策控制執行個體保留](instance-lifecycle-policy.md)。
+ 您可以使用含有 Spot 執行個體的 lifecycle hook，不過，如果執行個體的容量已無法再使用，lifecycle hook 無法防止執行個體終止，這種情況隨時都可能發生，並會發出兩分鐘的中斷通知。如需詳細資訊，請參閱《*Amazon EC2 使用者指南》中的* [Spot 執行個體中斷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)。但是，您可以啟用容量重新平衡功能，藉此主動取代從 Amazon EC2 Spot 服務收到重新平衡建議的 Spot 執行個體；這是在 Spot 執行個體處於較高中斷風險時傳送的訊號。如需詳細資訊，請參閱[Auto Scaling 中的容量重新平衡，以取代具有風險的 Spot 執行個體](ec2-auto-scaling-capacity-rebalancing.md)。
+ 執行個體可以在有限的期間內維持於等待狀態。lifecycle hook 的預設逾時為 1 小時 (活動訊號逾時)。此外，還有一個全域逾時，指定您可將執行個體保留在等待狀態的最長時間。全域逾時為 48 小時或活動訊號逾時的 100 倍，以較小值為準。
+ 系統可能捨棄或繼續 lifecycle hook 的結果。如果某個執行個體正在啟動，繼續則表示您的動作已成功，而且 Amazon EC2 Auto Scaling 可將執行個體投入服務。否則，捨棄則表示您的自訂動作沒有成功執行，且我們可能會終止並取代該執行個體。如果某個執行個體正在終止，捨棄和繼續都會允許該執行個體終止。不過，放棄會停止任何剩餘的動作，如其他 lifecycle hook，而繼續允許讓任何其他 lifecycle hook 來完成。
+ Amazon EC2 Auto Scaling 會限制 lifecycle hook 持續失敗時允許執行個體啟動的速率，因此請務必測試並修復生命週期動作中的任何永久性錯誤。
+ 使用 AWS CLI CloudFormation或 SDK 建立和更新生命週期掛鉤，提供從 建立生命週期掛鉤時無法使用的選項 AWS 管理主控台。例如，用於指定 SNS 主題或 SQS 佇列的 ARN 欄位不會顯示在主控台中，因為 Amazon EC2 Auto Scaling 已向 Amazon EventBridge 傳送事件。您可以視需要篩選這些事件並重新導向至 Lambda、Amazon SNS 和 Amazon SQS 等 AWS 服務。
+ 您可以在建立 Auto Scaling 群組時，使用 呼叫 [CreateAutoScalingGroup](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CreateAutoScalingGroup.html) API 或 SDK AWS CLI CloudFormation，將多個生命週期掛鉤新增至該群組。但是，如果指定，每個掛鉤必須具有相同的通知目標和 IAM 角色。若要建立具有不同通知目標和不同角色的 lifecycle hook，請在對 [PutLifecycleHook](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_PutLifecycleHook.html) API 的單獨叫用中一次建立一個 lifecycle hook。
+ 如果您為執行個體啟動新增 lifecycle hook，運作狀態檢查寬限期會在執行個體到達 `InService` 狀態時開始。如需詳細資訊，請參閱[設定 Auto Scaling 群組的運作狀態檢查寬限期。](health-check-grace-period.md)。

**擴展考量**
+ 動態擴展政策可根據跨多個執行個體彙總的 CloudWatch 指標資料 (例如 CPU 和網路 I/O) 縮減和橫向擴展。橫向擴展時，Amazon EC2 Auto Scaling 不會立即將新執行個體計入 Auto Scaling 群組的彙總執行個體指標。它會等待執行個體到達 `InService` 狀態且執行個體暖機完成為止。如需詳細資訊，請參閱預設執行個體暖機主題中的 [擴展效能考量](ec2-auto-scaling-default-instance-warmup.md#scaling-performance-considerations)。
+ 在縮減時，彙總的執行個體指標可能不會立即反映終止執行個體的移除情況。Amazon EC2 Auto Scaling 終止工作流程開始後不久，正在終止的執行個體會停止計入群組的彙總執行個體指標。
+ 在大多數情況下，當調用生命週期關聯時，簡易擴展政策引起的擴展活動會暫停，直至生命週期動作完成且冷卻時間已過。設定較長的冷卻時間間隔代表需要更多的時間才能恢復擴展。如需詳細資訊，請參閱冷卻時間主題中的 [生命週期關聯可能會導致額外延遲](ec2-auto-scaling-scaling-cooldowns.md#cooldowns-lifecycle-hooks)。一般而言，如果您可以改用步進擴展或目標追蹤擴展政策，建議您不要使用簡易擴展政策。

## 相關資源
<a name="lifecycle-hook-related-resources"></a>

如需簡介影片，請參閱 *YouTube* 上的 [AWS re:Invent 2018：透過 Amazon EC2 Auto Scaling 輕鬆管理容量](https://youtu.be/PideBMIcwBQ?t=469)。

我們提供幾個 JSON 和 YAML 範本程式碼片段，您可以用來了解如何在 CloudFormation 堆疊範本中宣告生命週期關聯。如需詳細資訊，請參閱《AWS CloudFormation 使用者指南》[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html)中的 *AWS::AutoScaling::LifecycleHook* 參考資料。

您也可以造訪我們的 [GitHub 儲存庫](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)，下載 lifecycle hook 的範例範本和使用者資料指令碼。

如需生命週期關聯的使用範例，請參閱下列部落格文章。
+ 《[使用 Lambda 和 Amazon EC2 執行命令為擴展的執行個體建立備份系統](https://aws.amazon.com/blogs/compute/building-a-backup-system-for-scaled-instances-using-aws-lambda-and-amazon-ec2-run-command/)》
+ 《[在終止 EC2 Auto Scaling 執行個體之前執行程式碼](https://aws.amazon.com/blogs/infrastructure-and-automation/run-code-before-terminating-an-ec2-auto-scaling-instance/)》。