

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

# 準備將 lifecycle hook 新增至您的 Auto Scaling 群組
<a name="prepare-for-lifecycle-notifications"></a>

將 lifecycle hook 新增至 Auto Scaling 群組之前，請確保正確設定使用者資料指令碼或通知目標。
+ 若要在執行個體啟動時使用使用者資料指令碼以在執行個體上執行自訂動作，您不需要設定通知目標。但是，您必須建立好指定使用者資料指令碼的啟動範本或啟動組態，並將其與 Auto Scaling 群組相互關聯。如需使用者資料指令碼的詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[在啟動時在 Linux 執行個體上執行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。
+ 若要在生命週期動作完成時向 Amazon EC2 Auto Scaling 發出訊號，則必須在指令碼中加入 [CompleteLifecycleAction](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html) API 呼叫，且您必須手動建立 IAM 角色，而該角色的政策允許 Auto Scaling 執行個體呼叫此 API。您的啟動範本或啟動組態必須使用啟動時即連接至 Amazon EC2 執行個體的 IAM 執行個體設定檔來指定此角色。如需詳細資訊，請參閱[在 Auto Scaling 群組中完成生命週期動作](completing-lifecycle-hooks.md)及[在 Amazon EC2 執行個體上執行的應用程式的 IAM 角色](us-iam-role.md)。
+ 若要允許 Lambda 在生命週期動作完成時向 Amazon EC2 Auto Scaling 發出訊號，您必須在函數程式碼中加入 [CompleteLifecycleAction](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html) API 呼叫。您還必須將 IAM 政策連接至函數的執行角色，該執行角色能授予 Lambda 完成生命週期動作的許可。如需詳細資訊，請參閱[教學課程：設定叫用 Lambda 函數的 lifecycle hook](tutorial-lifecycle-hook-lambda.md)。
+ 若要使用 Amazon SNS 或 Amazon SQS 等服務執行自訂動作，您必須已建立 SNS 主題或 SQS 佇列，並準備好其 Amazon Resource Name (ARN)。您還必須建立好 IAM 角色，允許 Amazon EC2 Auto Scaling 存取您的 SNS 主題或 SQS 目標，並準備好其 ARN。如需詳細資訊，請參閱[設定生命週期通知的通知目標](#lifecycle-hook-notification-target)。
**注意**  
預設情況下，您在主控台中新增 lifecycle hook 時，Amazon EC2 Auto Scaling 便會向 Amazon EventBridge 傳送生命週期事件通知。使用 EventBridge 或使用者資料指令碼是建議的最佳實務。若要建立直接將通知傳送到 Amazon SNS、Amazon SQS 或 的生命週期關聯 AWS Lambda，請使用 AWS CLI、 AWS CloudFormation 或 SDK 來新增生命週期關聯。

## 設定生命週期通知的通知目標
<a name="lifecycle-hook-notification-target"></a>

您可以將 lifecycle hook 新增至 Auto Scaling 群組，以便在執行個體進入等待狀態時執行自訂動作。您可以根據偏好的開發方法，選擇目標服務來執行這些動作。

實作生命週期關聯通知目標的方法有四種：
+ **Amazon EventBridge** — 接收通知並執行您想要的動作。
+ **Amazon Simple Notification Service (Amazon SNS)** — 建立發佈通知的主題。用戶端可以訂閱 SNS 主題，並使用支援的通訊協定接收發佈的訊息。
+ **Amazon Simple Queue Service (Amazon SQS)** — 透過輪詢模型交換訊息。
+ **AWS Lambda** — 叫用執行所需動作的 Lambda 函數。

最佳實務建議您使用 EventBridge。傳送至 Amazon SNS 和 Amazon SQS 的通知包含的資訊與 Amazon EC2 Auto Scaling 傳送至 EventBridge 的通知相同。在 EventBridge 之前，標準實務是將通知傳送至 SNS 或 SQS，並將其他服務與 SNS 或 SQS 整合，以執行程式設計動作。如今，EventBridge 為您提供更多選項，可讓您選擇以哪些服務為目標，並能更輕鬆地透過無伺服器架構處理事件。

請記住，如果啟動範本或啟動組態中的使用者資料指令碼會在執行個體啟動時對其進行設定，則您無需接收通知，即可在執行個體上執行自訂動作。

下列步驟介紹如何設定通知目標。

**Topics**
+ [使用 EventBridge 將通知路由至 Lambda](#cloudwatch-events-notification)
+ [使用 Amazon SNS 接收通知](#sns-notifications)
+ [使用 Amazon SQS 接收通知](#sqs-notifications)
+ [將通知 AWS Lambda 直接路由到](#lambda-notification)
+ [通知訊息範例](#notification-message-example)

**重要**  
搭配 lifecycle hook 使用的 EventBridge 規則、Lambda 函數、Amazon SNS 主題和 Amazon SQS 佇列的所在區域必須永遠與 Auto Scaling 群組建立所在的區域相同。

### 使用 EventBridge 將通知路由至 Lambda
<a name="cloudwatch-events-notification"></a>

您可以將 EventBridge 規則設定為在執行個體進入等待狀態時叫用 Lambda 函數。Amazon EC2 Auto Scaling 會向 EventBridge 傳送關於正在啟動或終止的執行個體的生命週期事件通知，以及可用於控制生命週期動作的權杖。如需這些事件的範例，請參閱 [Amazon EC2 Auto Scaling 事件參考](ec2-auto-scaling-event-reference.md)。

**注意**  
當您使用 AWS 管理主控台 建立事件規則時，主控台會自動新增必要的 IAM 許可，以授予 EventBridge 呼叫 Lambda 函數的許可。如果您使用 AWS CLI建立事件規則，則需要明確地授予此許可。  
如需有關如何在 EventBridge 主控台中建立事件規則的資訊，請參閱《*Amazon EventBridge 使用者指南*》中的「[建立對事件做出反應的 Amazon EventBridge 規則](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)」。  
– 或 –   
如需關於主控台使用者的簡介教學課程，請參閱 [教學課程：設定叫用 Lambda 函數的 lifecycle hook](tutorial-lifecycle-hook-lambda.md)。此教學課程能讓您了解如何建立簡單的 Lambda 函數，以接聽啟動事件並將其寫入 CloudWatch Logs 日誌。

**建立叫用 Lambda 函數的 EventBridge 規則**

1. 使用 [Lambda 主控台](https://console.aws.amazon.com/lambda/home#/functions)建立 Lambda 函數，及記下 Amazon Resource Name (ARN)。例如 `arn:aws:lambda:region:123456789012:function:my-function`。您需要 ARN 來建立 EventBridge 目標。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 入門](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。

1. 若要建立符合執行個體啟動之事件的規則，請使用下列 [put-rule](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/events/put-rule.html) 命令。

   ```
   aws events put-rule --name my-rule --event-pattern file://pattern.json --state ENABLED
   ```

   以下範例展示適用於執行個體啟動生命週期動作的 `pattern.json`。將**斜體**顯示文字取代為您的 Auto Scaling 群組名稱。

   ```
   {
     "source": [ "aws.autoscaling" ],
     "detail-type": [ "EC2 Instance-launch Lifecycle Action" ],
     "detail": {
         "AutoScalingGroupName": [ "my-asg" ]
      }
   }
   ```

   如果命令執行成功，EventBridge 會使用規則的 ARN 來回應。請記住 ARN。您需要在步驟 4 輸入此名稱。

   若要建立符合其他事件的規則，請修改事件模式。如需詳細資訊，請參閱[使用 EventBridge 處理 Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md)。

1. 若要指定要用作規則目標的 Lambda 函數，請使用以下 [put-target](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/events/put-targets.html) 命令。

   ```
   aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function
   ```

   在上述命令中，*my-rule* 是您在步驟 2 中為規則指定的名稱，而 `Arn` 參數的值則是您在步驟 1 中建立的函數 ARN。

1. 若要新增允許規則呼叫目標 Lambda 函數的許可，請使用以下 Lambda [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令。此命令會信任 EventBridge 服務委託人 (`events.amazonaws.com`)，並根據指定的規則來設定許可的範圍。

   ```
   aws lambda add-permission --function-name my-function --statement-id my-unique-id \
     --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn arn:aws:events:region:123456789012:rule/my-rule
   ```

   在上述命令中：
   + *my-function* 是您希望讓規則作為目標使用的 Lambda 函數名稱。
   + *my-unique-id* 是您定義來描述 Lambda 函數政策陳述式的唯一識別符。
   + `source-arn` 為 EventBridge 規則的 ARN。

   如果此命令成功執行，您會收到類似如下的輸出。

   ```
   {
     "Statement": "{\"Sid\":\"my-unique-id\",
       \"Effect\":\"Allow\",
       \"Principal\":{\"Service\":\"events.amazonaws.com\"},
       \"Action\":\"lambda:InvokeFunction\",
       \"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:my-function\",
       \"Condition\":
         {\"ArnLike\":
           {\"AWS:SourceArn\":
            \"arn:aws:events:us-west-2:123456789012:rule/my-rule\"}}}"
   }
   ```

   `Statement` 值是陳述式的 JSON 字串版本，且已新增至 Lambda 函數政策。

1. 當您遵照這些指示後，請繼續進行 [將生命週期掛鉤新增至 Auto Scaling 群組](adding-lifecycle-hooks.md) 步驟。

### 使用 Amazon SNS 接收通知
<a name="sns-notifications"></a>

您可以使用 Amazon SNS 設定通知目標 (SNS 主題)，在生命週期動作發生時接收通知。然後，Amazon SNS 會將通知傳送給訂閱的收件人。在確認訂閱前，都不會將發佈至主題的通知傳送給收件人。

**使用 Amazon SNS 設定通知**

1. 使用 [Amazon SNS 主控台](https://console.aws.amazon.com/sns/)或下列 [create-topic](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/create-topic.html) 命令建立 Amazon SNS 主題。請確認此主題與您使用的 Auto Scaling 群組位於同一個區域。如需詳細資訊，請參閱《Amazon Simple Notification Service 開發人員指南》**中的 [Amazon SNS 入門](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html)。

   ```
   aws sns create-topic --name my-sns-topic
   ```

1. 請記下主題 Amazon Resource Name (ARN)，例如 `arn:aws:sns:region:123456789012:my-sns-topic`。您需要此資訊來建立 lifecycle hook。

1. 建立 IAM 服務角色，讓 Amazon EC2 Auto Scaling 能夠存取 Amazon SNS 通知目標。

    **讓 Amazon EC2 Auto Scaling 存取 SNS 主題。**

   1. 前往網址 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

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

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

   1. 針對您的使用案例，在 **Use cases for other AWS services** (其他 服務的使用案例) 下，選擇 **EC2 Auto Scaling**，然後選擇 **EC2 Auto Scaling Notification Access** (EC2 Auto Scaling 通知存取)。

   1. 選擇 **Next** (下一步) 兩次，前往 **Name, review, and create** (命名、檢閱和建立) 頁面。

   1. 在 **Role name** (角色名稱) 欄位中，輸入角色名稱 (例如：**my-notification-role**)，然後選擇 **Create role** (建立角色)。

   1. 在 **Roles (角色)** 頁面上，選擇您剛建立的角色，以開啟 **Summary** (摘要) 頁面。請記下角色 **ARN**。例如 `arn:aws:iam::123456789012:role/my-notification-role`。您需要此資訊來建立 lifecycle hook。

1. 當您遵照這些指示後，請繼續進行下一步：[新增 lifecycle hook (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli)。

### 使用 Amazon SQS 接收通知
<a name="sqs-notifications"></a>

您可以在生命週期動作發生時，使用 Amazon SQS 設定通知目標來接收訊息。佇列取用者接著必須輪詢 SQS 佇列，才能對這些通知執行動作。

**重要**  
FIFO 佇列與 lifecycle hook 不相容。

**使用 Amazon SQS 設定通知**

1. 使用 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs/)建立 Amazon SQS 佇列。確定佇列與您使用的 Auto Scaling 群組位於相同區域。如需詳細資訊，請參閱《Amazon Simple Queue Service 開發人員指南》**中的 [Amazon SQS 入門](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-getting-started.html)。

1. 記下佇列 ARN，例如 `arn:aws:sqs:us-west-2:123456789012:my-sqs-queue`。您需要此資訊來建立 lifecycle hook。

1. 建立 IAM 服務角色，讓 Amazon EC2 Auto Scaling 存取 Amazon SQS 通知目標。

    **讓 Amazon EC2 Auto Scaling 存取 SQS 佇列** 

   1. 前往網址 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

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

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

   1. 針對您的使用案例，在 **Use cases for other AWS services** (其他 服務的使用案例) 下，選擇 **EC2 Auto Scaling**，然後選擇 **EC2 Auto Scaling Notification Access** (EC2 Auto Scaling 通知存取)。

   1. 選擇 **Next** (下一步) 兩次，前往 **Name, review, and create** (命名、檢閱和建立) 頁面。

   1. 在 **Role name** (角色名稱) 欄位中，輸入角色名稱 (例如：**my-notification-role**)，然後選擇 **Create role** (建立角色)。

   1. 在 **Roles (角色)** 頁面上，選擇您剛建立的角色，以開啟 **Summary** (摘要) 頁面。請記下角色 **ARN**。例如 `arn:aws:iam::123456789012:role/my-notification-role`。您需要此資訊來建立 lifecycle hook。

1. 當您遵照這些指示後，請繼續進行下一步：[新增 lifecycle hook (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli)。

### 將通知 AWS Lambda 直接路由到
<a name="lambda-notification"></a>

生命週期動作發生時，您可以使用 Lambda 函數做為通知目標。

**將通知 AWS Lambda 直接路由到**

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

1. 選擇您想要的 Lambda 函數。

   如果您想要建立新的 Lambda 函數，請參閱 [建立 Lambda 函式](lambda-custom-termination-policy.md#lambda-custom-termination-policy-create-function)

1. 選擇**組態**索引標籤，然後選擇**許可**。

1. 向下捲動至 **Resource-based policy** (資源型政策)，然後選擇 **Add permissions** (新增許可)。資源型政策可用於向政策中所指定的委託人授予叫用函數的許可。在這種情況下，委託人是與 Auto Scaling 群組相關聯的 [Amazon EC2 Auto Scaling 服務連結角色](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-service-linked-role.html)。

1. 在 **Policy statement** (政策陳述式) 區段中，設定您的許可：

   1. 選擇 **AWS 帳戶**。

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

   1. 在 **Action** (動作) 中，選擇 **lambda:InvokeFunction**。

   1. 在 **Statement ID** (陳述式 ID) 中，請輸入唯一的陳述式 ID，例如 **AllowInvokeByAutoScaling**。

   1. 選擇**儲存**。

1. 當您遵照這些指示後，請繼續進行下一步：[新增 lifecycle hook (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli)。

### 通知訊息範例
<a name="notification-message-example"></a>

本節提供 Amazon SNS、Amazon SQS 和 的通知範例 AWS Lambda。

當執行個體處於等待狀態時，訊息會發佈至 Amazon SNS、Amazon SQS 和 AWS Lambda 通知目標。

訊息包括下列資訊：
+ `Origin` — EC2 執行個體的來源位置。
+ `Destination` — EC2 執行個體要前往的地方。
+ `LifecycleActionToken`：生命週期動作字符。
+ `AccountId` — AWS 帳戶 ID。
+ `AutoScalingGroupName`：Auto Scaling 群組的名稱。
+ `LifecycleHookName`：lifecycle hook 的名稱。
+ `EC2InstanceId`：EC2 執行個體的 ID。
+ `LifecycleTransition`：lifecycle hook 類型。
+ `NotificationMetadata`：通知中繼資料。

以下是通知訊息範例。

```
Service: AWS Auto Scaling
Time: 2021-01-19T00:36:26.533Z
RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a
Origin: EC2
Destination: AutoScalingGroup
LifecycleActionToken: 71514b9d-6a40-4b26-8523-05e7ee35fa40
AccountId: 123456789012
AutoScalingGroupName: my-asg
LifecycleHookName: my-hook
EC2InstanceId: i-0598c7d356eba48d7
LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING
NotificationMetadata: hook message metadata
```

#### 測試通知訊息範例
<a name="test-notification-message-example"></a>

首次新增 lifecycle hook 時，測試通知訊息會發佈到通知目標。以下是測試通知訊息範例。

```
Service: AWS Auto Scaling
Time: 2021-01-19T00:35:52.359Z
RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a
Event: autoscaling:TEST_NOTIFICATION
AccountId: 123456789012
AutoScalingGroupName: my-asg
AutoScalingGroupARN: arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:042cba90-ad2f-431c-9b4d-6d9055bcc9fb:autoScalingGroupName/my-asg
```

**注意**  
如需從 Amazon EC2 Auto Scaling 傳遞到 EventBridge 的事件範例，請參閱 [Amazon EC2 Auto Scaling 事件參考](ec2-auto-scaling-event-reference.md)。