設計您的應用程式以妥善處理執行個體終止 - Amazon EC2 Auto Scaling

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

設計您的應用程式以妥善處理執行個體終止

本主題涵蓋的功能可用來防止 Auto Scaling 群組終止尚未準備好終止的執行個體,或者太快終止執行個體以致於完成指派的任務。您可以組合或單獨使用這三個功能來設計應用程式,以優雅地處理執行個體終止。

例如,假設您有一個 Amazon SQS 佇列,可為長時間執行的任務收集傳入訊息。新訊息送達時,Auto Scaling 群組中的執行個體會擷取訊息並開始處理。每條訊息都需要 3 個小時的處理時間。隨著訊息數量增加,新的執行個體會自動新增至 Auto Scaling 群組。隨著訊息數量減少,現有的執行個體會自動終止。在此情況下,Amazon EC2 Auto Scaling 必須決定終止哪一個執行個體。預設狀況下,Amazon EC2 Auto Scaling 可能會終止對 3 小時長的任務處理了 2.9 小時的執行個體,而不是目前閒置的執行個體。若要避免在使用 Amazon EC2 Auto Scaling 時發生意外終止的問題,您必須設計應用程式以回應這種情況。

重要

在 Amazon EC2 Auto Scaling 上設計應用程式以正常處理執行個體終止時,請牢記這些要點。

  • 如果執行個體運作狀態不佳,無論您使用哪種功能 (除非您暫停 ReplaceUnhealthy 程序),Amazon EC2 Auto Scaling 都會取代該執行個體。您可以使用 lifecycle hook 來允許應用程式正常關閉,或複製您需要復原的任何資料,然後再終止執行個體。

  • 終止 lifecycle hook 不保證在執行個體終止之前執行或完成。如果發生故障,Amazon EC2 Auto Scaling 仍會終止執行個體。

執行個體縮減保護

您可以在許多情況下使用執行個體縮減保護,因為終止執行個體是重要動作,預設情況下應該拒絕該動作,而且只有特定執行個體明確允許。例如,在執行容器化工作負載時,通常會想要保護所有執行個體,並僅對沒有目前或排程任務的執行個體移除保護。Amazon ECS 等服務已在其產品中建立與執行個體縮減保護的整合。

您可以在 Auto Scaling 群組上啟用縮減保護,以便在建立執行個體時將縮減保護套用至執行個體,並為現有執行個體啟用此功能。當執行個體沒有其他任務要做時,它可以關閉保護功能。執行個體可以繼續輪詢新任務,並在有新任務指派時重新啟用保護。

應用程式可以透過管理執行個體是否可終止的集中控制平面,或從執行個體本身設定保護。不過,如果大量執行個體持續切換縮減保護,則大型機群可能會遇到限流問題。

如需詳細資訊,請參閱 使用執行個體擴充保護來控制執行個體終止

自訂終止政策

像執行個體縮減保護一樣,自訂終止政策可協助您避免 Auto Scaling 群組終止特定執行個體。

預設情況下,Auto Scaling 群組使用預設的終止政策來決定首先終止哪一個執行個體。如果您想進一步控制哪些執行個體先終止,可以使用 Lambda 函數實作自己的自訂終止政策。Amazon EC2 Auto Scaling 會在必須決定終止哪個執行個體時呼叫該函數。它只會終止該函數返回的執行個體。如果函數錯誤、逾時或產生空白清單,Amazon EC2 Auto Scaling 不會終止執行個體。

如果已知執行個體何時有足夠的冗餘或何時利用率過低,從而可以被終止,此時自訂終止政策就很有用。若要支援此功能,您必須使用可監控整個群組工作負載的控制平面來實作應用程式。如此一來,如果執行個體仍在處理任務,Lambda 函數就會知道不要包含它。

如需詳細資訊,請參閱 使用 Lambda 建立自訂終止政策

終止生命週期關聯

終止 lifecycle hook 可延長已選取要終止之執行個體的壽命。它提供額外的時間來完成目前指派給執行個體的所有訊息或要求,或儲存進度並將任務轉移到另一個執行個體。

對於許多工作負載,lifecycle hook 可能足以正常關閉已選取要終止的執行個體上的應用程式。這是一種最有效的方法,如果發生故障,則不能用於防止終止。

若要使用 lifecycle hook,您需要知道何時選取要終止的執行個體。有兩種方式可以得知:

選項 描述 最適合用於 文件的連結
執行個體內部 執行個體中繼資料服務 (IMDS) 是安全的端點,您可以直接從執行個體輪詢執行個體的狀態。如果中繼資料帶回 Terminated,則您的執行個體就會排程終止。 必須在執行個體終止前對執行個體執行動作的應用程式。 擷取目標生命週期狀態
執行個體外部 當執行個體終止時,會產生事件通知。您可以使用 Amazon EventBridge、Amazon SQS 或 Amazon SNS 來建立規則來擷取這些事件,並使用 Lambda 函數叫用回應。 需要在執行個體之外採取動作的應用程式。 設定通知目標

若要使用 lifecycle hook,您還需要知道執行個體何時可以完全終止。Amazon EC2 Auto Scaling 不會告知 Amazon EC2 在收到CompleteLifecycleAction呼叫或逾時結束之前終止執行個體 (以先發生者為準)。

預設情況下,由於終止 lifecycle hook 的作用,執行個體可以繼續執行一小時 (活動訊號逾時)。如果一小時的時間不足以完成生命週期動作,您可以設定預設逾時。當生命週期動作實際正在進行中時,您可以使用 RecordLifecycleActionHeartbeatAPI 呼叫來延長逾時。

如需詳細資訊,請參閱 Amazon EC2 Auto Scaling lifecycle hook