

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

# 教學課程：設定叫用 Lambda 函數的 lifecycle hook
<a name="tutorial-lifecycle-hook-lambda"></a>

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

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

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

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

![\[當您使用 Lambda 函數執行自訂動作時，橫向擴展事件的流程。\]](http://docs.aws.amazon.com/zh_tw/autoscaling/ec2/userguide/images/lifecycle-hook-lambda-function.png)


**注意**  
根據您的使用案例，您可以依照下列步驟並建立 EventBridge 規則來設定生命週期掛鉤。或者，您可以使用 Lambda 函數直接設定生命週期關聯，而無需建立 EventBridge 規則。

**Topics**
+ [先決條件](#lambda-hello-world-tutorial-prerequisites)
+ [步驟 1：建立具有完成生命週期動作所需許可的 IAM 角色](#lambda-create-iam-role)
+ [步驟 2：建立 Lambda 函數](#lambda-create-hello-world-function)
+ [步驟 3：建立 EventBridge 規則](#lambda-create-rule)
+ [步驟 4：新增生命週期掛鉤](#lambda-add-lifecycle-hook)
+ [步驟 5：測試並驗證事件](#lambda-testing-hook-notifications)
+ [步驟 6：清除](#lambda-lifecycle-hooks-tutorial-cleanup)
+ [相關資源](#lambda-lifecycle-hooks-tutorial-related-resources)

## 先決條件
<a name="lambda-hello-world-tutorial-prerequisites"></a>

開始此教學課程前，請先建立 Auto Scaling 群組 (如果尚未建立)。若要建立 Auto Scaling 群組，請開啟 Amazon EC2 主控台的 [Auto Scaling 群組頁面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)，再選擇**建立 Auto Scaling 群組**。

## 步驟 1：建立具有完成生命週期動作所需許可的 IAM 角色
<a name="lambda-create-iam-role"></a>

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

**建立政策**

1. 開啟 IAM 主控台的[政策頁面](https://console.aws.amazon.com/iam/home?#/policies)，然後選擇 **Create policy** (建立政策)。

1. 選擇 **JSON** 標籤。

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

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "autoscaling:CompleteLifecycleAction"
         ],
         "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg"
       }
     ]
   }
   ```

------

1. 選擇**下一步**。

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

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

**建立角色**

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 選擇建**立角色**。

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

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

1. 在 **Add permissions** (新增許可) 下，選擇您建立的政策 (**LogAutoScalingEvent-policy**) 和名為 **AWSLambdaBasicExecutionRole** 的政策。然後選擇**下一步**。
**注意**  
**AWSLambdaBasicExecutionRole** 政策具備函數將日誌寫入到 CloudWatch Logs 時所需的許可。

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

## 步驟 2：建立 Lambda 函數
<a name="lambda-create-hello-world-function"></a>

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

**建立 Lambda 函數**

1. 開啟 Lambda 主控台中的 [Functions (函數) 頁面](https://console.aws.amazon.com/lambda/home#/functions)。

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

1. 在 **Basic information** (基本資訊) 下，為 **Function name** (函數名稱) 輸入 **LogAutoScalingEvent**。

1. 在**執行期**選擇 **Node.js 18.x**。

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

1. 在 **Existing role** (現有角色) 中，選擇 **LogAutoScalingEvent-role**。

1. 保留其他預設值。

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

1. 在主控台中保持 `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;
   };
   ```

   此程式碼會直接記錄事件，以便您能在此教學課程的最後看到 CloudWatch Logs 日誌串流中出現與此 Lambda 函數相關聯的事件。

1. 選擇 **Deploy** (部署)。

## 步驟 3：建立 EventBridge 規則
<a name="lambda-create-rule"></a>

建立 EventBridge 規則來執行 Lambda 函數。如需有關使用 EventBridge 的詳細資訊，請參閱 [使用 EventBridge 處理 Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md)。

**使用主控台建立規則**

1. 開啟 [EventBridge 主控台](https://console.aws.amazon.com/events/)。

1. 在導覽窗格中，選擇**規則**。

1. 選擇**建立規則**。

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

   1. 對於**名稱**，輸入 **LogAutoScalingEvent-rule**。

   1. 針對**事件匯流排**選擇**預設值**。當您 AWS 服務 帳戶中的 產生事件時，一律會前往您帳戶的預設事件匯流排。

   1. 針對**規則類型**，選擇**具有事件模式的規則**。

   1. 選擇**下一步**。

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

   1. 在 **Event source** (事件來源) 欄位中，選擇 **AWS events or EventBridge partner events** (事件或 EventBridge 合作夥伴事件)。

   1. 向下捲動至**事件模式**，然後執行以下操作：

   1. 

      1. 在 **Event source (事件來源)**，選擇 **AWS 服務**。

      1. 對於 **AWS 服務**，選擇 **Auto Scaling**。

      1. 在 **Event Type (事件類型)** 中，選擇 **Instance Launch and Terminate (執行個體啟動和終止)**。

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

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

      1. 選擇**下一步**。

1. 針對 **Select target(s)** (選取目標) 執行下列動作：

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

   1. 對於 **Select a target** (選取目標)，選擇 **Lambda function** (Lambda 函數)。

   1. 對於 **Function** (函數)，選擇 **LogAutoScalingEvent**。

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

1. 在**檢閱和建立**頁面上，選取**建立規則**。

## 步驟 4：新增生命週期掛鉤
<a name="lambda-add-lifecycle-hook"></a>

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

**新增 lifecycle hook**

1. 開啟 Amazon EC2 主控台的 [Auto Scaling 群組頁面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

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

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

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

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

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

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

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

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

1. 選擇**建立**。

## 步驟 5：測試並驗證事件
<a name="lambda-testing-hook-notifications"></a>

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

**增加 Auto Scaling 群組的大小**

1. 開啟 Amazon EC2 主控台的 [Auto Scaling 群組頁面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

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

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

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

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

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

**檢視 Lambda 函數的輸出**

1. 開啟 CloudWatch 主控台的 [日誌群組](https://console.aws.amazon.com/cloudwatch/home#logs:) 頁面。

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

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

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

**檢視擴展活動**

1. 返回 **Auto Scaling groups** (Auto Scaling 群組) 頁面並選取群組。

1. 在 **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：清除
<a name="lambda-lifecycle-hooks-tutorial-cleanup"></a>

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

**刪除生命週期掛鉤**

1. 開啟 Amazon EC2 主控台的 [Auto Scaling 群組頁面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

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

1. 在 **Instance management** (執行個體管理) 索引標籤的 **Lifecycle hooks** (lifecycle hook) 中，選擇 lifecycle hook (`LogAutoScalingEvent-hook`)。

1. 選擇 **動作**、**刪除**。

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

**刪除 Amazon EventBridge 規則**

1. 在 Amazon EventBridge 主控台中開啟 [Rules](https://console.aws.amazon.com/events/home?#/rules) (規則) 頁面。

1. 在 **Event bus** (事件匯流排) 下，選擇與規則相關聯的事件匯流排 (`Default`)。

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

1. 選擇 **刪除**。

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

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

**刪除 Lambda 函數**

1. 開啟 Lambda 主控台中的 [Functions (函數) 頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數 (`LogAutoScalingEvent`)。

1. 選擇 **動作**、**刪除**。

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

**刪除日誌群組**

1. 開啟 CloudWatch 主控台的 [日誌群組](https://console.aws.amazon.com/cloudwatch/home#logs:) 頁面。

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

1. 選擇 **動作** 、**刪除日誌群組** 。

1. 在 **刪除日誌群組** 對話方塊中，選擇 **刪除** 。

**刪除執行角色**

1. 開啟 IAM 主控台中的 [Roles](https://console.aws.amazon.com/iam/home?#/roles) (角色) 頁面。

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

1. 選擇 **刪除**。

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

**刪除 IAM 政策**

1. 開啟 IAM 主控台中的[政策頁面](https://console.aws.amazon.com/iam/home?#/policies)。

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

1. 選擇 **動作**、**刪除**。

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

## 相關資源
<a name="lambda-lifecycle-hooks-tutorial-related-resources"></a>

當您根據 Auto Scaling 群組中執行個體發生的事件建立 EventBridge 規則時，下列相關主題可能會有所幫助。
+ [使用 EventBridge 處理 Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md). 本節列出其他使用案例的事件範例，包括縮減事件。
+ [新增 lifecycle hook (主控台)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-console). 此程序說明如何為橫向擴展 (執行個體啟動) 和縮減 (執行個體終止或返回暖集區) 新增生命週期關聯。

如需說明如何使用執行個體中繼資料服務 (IMDS) 從執行個體本身調用動作的教學課程，請參閱 [教學課程：使用資料指令碼和執行個體中繼資料來擷取生命週期狀態](tutorial-lifecycle-hook-instance-metadata.md)。