使用 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 函數來查看是否有準備終止的執行個體,以確定是否要開始重新平衡。如果有執行個體準備要終止,則會先啟動新的執行個體。當執行個體完成啟動時,它會偵測到您群組的目前容量高於其所需的容量,並在事件發生時啟動擴展。

  • 自訂終止政策不會影響您也使用擴展保護來保護特定執行個體免於終止的能力。如需詳細資訊,請參閱使用執行個體縮減保護來控制執行個體終止

建立 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 (新增許可)。資源型政策可用於向政策中所指定的委託人授予叫用函數的許可。在此情況下,委託人將是與 EC2 Auto Scaling 群組相關聯的 Amazon Auto Scaling 服務連結角色。 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的終止政策中指定函數的 ,做為後續步驟。如需詳細資訊,請參閱變更 Auto Scaling 群組的終止政策

注意

如需可用來做為開發 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 。如果您嘗試新增的自訂終止政策是指ARN符合尾$LATEST碼資格的 ,則會導致錯誤。

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

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

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