将 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 Events,有助于您设置事件驱动的规则,这些规则可监控资源并启动使用其他 Amazon 服务的目标操作。

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

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

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

Auto Scaling 事件

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

有关使用温水池时从 Amazon EC2 Auto Scaling 传输到 EventBridge 的事件示例,请参阅 暖池事件

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

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

EC2 Auto Scaling 实例刷新已启动

Amazon EC2 Auto Scaling 将在实例刷新状态更改为 InProgress 时发出事件。

事件数据

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

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Auto Scaling Instance Refresh Started", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn" ], "detail": { "InstanceRefreshId": "c613620e-07e2-4ed2-a9e2-ef8258911ade", "AutoScalingGroupName": "my-auto-scaling-group" } }

EC2 Auto Scaling 实例刷新成功

Amazon EC2 Auto Scaling 将在实例刷新状态更改为 Succeeded 时发出事件。

事件数据

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

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Auto Scaling Instance Refresh Succeeded", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn" ], "detail": { "InstanceRefreshId": "c613620e-07e2-4ed2-a9e2-ef8258911ade", "AutoScalingGroupName": "my-auto-scaling-group" } }

EC2 Auto Scaling 实例刷新失败

Amazon EC2 Auto Scaling 将在实例刷新状态更改为 Failed 时发出事件。

事件数据

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

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Auto Scaling Instance Refresh Failed", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn" ], "detail": { "InstanceRefreshId": "c613620e-07e2-4ed2-a9e2-ef8258911ade", "AutoScalingGroupName": "my-auto-scaling-group" } }

EC2 Auto Scaling 实例刷新已取消

Amazon EC2 Auto Scaling 将在实例刷新状态更改为 Cancelled 时发出事件。

事件数据

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

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Auto Scaling Instance Refresh Cancelled", "source": "aws.autoscaling", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-west-2", "resources": [ "auto-scaling-group-arn" ], "detail": { "InstanceRefreshId": "c613620e-07e2-4ed2-a9e2-ef8258911ade", "AutoScalingGroupName": "my-auto-scaling-group" } }

使用 Amazon Lambda 处理事件

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

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

创建 Lambda 函数

使用以下步骤和 hello-world 蓝图创建 Lambda 函数以用作事件的目标。

创建 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. 在导航窗格中的事件下,选择规则

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

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

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

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

    2. 对于事件匹配模式,选择按服务预定义模式

      提示

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

    3. 对于服务提供商,选择 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-function)。

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

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

另请参阅

有关使用 EventBridge 和 Amazon EC2 Auto Scaling 的更多信息,请参阅 为实例刷新事件创建 EventBridge 规则为暖池事件创建 EventBridge 规则

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