準備將 lifecycle hook 新增至您的 Auto Scaling 群組 - Amazon EC2 Auto Scaling

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

準備將 lifecycle hook 新增至您的 Auto Scaling 群組

將 lifecycle hook 新增至 Auto Scaling 群組之前,請確保正確設定使用者資料指令碼或通知目標。

  • 若要在執行個體啟動時使用使用者資料指令碼以在執行個體上執行自訂動作,您不需要設定通知目標。但是,您必須建立好指定使用者資料指令碼的啟動範本或啟動組態,並將其與 Auto Scaling 群組相互關聯。如需有關使用者資料指令碼的詳細資訊,請參閱 Amazon EC2 使用者指南中的啟動時在 Linux 執行個體上執行命令。

  • 若要在生命週期動作完成時向 Amazon EC2 Auto Scaling 發出信號,您必須將 CompleteLifecycleActionAPI 呼叫新增至指令碼,並且必須使用允許 Auto Scaling 執行個體呼叫此 API 的政策手動建立 IAM 角色。您的啟動範本或啟動組態必須使用啟動時即連接至 Amazon EC2 執行個體的 IAM 執行個體設定檔來指定此角色。如需詳細資訊,請參閱 在「Auto Scaling」群組中完成生命週期動作在 Amazon EC2 執行個體上執行的應用程式的 IAM 角色

  • 若要使用 Lambda 之類的服務來執行自訂動作,您必須已建立 EventBridge 規則並指定 Lambda 函數做為其目標。如需詳細資訊,請參閱 設定生命週期通知的通知目標

  • 若要允許 Lambda 在生命週期動作完成時向 Amazon EC2 自動擴展發出信號,您必須將 CompleteLifecycleActionAPI 呼叫新增至函數程式碼。您還必須將 IAM 政策連接至函數的執行角色,該執行角色能授予 Lambda 完成生命週期動作的許可。如需詳細資訊,請參閱教學課程:設定叫用 Lambda 函數的 lifecycle hook

  • 若要使用 Amazon SNS 或 Amazon SQS 等服務執行自訂動作,您必須已建立 SNS 主題或 SQS 佇列,並準備好其 Amazon Resource Name (ARN)。您還必須建立好 IAM 角色,允許 Amazon EC2 Auto Scaling 存取您的 SNS 主題或 SQS 目標,並準備好其 ARN。如需詳細資訊,請參閱 設定生命週期通知的通知目標

    注意

    根據預設,當您在主控台中新增生命週期勾點時,Amazon EC2 Auto Scaling 會將生命週期事件通知傳送給 Amazon EventBridge。建議使用 EventBridge 或使用者資料指令碼。若要建立可直接將通知傳送至 Amazon SNS 或 Amazon SQS 的生命週期勾點,請使用 AWS CLI AWS CloudFormation、或開發套件新增生命週期勾點。

設定生命週期通知的通知目標

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

第一種方法使用 Amazon 調 EventBridge 用 Lambda 函數來執行您想要的操作。第二種方法包括建立 Amazon Simple Notification Service (Amazon SNS) 主題 (即通知的發佈目標)。用戶端可以訂閱 SNS 主題,並使用支援的通訊協定接收發佈的訊息。最後一種方法涉及使用 Amazon Simple Queue Service (Amazon SQS),這是分佈式應用程式用來透過輪詢模型交換訊息的傳訊系統。

最佳作法是建議您使用 EventBridge。傳送至 Amazon SNS 和 Amazon SQS 的通知包含與 Amazon EC2 Auto Scaling 傳送到 EventBridge的通知相同的資訊。之前 EventBridge,標準作法是傳送通知至 SNS 或 SQS,並將另一個服務與 SNS 或 SQS 整合,以執行程式設計動作。現在,您可以為哪些服務 EventBridge 提供更多選項,並使用無伺服器架構更輕鬆地處理事件。

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

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

重要

您搭配生命週期勾點使用的 EventBridge 規則、Lambda 函數、Amazon SNS 主題和 Amazon SQS 佇列必須始終位於建立 Auto Scaling 群組的相同區域。

將通知路由傳送至 Lambda EventBridge

您可以將 EventBridge 規則設定為在執行個體進入等待狀態時叫用 Lambda 函數。Amazon EC2 Auto Scaling 會向正在啟動或終止 EventBridge 的執行個體發出生命週期事件通知,以及可用來控制生命週期動作的權杖。如需這些事件的範例,請參閱 Amazon EC2 Auto Scaling 事件參考

注意

當您使用建立事件規則時,主控台會自動新增必要的 IAM EventBridge 許可,以授與呼叫 Lambda 函數的權限。 AWS Management Console 如果您使用 AWS CLI建立事件規則,則需要明確地授予此許可。

有關如何在 EventBridge 主控台中建立事件規則的詳細資訊,請參閱 Amazon EventBridge 使用者指南中的建立對事件做出反應的 Amazon EventBridge則。

– 或 –

如需關於主控台使用者的簡介教學課程,請參閱 教學課程:設定叫用 Lambda 函數的 lifecycle hook。本教學課程說明如何建立簡單的 Lambda 函數,以偵聽啟動事件並將其寫入 CloudWatch 日誌記錄。

若要建立叫用 Lambda 函數的 EventBridge 規則
  1. 使用 Lambda 主控台建立 Lambda 函數,及記下 Amazon Resource Name (ARN)。例如:arn:aws:lambda:region:123456789012:function:my-function。您需要 ARN 來創建一個 EventBridge 目標。如需詳細資訊,請參閱《AWS Lambda 開發人員指南》中的 Lambda 入門

  2. 若要建立符合執行個體啟動之事件的規則,請使用下列 put-rule 命令。

    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" ] } }

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

    若要建立符合其他事件的規則,請修改事件模式。如需詳細資訊,請參閱 用 EventBridge 於處理 Auto Scaling 事件

  3. 若要指定要用作規則目標的 Lambda 函數,請使用以下 put-target 命令。

    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。

  4. 若要新增允許規則呼叫目標 Lambda 函數的許可,請使用以下 Lambda add-permission 命令。此命令會信任指定規則的 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 函數政策。

  5. 當您遵照這些指示後,請繼續進行 將生命週期掛鉤添加到您的 Auto Scaling 組 步驟。

使用 Amazon SNS 接收通知

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

使用 Amazon SNS 設定通知
  1. 使用 Amazon SNS 主控台或下列 create-topic 命令建立 Amazon SNS 主題。請確認此主題與您使用的 Auto Scaling 群組位於同一個區域。如需詳細資訊,請參閱《Amazon Simple Notification Service 開發人員指南》中的 Amazon SNS 入門

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

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

    讓 Amazon EC2 Auto Scaling 存取 SNS 主題。

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

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

    3. 選擇建立角色

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

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

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

    7. Role name (角色名稱) 欄位中,輸入角色名稱 (例如:my-notification-role),然後選擇 Create role (建立角色)。

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

  4. 當您遵照這些指示後,請繼續進行下一步:新增 lifecycle hook (AWS CLI)

使用 Amazon SQS 接收通知

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

重要

FIFO 佇列與 lifecycle hook 不相容。

使用 Amazon SQS 設定通知
  1. 使用 Amazon SQS 主控台建立 Amazon SQS 佇列。確定佇列與您使用的 Auto Scaling 群組位於相同區域。如需詳細資訊,請參閱《Amazon Simple Queue Service 開發人員指南》中的 Amazon SQS 入門

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

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

    讓 Amazon EC2 Auto Scaling 存取 SQS 佇列

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

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

    3. 選擇建立角色

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

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

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

    7. Role name (角色名稱) 欄位中,輸入角色名稱 (例如:my-notification-role),然後選擇 Create role (建立角色)。

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

  4. 當您遵照這些指示後,請繼續進行下一步:新增 lifecycle hook (AWS CLI)

Amazon SNS 和 Amazon SQS 的通知訊息範例

當執行個體處於等待狀態時,訊息會發佈到 Amazon SNS 或 Amazon SQS 通知目標。訊息包括下列資訊:

  • LifecycleActionToken:生命週期動作字符。

  • AccountId— AWS 帳戶 識別碼。

  • 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 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

測試通知訊息範例

首次新增 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 自動擴展交付到的事件範例 EventBridge,請參閱Amazon EC2 Auto Scaling 事件參考