使用 Lambda 建立自訂終止政策 - Amazon EC2 Auto Scaling

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

使用 Lambda 建立自訂終止政策

Amazon EC2 Auto Scaling 使用終止政策來排定優先順序,以確定在減少 Auto Scaling 群組的大小 (稱為縮減) 時要先終止哪些執行個體。Auto Scaling 群組會使用預設的終止政策,但您可以選擇性地選擇或建立自己的終止政策。如需有關如何選擇預先定義的終止政策的詳細資訊,請參閱 設定 Amazon EC2 Auto Scaling 的終止政策

在本主題中,您會了解如何使用 Amazon EC2 Auto Scaling 為回應特定事件而叫用的 AWS Lambda 函數建立自訂終止政策。您建立的 Lambda 函數會處理 Amazon EC2 Auto Scaling 所傳送的輸入資料中的資訊,並傳回準備終止的執行個體清單。

自訂終止政策可針對哪要終止些執行個體及何時終止提供更好的控制。例如,當您的 Auto Scaling 群組縮減時,Amazon EC2 Auto Scaling 無法確定是否有不應中斷的工作負載正在執行。使用 Lambda 函數,您可以驗證終止請求,並等到工作負載完成後,再將執行個體 ID 傳回 Amazon EC2 Auto Scaling 以進行終止。

輸入資料

Amazon EC2 Auto Scaling 會產生 JSON 承載以在事件中進行擴展,並且當執行個體即將因執行個體存留時間上限或執行個體重新整理功能而終止時,也會產生此效能。它還會針對可在可用區域重新平衡群組時啟動的事件規模產生 JSON 承載資料。

此承載包含有關 Amazon EC2 Auto Scaling 需要終止的容量、建議終止的執行個體清單,以及啟動終止的事件等資訊。

以下是承載範例:

{ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg", "AutoScalingGroupName": "my-asg", "CapacityToTerminate": [ { "AvailabilityZone": "us-east-1b", "Capacity": 2, "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "on-demand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, ... ], "Cause": "SCALE_IN" }

承載資源包括 Auto Scaling 群組的名稱、其 Amazon Resource Name (ARN),以及下列元素:

  • CapacityToTerminate 描述您的 Spot 或隨需容量中有多少數量設定為在指定可用區域中終止。

  • Instances 代表 Amazon EC2 Auto Scaling 根據 CapacityToTerminate 中的資訊而建議終止的執行個體。

  • Cause 描述引發終止的事件:SCALE_ININSTANCE_REFRESHMAX_INSTANCE_LIFETIMEREBALANCE

以下資訊概述了 Amazon EC2 Auto Scaling 如何在輸入資料中產生 Instances 的最重要因素:

  • 由於事件和執行個體重新整理型終止的規模而終止執行個體時,維護可用區域的平衡優先順序。因此,如果某一個可用區域的執行個體比另一個由群組使用的可用區域還要多,則入資料會包含僅來自不平衡可用區域且符合終止資格的執行個體。如果群組使用的可用區域處於平衡狀態,則輸入資料會包含來自群組中的所有可用區域的執行個體。

  • 使用混合執行個體政策時,根據每個購買選項所需的百分比,維持 Spot 和隨需容量的平衡也具有優先權。我們首先要識別應終止兩種類型 (Spot 或隨需) 中的哪一種。接著,我們會識別我們可以在哪些可用區域中終止哪些執行個體 (在已識別的購買選項內) 將會使可用區域最為平衡。

回應資料

輸入資料和回應資料一起運作,以縮減要終止的執行個體清單。

使用給定的輸入,Lambda 函數的回應應類似於下列範例:

{ "InstanceIDs": [ "i-02e1c69383a3ed501", "i-036bc44b6092c01c7", ... ] }

回應中的 InstanceIDs 代表準備終止的執行個體。

您也可以傳回準備終止的一組不同執行個體,這會覆寫輸入資料中的執行個體。如果在叫用 Lambda 函數時沒有準備好終止的執行個體,您也可以選擇不傳回任何執行個體。

沒有執行個體可以終止時,Lambda 函數的回應應類似於以下範例:

{ "InstanceIDs": [ ] }

考量事項

使用自訂終止政策時,請注意以下注意事項:

  • 先在回應資料中傳回執行個體並不能保證其會終止。如果在叫用 Lambda 函數時傳回的執行個體數量超過所需數量,Amazon EC2 Auto Scaling 會根據您為 Auto Scaling 群組指定的其他終止政策來評估每個執行個體。當有多個終止政策時,會嘗試套用清單中的下一個終止政策,而且如果執行個體數量多於需終止的數量,則會繼續執行下一個終止政策,依此類推。如果未指定其他終止政策,則會使用預設終止政策來判斷要終止哪些執行個體。

  • 如果未傳回執行個體或 Lambda 函數逾時,Amazon EC2 Auto Scaling 會等待一小段時間,然後再次叫用您的函數。對於任何規模的事件,只要該組的所需容量小於其當前容量,它就會繼續嘗試。對於執行個體重新整理型終止,則會繼續嘗試一個小時。之後,如果仍然無法終止任何執行個體,執行個體重新整理作業即會失敗。透過執行個體生命週期上限設定,Amazon EC2 Auto Scaling 會繼續嘗試終止被識別為超過其生命週期上限的執行個體。

  • 因為函數會重複重試,所以請務必在使用 Lambda 函數作為自訂終止政策之前,先測試並修正程式碼中的任何永久錯誤。

  • 如果您使用自己的待終止執行個體清單來覆寫輸入資料,而終止這些執行個體會使可用區域失去平衡,則 Amazon EC2 Auto Scaling 會逐步重新平衡可用區域之間的容量分佈。首先,系統會叫用 Lambda 函數來查看是否有準備終止的執行個體,以確定是否要開始重新平衡。如果有執行個體準備要終止,則會先啟動新的執行個體。執行個體啟動完成後,它會偵測到群組目前的容量是否高於其所需容量,並在事件中啟動規模。

  • 自訂終止政策不會影響您同時使用 scale in 保護來保護特定執行個體不被終止的能力。如需詳細資訊,請參閱 使用執行個體擴充保護來控制執行個體終止

建立 Lambda 函式

首先會建立 Lambda 函數,以便您可以在 Auto Scaling 群組的終止政策中指定其 Amazon Resource Name (ARN)。

建立 Lambda 函數 (主控台)
  1. 開啟 Lambda 主控台中的 Functions (函數) 頁面

  2. 在螢幕上方的導覽列中,選擇您在建立 Auto Scaling 群組時所用的相同區域。

  3. 依序選擇 Create function (建立函數)、Author from scratch (從頭開始撰寫)。

  4. Basic information (基本資訊) 下,對於 Function name (函數名稱),為您的函數輸入名稱。

  5. 選擇 Create function (建立函數)。您會回到該函數的程式碼和組態畫面。

  6. 在函數仍在主控台中開啟的情況下,請在 Function code (函數程式碼) 下,將程式碼貼入編輯器。

  7. 選擇部署

  8. 也可以透過選擇 Versions (版本) 索引標籤來建立 Lambda 函數的已發佈版本,然後 Publish new version (發佈新版本)。若要進一步了解 Lambda 中的版本控制,請參閱《AWS Lambda 開發人員指南》中的 Lambda 函數版本

  9. 如果選擇發佈版本,並且要將別名與此版本的 Lambda 函數建立關聯,請選擇 Aliases (別名) 索引標籤。若要進一步了解 Lambda 中的別名,請參閱《AWS Lambda 開發人員指南》中的 Lambda 函數別名

  10. 接著依序選擇 Configuration (組態) 索引標籤、Permissions (許可)。

  11. 向下捲動至 Resource-based policy (資源型政策),然後選擇 Add permissions (新增許可)。資源型政策可用於向政策中所指定的委託人授予叫用函數的許可。在這種情況下,委託人是與 Auto Scaling 群組相關聯的 Amazon EC2 Auto Scaling 服務連結角色

  12. Policy statement (政策陳述式) 區段中,設定您的許可:

    1. 選擇 AWS 帳戶

    2. Principal (委託人) 中,輸入呼叫服務連結角色的 ARN,例如 arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling

    3. 針對「動作」,選擇「lambda:」InvokeFunction。

    4. Statement ID (陳述式 ID) 中,請輸入唯一的陳述式 ID,例如 AllowInvokeByAutoScaling

    5. 選擇儲存

  13. 遵照這些指示後,請繼續進行下一步,在 Auto Scaling 群組的終止政策中指定函數的 ARN。如需詳細資訊,請參閱 變更自動調整資源調整群組的終止原則

注意

如需可用作開發 Lambda 函數參考的範例,請參閱 Amazon EC2 Auto Scaling 展的GitHub 儲存庫

限制

  • 在 Auto Scaling 群組的終止政策中,您只能指定一個 Lambda 函數。如果指定了多個終止政策,則必須先指定 Lambda 函數。

  • 您可以使用不合格的 ARN (不含字尾) 或具有版本或別名作為字尾的合格 ARN 來引用您的 Lambda 函數。如果使用不合格的 ARN (例如 function:my-function),您必須在函數的未發佈版本上建立資源型政策。如果使用合格的 ARN (例如 function:my-function:1function:my-function:prod),您必須在函數的特定發佈版本上建立資源型政策。

  • 您不可將合格的 ARN 與 $LATEST 字尾搭配使用。如果嘗試新增自訂終止政策,而該政策引用與 $LATEST 字尾搭配使用的合格 ARN,則會導致錯誤。

  • 輸入資料中提供的執行個體數量限制為 30,000 個執行個體。如果有超過 30,000 個執行個體可以終止,則輸入資料會包括 "HasMoreInstances": true 以指出傳回的執行個體數量上限。

  • Lambda 函數的執行時間上限為兩秒 (2000 毫秒)。最佳實務是,您應該根據預期的執行時間來設定 Lambda 函數的逾時值。Lambda 函數的預設逾時值為三秒,但此設定可以減少。

  • 如果您的執行階段超過 2 秒的限制,則執行中的任何規模都會保留,直到執行階段低於此閾值為止。對於執行時間持續較長的 Lambda 函數,請尋找減少執行階段的方法,例如快取結果,以便在後續 Lambda 叫用期間擷取結果。