教學課程:設定叫用 Lambda 函數的 lifecycle hook - Amazon EC2 Auto Scaling

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

教學課程:設定叫用 Lambda 函數的 lifecycle hook

在本練習中,您會建立包含篩選器模式的 Amazon EventBridge 規則,在符合時會叫用 AWS Lambda 函數做為規則目標。我們提供要使用的篩選模式和範例函數程式碼。

如果一切設定正確,則在此教學課程的結尾,Lambda 函數會在執行個體啟動時執行自訂動作。自訂動作只會將事件記錄到與 Lambda 函數相關聯的 CloudWatch 記錄日誌串流中。

Lambda 函數也會執行回呼,讓執行個體的生命週期在此動作成功時繼續執行,但在動作失敗時讓執行個體放棄啟動並終止。

下圖摘要說明您使用 Lambda 函數執行自訂動作時向外延展事件的流程。執行個體啟動後,執行個體的生命週期會暫停,直到生命週期掛鉤完成為止,可能是逾時或 Amazon EC2 Auto Scaling 接收訊號以繼續進行。

當您使用 Lambda 函數執行自訂動作時,向外延展事件的流程。

必要條件

開始此教學課程前,請先建立 Auto Scaling 群組 (如果尚未建立)。若要建立 Auto Scaling 群組,請開啟 Amazon EC2 主控台的 Auto Scaling 群組頁面,再選擇建立 Auto Scaling 群組

步驟 1:建立具有完成生命週期動作所需許可的 IAM 角色

建立 Lambda 函數之前,您必須先建立執行角色和許可政策,才能允許 Lambda 完成 lifecycle hook。

建立政策
  1. 開啟 IAM 主控台的政策頁面,然後選擇 Create policy (建立政策)。

  2. 選擇 JSON 標籤。

  3. Policy Document (政策文件) 方塊中,將下列政策文件貼入方塊,取代斜體顯示文字,並提供您的帳戶號碼和 Auto Scaling 群組的名稱。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg" } ] }
  4. 選擇下一步

  5. 針對 Policy name (政策名稱),輸入 LogAutoScalingEvent-policy。選擇建立政策

當您完成建立政策時,您可以建立一個使用它的角色。

建立角色
  1. 在左側導覽窗格中,選擇 Roles (角色)。

  2. 選擇建立角色

  3. 對於 Select trusted entity (選取信任的實體) 區段,選擇 AWS service (AWS 服務)。

  4. 對於您的使用案例,選擇 Lambda,然後選擇 Next (下一步)。

  5. 在 [新增權限] 底下,選擇您建立的原則 (LogAutoScalingEvent-policy) 和命名AWSLambdaBasicExecutionRole的策略。然後選擇下一步

    注意

    AWSLambdaBasicExecutionRole策略具有函數將日誌寫入日誌所需的 CloudWatch 權限。

  6. Name, review, and create (命名、檢閱和建立) 頁面上的 Role name (角色名稱),輸入 LogAutoScalingEvent-role,然後選擇 Create role (建立角色)。

步驟 2:建立 Lambda 函數

建立 Lambda 函數作為事件的目標。以 Node.js 撰寫的範例 Lambda 函數會在 Amazon EC2 Auto Scaling 發出相符事件 EventBridge 時叫用。

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

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

  3. Basic information (基本資訊) 下,為 Function name (函數名稱) 輸入 LogAutoScalingEvent

  4. 執行期選擇 Node.js 18.x

  5. 向下捲動並選擇變更預設執行角色,然後在執行角色中選擇使用現有角色

  6. 針對 [現有角色],選擇 [LogAutoScalingEvent-role]。

  7. 保留其他預設值。

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

  9. 在主控台中保持 LogAutoScalingEvent 函數開啟,在編輯器中的程式碼來源下,將下列範本程式碼貼到名為 index.js 的檔案中。

    import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling"; export const handler = async(event) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new AutoScalingClient({ region: event.region }); var eventDetail = event.detail; var params = { AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */ LifecycleActionResult: 'CONTINUE', /* required */ LifecycleHookName: eventDetail['LifecycleHookName'], /* required */ InstanceId: eventDetail['EC2InstanceId'], LifecycleActionToken: eventDetail['LifecycleActionToken'] }; var response; const command = new CompleteLifecycleActionCommand(params); try { var data = await autoscaling.send(command); console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } catch (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } return response; };

    此程式碼只會記錄事件,以便在本教學課程結束時,您可以看到事件出現在與此 Lambda 函數相關聯的 CloudWatch 記錄資料流中。

  10. 選擇部署

步驟 3:建立 EventBridge 規則

建立 EventBridge 規則以執行 Lambda 函數。如需使用的更多資訊 EventBridge,請參閱用 EventBridge 於處理 Auto Scaling 事件

使用主控台建立規則
  1. 開啟 EventBridge 主控台

  2. 在導覽窗格中,選擇規則

  3. 選擇建立規則

  4. 針對 Define rule detail (定義規則詳細資訊) 執行下列動作:

    1. 針對名稱,輸入 LogAutoScalingEvent-rule

    2. 針對事件匯流排選擇預設值。當您的帳戶 AWS 服務 中的事件產生時,它始終會進入您帳戶的默認事件總線。

    3. 針對規則類型,選擇具有事件模式的規則

    4. 選擇下一步

  5. 針對 Build event pattern (建置事件模式) 執行下列動作:

    1. 對於事件來源,請選擇AWS 事件或 EventBridge 合作夥伴事件。

    2. 向下捲動至事件模式,然後執行以下操作:

      1. Event source (事件來源),選擇 AWS 服務

      2. 對於 AWS 服務,選擇 Auto Scaling

      3. Event Type (事件類型) 中,選擇 Instance Launch and Terminate (執行個體啟動和終止)

      4. 在預設情況下,規則會符合任何縮減或橫向擴展事件。若要建立規則,在出現橫向擴展事件且執行個體因 lifecycle hook 而進入等待狀態時通知您,請選擇 Specific instance event(s) (特定執行個體事件) 並選取 EC2 Instance-launch Lifecycle Action (EC2 執行個體啟動生命週期動作)。

      5. 在預設情況下,規則符合區域中的任何 Auto Scaling 群組。為了讓規則符合特定 Auto Scaling 群組,請選擇特定群組名稱,然後選取一個群組。

      6. 選擇下一步

  6. 針對 Select target(s) (選取目標) 執行下列動作:

    1. 對於 Target types (目標類型),選擇 AWS 服務

    2. 對於 Select a target (選取目標),選擇 Lambda function (Lambda 函數)。

    3. 對於「函數」,請選擇LogAutoScalingEvent

    4. 選擇 Next (下一步) 兩次。

  7. 檢閱和建立頁面上,選取建立規則

步驟 4:新增生命週期掛鉤

在本節中,您會新增 lifecycle hook,以便 Lambda 在啟動時在執行個體上執行函數。

新增 lifecycle hook
  1. 開啟 Amazon EC2 主控台的 Auto Scaling 群組頁面

  2. 選取 Auto Scaling 群組旁的核取方塊。頁面底部會開啟一個分割窗格。

  3. 在下方窗格中,在 Instance management (執行個體管理) 索引標籤的 Lifecycle hooks (lifecycle hook) 中,選擇 Create lifecycle hook (建立 lifecycle hook)。

  4. 若要定義橫向擴展 (執行個體啟動) 的 lifecycle hook,請執行以下操作:

    1. 對於 Lifecycle hook name (lifecycle hook 名稱),輸入 LogAutoScalingEvent-hook

    2. 對於 Lifecycle transition (生命週期轉移),選擇 Instance launch (執行個體啟動)。

    3. 對於 Heartbeat timeout (活動訊號逾時),輸入 300,表示等待 Lambda 函數回呼的秒數。

    4. Default result (預設結果) 中,選擇 ABANDON (放棄)。這表示如果掛鉤逾時而未收到來自 Lambda 函數的回呼,Auto Scaling 群組會終止新的執行個體。

    5. (選用) 讓 Notification metadata (通知中繼資料) 保持空白。我們傳遞給的事件資料 EventBridge 包含呼叫 Lambda 函數所需的所有必要資訊。

  5. 選擇建立

步驟 5:測試並驗證事件

若要測試事件,請將 Auto Scaling 群組的容量增加 1,以便更新 Auto Scaling 群組。系統會在增加所需容量後幾秒內叫用 Lambda 函數。

增加 Auto Scaling 群組的大小
  1. 開啟 Amazon EC2 主控台的 Auto Scaling 群組頁面

  2. 選取 Auto Scaling 群組旁邊的核取方塊,即可在下方窗格中檢視詳細資訊,並仍可查看上方窗格的頂端列。

  3. 在下方窗格中,在 Details (詳細資訊) 索引標籤上選擇 Group details (群組詳細資訊)、Edit (編輯)。

  4. 對於 Desired capacity (所需容量),將目前值增加 1。

  5. 選擇更新。正在啟動執行個體時,上方窗格中的 Status (狀態) 欄會顯示 Updating capacity (更新容量) 狀態。

增加所需容量後,您可以確認 Lambda 函數是否被叫用。

檢視 Lambda 函數的輸出
  1. 開啟主控台的 [記錄群組] 頁 CloudWatch 面

  2. 為 Lambda 函數 (/aws/lambda/LogAutoScalingEvent) 選取日誌群組名稱。

  3. 選取日誌串流的名稱,以便檢視函數為生命週期動作所提供的資料。

接下來,您可以從擴展活動的描述中確認執行個體是否成功啟動。

檢視擴展活動
  1. 返回 Auto Scaling groups (Auto Scaling 群組) 頁面並選取群組。

  2. Activity (活動) 索引標籤的 Activity history (活動歷史記錄) 下方,Status (狀態) 欄會顯示 Auto Scaling 群組是否已成功啟動執行個體。

    • 如果動作成功,擴展活動的狀態將為 Successful (成功)。

    • 如果失敗,在等待幾分鐘之後,您會看到狀態為 Cancelled (已取消) 的擴展活動,以及這樣的狀態訊息:Instance failed to complete user's Lifecycle Action: Lifecycle Action with token e85eb647-4fe0-4909-b341-a6c42EXAMPLE was abandoned: Lifecycle Action Completed with ABANDON Result (執行個體無法完成使用者的生命週期動作:字符為 e85eb647-4fe0-4909-b341-a6c42EXAMPLE 的生命週期動作已遭放棄:生命週期動作完成,結果為放棄)。

降低 Auto Scaling 群組的大小

如果不需要在此測試中啟動的多餘執行個體,可以開啟 Details (詳細資訊) 索引標籤,將 Desired capacity (所需容量) 減少 1。

步驟 6:清除

如果您已完成使用只針對此教學課程建立的資源,請按下列步驟將其刪除。

刪除生命週期掛鉤
  1. 開啟 Amazon EC2 主控台的 Auto Scaling 群組頁面

  2. 選取 Auto Scaling 群組旁的核取方塊。

  3. Instance management (執行個體管理) 索引標籤的 Lifecycle hooks (lifecycle hook) 中,選擇 lifecycle hook (LogAutoScalingEvent-hook)。

  4. 選擇 動作刪除

  5. 再次選擇 Delete (刪除) 進行確認。

刪除 Amazon EventBridge 規則
  1. 在 Amazon EventBridge 控制台中打開規則頁面

  2. Event bus (事件匯流排) 下,選擇與規則相關聯的事件匯流排 (Default)。

  3. 選取規則 (LogAutoScalingEvent-rule) 旁的核取方塊。

  4. 選擇刪除

  5. 出現確認提示時,請輸入規則名稱,然後選擇 Delete (刪除)。

若已完成使用範例函數,請將其刪除。您還可以刪除存放函數日誌的日誌群組,以及您建立的執行角色和許可政策。

刪除 Lambda 函數
  1. 開啟 Lambda 主控台中的 Functions (函數) 頁面。

  2. 選擇函數 (LogAutoScalingEvent)。

  3. 選擇 動作刪除

  4. 出現確認提示時,請輸入 delete 確認刪除指定的函數,然後選擇 Delete (刪除)。

刪除日誌群組
  1. 開啟主控台的 [記錄群組] 頁 CloudWatch 面

  2. 選取函數的日誌群組 (/aws/lambda/LogAutoScalingEvent)。

  3. 選擇 動作刪除日誌群組

  4. 刪除日誌群組 對話方塊中,選擇 刪除

刪除執行角色
  1. 開啟 IAM 主控台中的 Roles (角色) 頁面。

  2. 選取函數的角色 (LogAutoScalingEvent-role)。

  3. 選擇刪除

  4. 出現確認提示時,請輸入角色名稱,然後選擇 Delete (刪除)。

刪除 IAM 政策
  1. 開啟 IAM 主控台中的 政策 頁面。

  2. 選取您建立的政策 (LogAutoScalingEvent-policy)。

  3. 選擇 動作刪除

  4. 出現確認提示時,請輸入政策名稱,然後選擇 Delete (刪除)。

當您根據 Auto Scaling 群組中執行個體發生的事件建立 EventBridge 規則時,下列相關主題可能會很有幫助。

如需說明如何使用執行個體中繼資料服務 (IMDS) 從執行個體本身調用動作的教學課程,請參閱 教學課程:使用資料指令碼和執行個體中繼資料擷取生命