使用 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 資源名稱 (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 資源名稱 (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 (新增許可)。資源型政策可用於向政策中所指定的委託人授予叫用函數的許可。在此情況下,主體將是與自動擴展群組相關聯的 Amazon EC2 Auto Scaling 服務連結角色

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

    1. 選擇 AWS 帳戶

    2. 針對主體,輸入呼叫服務連結角色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. 選擇 Save (儲存)。

  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),則必須在函數的特定發佈版本上建立以資源為基礎的策略。

  • 您不能使用帶有$LATEST後ARN綴的限定。如果您嘗試新增自訂終止原則,參照ARN具有$LATEST尾碼的限定原則,則會導致錯誤。

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

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

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