使用 Amazon EC2 Auto Scaling 与 EventBridge 结合使用 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon EC2 Auto Scaling 与 EventBridge 结合使用

Amazon EventBridge(以前称为 CloudWatch 事件)可帮助您设置事件驱动型规则,以监控资源并启动使用其他Amazon服务。

Amazon EC2 Auto Scaling 中的事件近乎实时地传输到 EventBridge。您可以建立 EventBridge 规则,以触发针对各种这些事件的编程操作和通知。例如,当实例正处于启动或终止过程中,您可以触发Amazon Lambda函数来执行预配置的任务。或者,您可以触发 Amazon SNS 主题的通知,以监控实例刷新的进度并在特定检查点执行验证。

除了调用 Lambda 函数和通知 Amazon SNS 主题之外,EventBridge 还支持其他类型的目标和操作,例如将事件中继到 Amazon Kinesis 流,激活Amazon Step Functions状态计算机,并调用AmazonSystems Manager 运行命令。有关支持目标的信息,请参阅Amazon EventBridge 目标中的Amazon EventBridge 用户指南

有关 EventBridge 的更多信息,请参阅Amazon EventBridge 入门中的Amazon EventBridge 用户指南。请注意,您还可以创建在 Amazon EC2 Auto Scaling API 调用上触发的规则。有关更多信息,请参阅 。创建 EventBridge 规则,并在AmazonAPI 调用使用Amazon CloudTrail中的Amazon EventBridge 用户指南

Auto Scaling 事件

以下是 Amazon EC2 Auto Scaling 的示例事件。尽最大努力发出事件。

有关使用温池时从 Amazon EC2 Auto Scaling 到 EventBridge 的事件示例,请参阅热泳池活动

有关竞价型实例中断事件的示例,请参阅Spot 实例中断通知中的适用于 Linux 实例的 Amazon EC2 用户指南

EC2 实例启动生命周期操作

Amazon EC2 Auto Scaling 将实例移入Pending:Wait状态。

事件数据

以下是此事件的示例数据。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Instance-launch Lifecycle Action", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn" ], "detail": { "LifecycleActionToken": "87654321-4321-4321-4321-210987654321", "AutoScalingGroupName": "my-asg", "LifecycleHookName": "my-lifecycle-hook", "EC2InstanceId": "i-1234567890abcdef0", "LifecycleTransition": "autoscaling:EC2_INSTANCE_LAUNCHING", "NotificationMetadata": "additional-info" } }

EC2 实例启动成功

Amazon EC2 Auto Scaling 已成功启动实例。

事件数据

以下是此事件的示例数据。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Instance Launch Successful", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn", "instance-arn" ], "detail": { "StatusCode": "InProgress", "Description": "Launching a new EC2 instance: i-12345678", "AutoScalingGroupName": "my-auto-scaling-group", "ActivityId": "87654321-4321-4321-4321-210987654321", "Details": { "Availability Zone": "us-west-2b", "Subnet ID": "subnet-12345678" }, "RequestId": "12345678-1234-1234-1234-123456789012", "StatusMessage": "", "EndTime": "yyyy-mm-ddThh:mm:ssZ", "EC2InstanceId": "i-1234567890abcdef0", "StartTime": "yyyy-mm-ddThh:mm:ssZ", "Cause": "description-text" } }

EC2 实例启动失败

Amazon EC2 Auto Scaling 无法启动实例。

事件数据

以下是此事件的示例数据。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Instance Launch Unsuccessful", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn", "instance-arn" ], "detail": { "StatusCode": "Failed", "AutoScalingGroupName": "my-auto-scaling-group", "ActivityId": "87654321-4321-4321-4321-210987654321", "Details": { "Availability Zone": "us-west-2b", "Subnet ID": "subnet-12345678" }, "RequestId": "12345678-1234-1234-1234-123456789012", "StatusMessage": "message-text", "EndTime": "yyyy-mm-ddThh:mm:ssZ", "EC2InstanceId": "i-1234567890abcdef0", "StartTime": "yyyy-mm-ddThh:mm:ssZ", "Cause": "description-text" } }

EC2 实例终止生命周期操作

Amazon EC2 Auto Scaling 将实例移入Terminating:Wait状态。

事件数据

以下是此事件的示例数据。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Instance-terminate Lifecycle Action", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn" ], "detail": { "LifecycleActionToken":"87654321-4321-4321-4321-210987654321", "AutoScalingGroupName":"my-asg", "LifecycleHookName":"my-lifecycle-hook", "EC2InstanceId":"i-1234567890abcdef0", "LifecycleTransition":"autoscaling:EC2_INSTANCE_TERMINATING", "NotificationMetadata":"additional-info" } }

EC2 实例终止成功

Amazon EC2 Auto Scaling 已成功终止实例。

事件数据

以下是此事件的示例数据。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Instance Terminate Successful", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn", "instance-arn" ], "detail": { "StatusCode": "InProgress", "Description": "Terminating EC2 instance: i-12345678", "AutoScalingGroupName": "my-auto-scaling-group", "ActivityId": "87654321-4321-4321-4321-210987654321", "Details": { "Availability Zone": "us-west-2b", "Subnet ID": "subnet-12345678" }, "RequestId": "12345678-1234-1234-1234-123456789012", "StatusMessage": "", "EndTime": "yyyy-mm-ddThh:mm:ssZ", "EC2InstanceId": "i-1234567890abcdef0", "StartTime": "yyyy-mm-ddThh:mm:ssZ", "Cause": "description-text" } }

EC2 实例终止失败

Amazon EC2 Auto Scaling 无法终止实例。

事件数据

以下是此事件的示例数据。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Instance Terminate Unsuccessful", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn", "instance-arn" ], "detail": { "StatusCode": "Failed", "AutoScalingGroupName": "my-auto-scaling-group", "ActivityId": "87654321-4321-4321-4321-210987654321", "Details": { "Availability Zone": "us-west-2b", "Subnet ID": "subnet-12345678" }, "RequestId": "12345678-1234-1234-1234-123456789012", "StatusMessage": "message-text", "EndTime": "yyyy-mm-ddThh:mm:ssZ", "EC2InstanceId": "i-1234567890abcdef0", "StartTime": "yyyy-mm-ddThh:mm:ssZ", "Cause": "description-text" } }

EC2 Auto Scaling 实例刷新检查点

在实例刷新期间,当已替换的实例数达到为检查点定义的百分比阈值时,Amazon EC2 Auto Scaling 会发出事件。

事件数据

以下是此事件的示例数据。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Auto Scaling Instance Refresh Checkpoint Reached", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn" ], "detail": { "InstanceRefreshId": "ab00cf8f-9126-4f3c-8010-dbb8cad6fb86", "AutoScalingGroupName": "my-auto-scaling-group", "CheckpointPercentage": "50", "CheckpointDelay": "300" } }

使用Amazon Lambda处理事件

Amazon Lambda 是一项计算服务,您可用来运行代码而无需预配置或管理服务器。您可将代码打包并上传到Amazon Lambda作为Lambda 函数。Amazon Lambda然后在调用该函数时运行该函数。您可以手动调用函数,自动调用函数以响应事件,或者响应来自应用程序或服务的请求。

要帮助您开始使用 Lambda,请按照以下过程操作。本部分介绍如何创建 Lambda 函数和 EventBridge 规则,使所有实例启动和终止事件都记录在 Amazon CloudWatch Logs 中。

有关介绍如何创建 Lambda 函数以执行生命周期操作的分步教程,请参阅教程:配置调用 Lambda 函数的生命周期挂钩。本教程介绍如何开始使用生命周期挂钩。使用生命周期钩子,您可以使用 Lambda 在实例投入使用之前或终止实例之前对其执行任务。

创建 Lambda 函数

要创建 Lambda 函数,请按照以下过程操作hello-world蓝图作为事件的目标。

创建 Lambda 函数

  1. 通过以下网址打开 Amazon Lambda 控制台:https://console.aws.amazon.com/lambda/

  2. 如果您是首次接触 Lambda,则会看到欢迎页面;选择立即入门;否则,请选择。创建 Lambda 函数

  3. 在存储库的选择蓝图页面上,输入hello-world对于 来说为筛选条件,然后选择hello-world蓝图。

  4. Configure triggers 页面上,选择 Next

  5. Configure function 页面上,执行以下操作:

    1. 输入 Lambda 函数的名称和说明。

    2. 编辑 Lambda 函数的代码。例如,以下代码仅记录事件。

      console.log('Loading function'); exports.handler = function(event, context) { console.log("AutoScalingEvent()"); console.log("Event data:\n" + JSON.stringify(event, null, 4)); context.succeed("..."); };
    3. 对于角色,选择选择现有角色。对于现有角色,选择您的基本执行角色。否则,创建基本执行角色。

    4. (可选)对于 Advanced settings,进行所需的任何更改。

    5. 选择 Next (下一步)

  6. Review 页面上,选择 Create function

将事件路由到 Lambda 函数

创建与选定事件匹配的规则,并将这些事件路由到 Lambda 函数以采取操作。

创建将事件路由到 Lambda 函数的规则

  1. 打开位于 https://console.aws.amazon.com/events/ 的 Amazon EventBridge 控制台。

  2. 在导航窗格中的事件中,选择Rule

  3. 选择 Create rule (创建规则)

  4. 为规则输入名称和描述。

  5. 对于 Define pattern (定义模式),请执行以下操作:

    1. 选择 Event Pattern (事件模式)

    2. 适用于事件匹配模式中,选择由服务预定义

      提示

      您还可以创建一个规则,该规则使用自定义事件模式来检测 Amazon EC2 Auto Scaling 事件并仅对其进行操作。此子集可以基于 Amazon EC2 Auto Scaling 在其事件中包含的特定字段。有关更多信息,请参阅 。事件模式中的Amazon EventBridge 用户指南。有关示例事件模式,请参阅第 3 步:创建 EventBridge 规则生命周期挂钩教程中。

    3. 适用于Service 提供商中,选择Amazon Web Services

    4. 对于 Service Name,选择 Auto Scaling

    5. 对于 Event Type (事件类型),选择 Instance Launch and Terminate (实例启动和终止)

    6. 选择任何实例事件以捕获所有成功和失败的实例启动和终止事件。

    7. 默认情况下,该规则与区域中任何 Auto Scaling 组匹配。要使规则与特定的 Auto Scaling 组匹配,请选择特定组名称,然后选择一个或多个 Auto Scaling 组。

  6. 对于 Select event bus (选择事件总线),选择 Amazon default event bus (亚马逊云科技默认事件总线)。当您账户中的某个 Amazon 服务发出一个事件时,它始终会发送到您账户的默认事件总线。

  7. 对于 Target (目标),选择 Lambda function (Lambda 函数)

  8. 对于函数,选择您创建的 Lambda 函数。

  9. 选择创建

要测试您的规则,请更改 Auto Scaling 组的大小。如果您使用 Lambda 函数的示例代码,则它会将事件记录到 CloudWatch Logs 中。

测试您的规则

  1. 打开 Amazon EC2 Auto Scaling 控制台,网址为:https://console.aws.amazon.com/ec2autoscaling/

  2. 在存储库的详细信息选项卡上,选择。编辑从页面右侧。

  3. 更改的值所需容量,然后选择。更新

  4. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

  5. 在导航窗格上,选择 Logs

  6. 选择 Lambda 函数的日志组(例如/aws/lambda/my-函数)。

  7. 选择日志流以查看事件数据。此时将显示数据,类似以下内容:

    
                            在 CloudWatch Logs 中查看 Amazon EC2 Auto Scaling 的事件数据。

为实例刷新事件创建 EventBridge 规则

本节介绍如何创建规则,以便在实例刷新期间到达检查点时通知您。包括通过 Amazon SNS 设置电子邮件通知的过程。要使用 Amazon SNS 发送电子邮件通知,必须先创建主题,然后用您的电子邮件地址订阅该主题。

创建 Amazon SNS 主题

SNS 主题是逻辑接入点,即 Auto Scaling 组用来发送通知的通信通道。您可通过为主题指定名称来创建主题。

创建主题名称时,该名称必须满足以下要求:

  • 介于 1 到 256 个字符之间

  • 包含大写和小写 ASCII 字母、数字、下划线或连字符

有关更多信息,请参阅 。创建 Amazon SNS 主题中的Amazon Simple Notification Service 开发指南

订阅 Amazon SNS 主题

要接收 Auto Scaling 组发送到该主题的通知,必须为终端节点订阅该主题。在此过程中,对于终端节点中,指定要用来接收来自 Amazon EC2 Auto Scaling 的通知的电子邮件地址。

有关更多信息,请参阅 。订阅 Amazon SNS 主题中的Amazon Simple Notification Service 开发人员指南

确认您的 Amazon SNS 订阅

Amazon SNS 将向您在上一步骤中指定的电子邮件地址发送确认电子邮件。

请确保您从打开电子邮件Amazon通知并选择链接以确认订阅,然后继续执行下一步骤。

您将收到一封确认消息Amazon。Amazon SNS 现已配置为接收通知并以电子邮件形式将通知发送到您指定的电子邮件地址。

将事件路由到您的 Amazon SNS 主题

创建匹配选定事件的规则,并将它们路由到您的 Amazon SNS 主题,以通知订阅的电子邮件地址。

创建将事件路由到您的 Amazon SNS 主题的规则

  1. 打开位于 https://console.aws.amazon.com/events/ 的 Amazon EventBridge 控制台。

  2. 在导航窗格中的事件中,选择Rule

  3. Rule部分,选择。创建规则

  4. 为规则输入名称和描述。

  5. 对于 Define pattern (定义模式),请执行以下操作:

    1. 选择 Event Pattern (事件模式)

    2. 适用于事件匹配模式中,选择由服务预定义

    3. 适用于Service 提供商中,选择Amazon Web Services

    4. 对于 Service Name,选择 Auto Scaling

    5. 适用于Event type中,选择实例刷新

    6. 默认情况下,该规则与区域中任何 Auto Scaling 组匹配。要使规则与特定的 Auto Scaling 组匹配,请选择特定组名称,然后选择一个或多个 Auto Scaling 组。

  6. 对于 Select event bus (选择事件总线),选择 Amazon default event bus (亚马逊云科技默认事件总线)。当您账户中的某个 Amazon 服务发出一个事件时,它始终会发送到您账户的默认事件总线。

  7. 对于 Target (目标),选择 SNS topic (SNS 主题)

  8. 适用于主题下,选择您创建的 Amazon SNS 主题。

  9. 适用于配置输入中,选择电子邮件通知的输入。

  10. 选择创建