使用 Amazon EventBridge 监控并以编程方式响应您的 EC2 实例集或竞价型实例集发出的事件 - Amazon Elastic Compute Cloud

使用 Amazon EventBridge 监控并以编程方式响应您的 EC2 实例集或竞价型实例集发出的事件

当 EC2 实例集或竞价型实例集的状态发生变化时,其将发出通知。该通知作为发送到 Amazon EventBridge(以前称为 Amazon CloudWatch Events)的事件提供。尽最大努力发出事件。

您可以使用 Amazon EventBridge 创建触发编程操作以响应事件的规则。例如,您可以创建两个 EventBridge 规则:一个在实例集状态变化时触发,另一个在实例集中的实例终止时触发。在本例中,您可以配置第一条规则,这样如果实例集状态发生变化,该规则将调用 SNS 主题,向您发送电子邮件通知。您可以配置第二条规则,这样如果实例集中的实例被终止,该规则将调用 Lambda 函数以启动新实例。

注意

只有类型 maintainrequest 的队列才能触发事件。类型 instant 的队列不会触发事件,因为它们提交同步一次性请求,并且队列的状态立即可在响应中获知。要使用 Amazon EventBridge 监控实例集事件,请求类型必须为 maintainrequest

有关如何描述实例集事件历史记录的说明,请参阅描述 EC2 实例集的事件历史记录

创建 Amazon EventBridge 规则以监控 EC2 实例集或竞价型实例集事件

当 EC2 实例集或竞价型实例集发出状态变更通知时,该通知将作为事件以 JSON 文件的形式发送到 Amazon EventBridge。如果 EventBridge 检测到与规则中定义的模式匹配的事件模式,则 EventBridge 调用规则中指定的一个或多个目标。

您可以编写 EventBridge 规则,从而根据匹配的事件模式自动执行操作。

事件中的下列字段构成规则中定义的事件模式:

"source": "aws.ec2fleet"

识别来自 EC2 队列 的事件。

"detail-type": "EC2 Fleet State Change"

识别事件类型。

"detail": { "sub-type": "submitted" }

识别事件子类型。

有关 EC2 实例集和竞价型实例集事件和示例事件数据的列表,请参阅 EC2 队列 事件类型Spot 队列事件类型

创建 EventBridge 规则以发送通知

下面的示例可创建 EventBridge 规则,以便在 Amazon EC2 每次发出 EC2 队列状态变化通知时发送电子邮件、短信或移动推送通知。本示例中的信号作为 EC2 Fleet State Change 事件发出,这将触发规则定义的操作。

先决条件

创建 EventBridge 规则之前,您必须为电子邮件、短信或移动推送通知创建 Amazon SNS 主题。

创建 EventBridge 规则以在 EC2 队列 状态变化时发送通知
  1. 打开位于 https://console.aws.amazon.com/events/ 的 Amazon EventBridge 控制台。

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

  3. 对于定义规则详细信息,请执行以下操作:

    1. 输入规则的 Name (名称) 和“Description (描述)”(可选)。

      规则不能与同一区域中的另一个规则和同一事件总线上的名称相同。

    2. 对于 Event bus(事件总线),选择 default(默认)。当您账户中的某个 AWS 服务生成一个事件时,它始终会发送到您账户的默认事件总线。

    3. 对于 Rule type(规则类型),选择 Rule with an event pattern(具有事件模式的规则)。

    4. 选择下一步

  4. 对于 Build event pattern(构建事件模式),执行以下操作:

    1. 对于 Event source(事件源),选择 AWS 事件或 EventBridge 合作伙伴事件

    2. 对于 Event pattern(事件模式),在此示例中,您将指定以下事件模式以匹配 EC2 Fleet Instance Change 事件。

      { "source": ["aws.ec2fleet"], "detail-type": ["EC2 Fleet Instance Change"] }

      要添加事件模式,您可以通过选择 Event pattern form(事件模式表)使用模板,或者通过选择 Custom pattern (JSON editor)(自定义模式(JSON 编辑器))指定您自己的模式,如下所示:

      1. 要使用模板创建事件模式,请执行以下操作:

        1. 选择 Event pattern form(事件模式表)。

        2. 对于 Event source(事件源),选择 AWS services(服务)。

        3. 对于 AWS 服务,选择 EC2 实例集

        4. 对于 Event type(事件类型),选择 EC2 Fleet Instance Change(EC2 实例集实例更改)。

        5. 要自定义模板,请选择 Edit pattern(编辑模式),然后进行更改以匹配示例事件模式。

      2. (可选)要指定自定义事件模式,请执行以下操作:

        1. 选择 Custom pattern (JSON editor)(自定义模式(JSON 编辑器))。

        2. Event pattern(事件模式)框中,为此示例添加事件模式。

    3. 选择下一步

  5. 对于 Select target(s)(选择目标),请执行以下操作:

    1. 对于 Target types(目标类型),选择 AWS service(服务)。

    2. 对于 Select a target(选择目标),选择 SNS topic(SNS 主题)以在事件发生时发送电子邮件、短信或移动推送通知。

    3. 对于 Topic(主题),选择现有主题。您首先需要使用 Amazon SNS 控制台创建 Amazon SNS 主题。有关更多信息,请参阅Amazon Simple Notification Service 开发人员指南中的使用 Amazon SNS 进行应用程序对人 (A2P) 消息传送

    4. (可选)在 Additional settings(其他设置)下,您可以选择配置其他设置。有关更多信息,请参阅《Amazon EventBridge 用户指南》中的创建对事件作出反应的 Amazon EventBridge 规则(步骤 16)。

    5. 选择下一步

  6. (可选)对于 Tags(标签),您可以选择向规则分配一个或多个标签,然后选择 Next(下一步)。

  7. 对于 Review and create(查看与创建),执行以下操作:

    1. 查看规则的详细信息并根据需要对其进行修改。

    2. 选择创建规则

有关更多信息,请参阅 Amazon EventBridge 用户指南中的 Amazon EventBridge 规则Amazon EventBridge 事件模式

创建 EventBridge 规则以触发 Lambda 函数

下面的示例可创建 EventBridge 规则,以便在 Amazon EC2 每次在实例启动时发出 EC2 队列实例变更通知时触发 Lambda 函数。本示例中的信号作为 EC2 Fleet Instance Change 事件子类型 launched 发出,这将触发规则定义的操作。

在创建 EventBridge 规则之前,您必须创建 Lambda 函数。

创建要在 EventBridge 规则中使用的 Lambda 函数
  1. 通过 https://console.aws.amazon.com/lambda/ 打开 AWS Lambda 控制台。

  2. 选择创建函数

  3. 输入函数的名称,配置代码,然后选择 Create function(创建函数)。

    有关使用 Lambda 的更多信息,请参阅 AWS Lambda 开发人员指南中的使用控制台创建 Lambda 函数

创建 EventBridge 规则以在 EC2 队列 中的实例改变状态时触发 Lambda 函数
  1. 打开位于 https://console.aws.amazon.com/events/ 的 Amazon EventBridge 控制台。

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

  3. 对于定义规则详细信息,请执行以下操作:

    1. 输入规则的 Name (名称) 和“Description (描述)”(可选)。

      规则不能与同一区域中的另一个规则和同一事件总线上的名称相同。

    2. 对于 Event bus(事件总线),选择 default(默认)。当您账户中的某个 AWS 服务生成一个事件时,它始终会发送到您账户的默认事件总线。

    3. 对于 Rule type(规则类型),选择 Rule with an event pattern(具有事件模式的规则)。

    4. 选择下一步

  4. 对于 Build event pattern(构建事件模式),执行以下操作:

    1. 对于 Event source(事件源),选择 AWS 事件或 EventBridge 合作伙伴事件

    2. 对于 Event pattern(事件模式),在此示例中,您将指定以下事件模式以匹配 EC2 Fleet Instance Change 事件和 launched 子类型。

      { "source": ["aws.ec2fleet"], "detail-type": ["EC2 Fleet Instance Change"], "detail": { "sub-type": ["launched"] }

      要添加事件模式,您可以通过选择 Event pattern form(事件模式表)使用模板,或者通过选择 Custom pattern (JSON editor)(自定义模式(JSON 编辑器))指定您自己的模式,如下所示:

      1. 要使用模板创建事件模式,请执行以下操作:

        1. 选择 Event pattern form(事件模式表)。

        2. 对于 Event source(事件源),选择 AWS services(服务)。

        3. 对于 AWS 服务,选择 EC2 实例集

        4. 对于 Event type(事件类型),选择 EC2 Fleet Instance Change(EC2 实例集实例更改)。

        5. 选择 Edit pattern(编辑模式),然后添加 "detail": {"sub-type": ["launched"] 以匹配示例事件模式。对于正确的 JSON 格式,在前面的方括号(,)之后插入一个逗号(])。

      2. (可选)要指定自定义事件模式,请执行以下操作:

        1. 选择 Custom pattern (JSON editor)(自定义模式(JSON 编辑器))。

        2. Event pattern(事件模式)框中,为此示例添加事件模式。

    3. 选择下一步

  5. 对于 Select target(s)(选择目标),请执行以下操作:

    1. 对于 Target types(目标类型),选择 AWS service(服务)。

    2. 对于 Select a target(选择目标),选择 SNS topic(SNS 主题)以在事件发生时发送电子邮件、短信或移动推送通知。

    3. 对于 Topic(主题),选择 Lambda function(Lambda 函数),对于 Function(函数),选择您创建的用于在事件发生时响应的函数。

    4. (可选)在 Additional settings(其他设置)下,您可以选择配置其他设置。有关更多信息,请参阅《Amazon EventBridge 用户指南》中的创建对事件作出反应的 Amazon EventBridge 规则(步骤 16)。

    5. 选择下一步

  6. (可选)对于 Tags(标签),您可以选择向规则分配一个或多个标签,然后选择 Next(下一步)。

  7. 对于 Review and create(查看与创建),执行以下操作:

    1. 查看规则的详细信息并根据需要对其进行修改。

    2. 选择创建规则

有关如何创建 Lambda 函数和运行 Lambda 函数的 EventBridge 规则的教程,请参阅 AWS Lambda 开发人员指南中的教程:使用 EventBridge 记录 Amazon EC2 实例的状态

EC2 队列 事件类型

EC2 队列 事件类型有五种。对于每种事件类型,都有几个子类型。

EC2 队列状态变化

当 EC2 队列 状态变化时,EC2 队列 会将 EC2 Fleet State Change 事件发送到 Amazon EventBridge。

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

{ "version": "0", "id": "715ed6b3-b8fc-27fe-fad6-528c7b8bf8a2", "detail-type": "EC2 Fleet State Change", "source": "aws.ec2fleet", "account": "123456789012", "time": "2020-11-09T09:00:20Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:fleet/fleet-598fb973-87b7-422d-be4d-6b0809bfff0a" ], "detail": { "sub-type": "active" } }

sub-type 可使用的值为:

active

EC2 队列 请求已验证,并且 Amazon EC2 正在尝试使正在运行的实例保持目标数量。

deleted

EC2 队列 请求已删除,没有正在运行的实例。EC2 队列 将在其实例终止两天后被删除。

deleted_running

EC2 队列 请求已删除,且不启动其他实例。现有实例将继续运行,直至被中断或终止。请求会保持此状态,直到所有实例都已中断或终止。

deleted_terminating

EC2 队列 请求已删除,正在终止其实例。请求会保持此状态,直到所有实例都已终止。

expired

EC2 队列 请求已过期。如果请求使用 TerminateInstancesWithExpiration 集创建,则随后的 terminated 事件指示实例已终止。

modify_in_progress

正在修改 EC2 队列 请求。请求将保持该状态,直到完全处理修改。

modify_succeeded

EC2 队列 请求已修改。

submitted

EC2 队列 正在接受评估,并且 Amazon EC2 正准备启动目标数量的实例。

progress

该 EC2 队列 请求正在执行过程中。

EC2 实例集竞价型实例请求更改

当队列中的 Spot 实例请求状态变化时,EC2 队列 会将 EC2 Fleet Spot Instance Request Change 事件发送到 Amazon EventBridge。

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

{ "version": "0", "id": "19331f74-bf4b-a3dd-0f1b-ddb1422032b9", "detail-type": "EC2 Fleet Spot Instance Request Change", "source": "aws.ec2fleet", "account": "123456789012", "time": "2020-11-09T09:00:05Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:fleet/fleet-83fd4e48-552a-40ef-9532-82a3acca5f10" ], "detail": { "spot-instance-request-id": "sir-rmqske6h", "description": "SpotInstanceRequestId sir-rmqske6h, PreviousState: cancelled_running", "sub-type": "cancelled" } }

sub-type 可使用的值为:

active

竞价型实例请求已执行并有关联的竞价型实例。

cancelled

您取消了竞价型实例请求,或竞价型实例请求已过期。

disabled

您停止了竞价型实例。

submitted

已提交竞价型实例请求。

EC2 队列实例更改

当队列中的实例状态变化时,EC2 队列 会将 EC2 Fleet Instance Change 事件发送到 Amazon EventBridge。

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

{ "version": "0", "id": "542ce428-c8f1-0608-c015-e8ed6522c5bc", "detail-type": "EC2 Fleet Instance Change", "source": "aws.ec2fleet", "account": "123456789012", "time": "2020-11-09T09:00:23Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:fleet/fleet-598fb973-87b7-422d-be4d-6b0809bfff0a" ], "detail": { "instance-id": "i-0c594155dd5ff1829", "description": "{\"instanceType\":\"c5.large\",\"image\":\"ami-6057e21a\",\"productDescription\":\"Linux/UNIX\",\"availabilityZone\":\"us-east-1d\"}", "sub-type": "launched" } }

sub-type 可使用的值为:

launched

启动了一个新实例。

terminated

实例已终止。

termination_notified

当 Amazon EC2 在缩减期间终止竞价型实例时,机群的目标容量被缩减,例如,从目标容量 4 减至目标容量 3 时,会发送实例终止通知。

EC2 队列信息

在履行过程中出错时,EC2 队列 会将 EC2 Fleet Information 事件发送到 Amazon EventBridge。信息事件不会阻止队列尝试实现其目标容量。

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

{ "version": "0", "id": "76529817-d605-4571-7224-d36cc1b2c0c4", "detail-type": "EC2 Fleet Information", "source": "aws.ec2fleet", "account": "123456789012", "time": "2020-11-09T08:17:07Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:fleet/fleet-8becf5fe-bb9e-415d-8f54-3fa5a8628b91" ], "detail": { "description": "c4.xlarge, ami-0947d2ba12ee1ff75, Linux/UNIX, us-east-1a, Spot price in either SpotFleetRequestConfigData or SpotFleetLaunchSpecification or LaunchTemplate or LaunchTemplateOverrides is less than Spot market price $0.0619", "sub-type": "launchSpecUnusable" } }

sub-type 可使用的值为:

fleetProgressHalted

每个启动规范中的价格无效,因为它低于 Spot 价格(所有启动规范都已生成 launchSpecUnusable 事件)。如果 Spot 价格发生变化,启动规范可能会变为有效。

launchSpecTemporarilyBlacklisted

配置无效,多次启动实例的尝试都已失败。有关更多信息,请参阅事件的描述。

launchSpecUnusable

启动规范中的价格无效,因为它低于 Spot 价格。

registerWithLoadBalancersFailed

尝试向负载均衡器注册实例失败。有关更多信息,请参阅事件的描述。

EC2 队列错误

在履行过程中出错时,EC2 队列 会将 EC2 Fleet Error 事件发送到 Amazon EventBridge。错误事件阻止了队列尝试实现其目标容量。

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

{ "version": "0", "id": "69849a22-6d0f-d4ce-602b-b47c1c98240e", "detail-type": "EC2 Fleet Error", "source": "aws.ec2fleet", "account": "123456789012", "time": "2020-10-07T01:44:24Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:fleet/fleet-9bb19bc6-60d3-4fd2-ae47-d33e68eafa08" ], "detail": { "description": "m3.large, ami-00068cd7555f543d5, Linux/UNIX: IPv6 is not supported for the instance type 'm3.large'. ", "sub-type": "spotFleetRequestConfigurationInvalid" } }

sub-type 可使用的值为:

iamFleetRoleInvalid

EC2 机群没有启动或终止实例所需的权限。

allLaunchSpecsTemporarilyBlacklisted

所有配置均无效,多次启动实例的尝试已失败。有关更多信息,请参阅事件的描述。

spotInstanceCountLimitExceeded

您已达到可启动的竞价型实例的数量限制。

spotFleetRequestConfigurationInvalid

该配置无效。有关更多信息,请参阅事件的描述。

Spot 队列事件类型

Spot 队列事件类型有五种。对于每种事件类型,都有几个子类型。

EC2 Spot 队列状态变化

当 Spot 队列状态变化时,Spot 队列会将 EC2 Spot Fleet State Change 事件发送到 Amazon EventBridge。

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

{ "version": "0", "id": "d1af1091-6cc3-2e24-203a-3b870e455d5b", "detail-type": "EC2 Spot Fleet State Change", "source": "aws.ec2spotfleet", "account": "123456789012", "time": "2020-11-09T08:57:06Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-4b6d274d-0cea-4b2c-b3be-9dc627ad1f55" ], "detail": { "sub-type": "submitted" } }

sub-type 可使用的值为:

active

已验证竞价型实例集请求,并且 Amazon EC2 正在尝试维护目标数量的正在运行的实例。

cancelled

竞价型实例集请求已取消,没有正在运行的实例。Spot 队列将在其实例终止两天后被删除。

cancelled_running

竞价型实例集请求已取消,且不启动其他实例。现有实例将继续运行,直至被中断或终止。请求会保持此状态,直到所有实例都已中断或终止。

cancelled_terminating

竞价型实例集请求已取消,正在终止其实例。请求会保持此状态,直到所有实例都已终止。

expired

Spot 队列请求已过期。如果请求使用 TerminateInstancesWithExpiration 集创建,则随后的 terminated 事件指示实例已终止。

modify_in_progress

Spot 队列请求正在修改中。请求将保持该状态,直到完全处理修改。

modify_succeeded

Spot 队列请求已修改。

submitted

正在评估 Spot 队列请求,并且 Amazon EC2 正准备启动目标数量的实例。

progress

Spot 队列请求正在执行过程中。

EC2竞价型实例集竞价型实例请求更改

当队列中的 Spot 实例请求状态变化时,Spot 队列会将 EC2 Spot Fleet Spot Instance Request Change 事件发送到 Amazon EventBridge。

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

{ "version": "0", "id": "cd141ef0-14af-d670-a71d-fe46e9971bd2", "detail-type": "EC2 Spot Fleet Spot Instance Request Change", "source": "aws.ec2spotfleet", "account": "123456789012", "time": "2020-11-09T08:53:21Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-a98d2133-941a-47dc-8b03-0f94c6852ad1" ], "detail": { "spot-instance-request-id": "sir-a2w9gc5h", "description": "SpotInstanceRequestId sir-a2w9gc5h, PreviousState: cancelled_running", "sub-type": "cancelled" } }

sub-type 可使用的值为:

active

竞价型实例请求已执行并有关联的竞价型实例。

cancelled

您取消了竞价型实例请求,或竞价型实例请求已过期。

disabled

您停止了竞价型实例。

submitted

已提交竞价型实例请求。

EC2 Spot 队列实例更改

当队列中的实例状态变化时,Spot 队列会将 EC2 Spot Fleet Instance Change 事件发送到 Amazon EventBridge。

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

{ "version": "0", "id": "11591686-5bd7-bbaa-eb40-d46529c2710f", "detail-type": "EC2 Spot Fleet Instance Change", "source": "aws.ec2spotfleet", "account": "123456789012", "time": "2020-11-09T07:25:02Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-c8a764a4-bedc-4b62-af9c-0095e6e3ba61" ], "detail": { "instance-id": "i-08b90df1e09c30c9b", "description": "{\"instanceType\":\"r4.2xlarge\",\"image\":\"ami-032930428bf1abbff\",\"productDescription\":\"Linux/UNIX\",\"availabilityZone\":\"us-east-1a\"}", "sub-type": "launched" } }

sub-type 可使用的值为:

launched

启动了一个新实例。

terminated

实例已终止。

termination_notified

当 Amazon EC2 在缩减期间终止竞价型实例时,机群的目标容量被缩减,例如,从目标容量 4 减至目标容量 3 时,会发送实例终止通知。

EC2 Spot 队列信息

在履行过程中出错时,Spot 队列会将 EC2 Spot Fleet Information 事件发送到 Amazon EventBridge。信息事件不会阻止队列尝试实现其目标容量。

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

{ "version": "0", "id": "73a60f70-3409-a66c-635c-7f66c5f5b669", "detail-type": "EC2 Spot Fleet Information", "source": "aws.ec2spotfleet", "account": "123456789012", "time": "2020-11-08T20:56:12Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-2531ea06-af18-4647-8757-7d69c94971b1" ], "detail": { "description": "r3.8xlarge, ami-032930428bf1abbff, Linux/UNIX, us-east-1a, Spot bid price is less than Spot market price $0.5291", "sub-type": "launchSpecUnusable" } }

sub-type 可使用的值为:

fleetProgressHalted

每个启动规范中的价格无效,因为它低于 Spot 价格(所有启动规范都已生成 launchSpecUnusable 事件)。如果 Spot 价格发生变化,启动规范可能会变为有效。

launchSpecTemporarilyBlacklisted

配置无效,多次启动实例的尝试都已失败。有关更多信息,请参阅事件的描述。

launchSpecUnusable

启动规范中的价格无效,因为它低于 Spot 价格。

registerWithLoadBalancersFailed

尝试向负载均衡器注册实例失败。有关更多信息,请参阅事件的描述。

EC2 Spot 队列错误

在履行过程中出错时,Spot 队列会将 EC2 Spot Fleet Error 事件发送到 Amazon EventBridge。错误事件阻止了队列尝试实现其目标容量。

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

{ "version": "0", "id": "10adc4e7-675c-643e-125c-5bfa1b1ba5d2", "detail-type": "EC2 Spot Fleet Error", "source": "aws.ec2spotfleet", "account": "123456789012", "time": "2020-11-09T06:56:07Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-38725d30-25f1-4f30-83ce-2907c56dba17" ], "detail": { "description": "r4.2xlarge, ami-032930428bf1abbff, Linux/UNIX: The associatePublicIPAddress parameter can only be specified for the network interface with DeviceIndex 0. ", "sub-type": "spotFleetRequestConfigurationInvalid" } }

sub-type 可使用的值为:

iamFleetRoleInvalid

竞价型实例集不具有启动或终止实例所需的权限。

allLaunchSpecsTemporarilyBlacklisted

所有配置均无效,多次启动实例的尝试已失败。有关更多信息,请参阅事件的描述。

spotInstanceCountLimitExceeded

您已达到可启动的竞价型实例的数量限制。

spotFleetRequestConfigurationInvalid

该配置无效。有关更多信息,请参阅事件的描述。