Amazon CloudWatch Events
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

在 AWS 账户之间发送和接收事件

您可以设置您的 AWS 账户将事件发送到其他 AWS 账户,或接收来自其他账户的事件。如果这些账户属于同一个组织,或属于具有合作伙伴关系或类似关系的组织,这可能会很有用。

如果您将账户设置为发送或接收事件,请指定可以将事件发送到哪些独立 AWS 账户或哪些独立 AWS 账户可以接收来自您账户的事件。如果您使用 AWS Organizations 功能,则可以指定一个组织并授予对该组织中的所有账户的访问权限。有关更多信息,请参阅 AWS Organizations 用户指南 中的什么是 AWS Organizations

整体过程如下所述:

  • 接收方 账户上,编辑默认事件总线 上的权限以允许指定 AWS 账户、一个组织或所有 AWS 账户将事件发送到接收方账户。

  • 发送方 账户中,设置一个或多个将接收方账户的默认事件总线作为目标的规则。

    如果发送方账户由于是某个具有权限的 AWS 组织的一部分而有权发送事件,则发送方账户还必须拥有一个 IAM 角色,该角色具有支持它将事件发送到接收方账户的策略。如果您使用 AWS 管理控制台创建针对接收方账户的规则,这会自动完成。如果您使用 AWS CLI,则必须手动创建该角色。

  • 接收方 账户中,设置一个或多个匹配来自发送方账户的事件的规则。

接收方账户在其中将权限添加到默认事件总线的 AWS 区域必须与发送方账户在其中创建向接收方账户发送事件的规则的区域相同。

从一个账户发送到另一个账户的事件将作为自定义事件向发送账户收取费用。不向接收账户收费。有关更多信息,请参阅 Amazon CloudWatch 定价

如果接收方账户设置了一条将从发送方账户接收的事件发送到第三个账户的规则,则这些事件不会发送到第三个账户。

允许您的 AWS 账户从其他 AWS 账户接收事件

要接收来自其他账户或组织的事件,则必须先编辑您的账户的默认事件总线 上的权限。默认事件总线接受来自 AWS 服务、其他授权 AWS 账户和 PutEvents 调用的事件。

当您编辑默认事件总线上的权限以向其他 AWS 账户授予权限时,可以按账户 ID 或组织 ID 指定账户。或者您可以选择从所有 AWS 账户接收事件。

警告

如果您选择接收来自所有 AWS 账户的事件,请注意创建仅匹配要从其他账户接收的事件的规则。要创建更安全的规则,请确保每个规则的事件模式都包含一个 Account 字段,其中包含要从其接收事件的一个或多个账户的账户 ID。其事件模式包含“账户”字段的规则与从其他账户发送的事件不匹配。有关更多信息,请参阅CloudWatch Events 中的事件模式

使用控制台允许您的账户从其他 AWS 账户接收事件

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在导航窗格中,依次选择 Event BusesAdd Permission

  3. 选择 AWS Account (AWS 账户)Organization (组织)

    如果您选择 AWS Account (AWS 账户),请输入要从中接收事件的账户的 12 位 AWS 账户 ID。要接收来自所有其他 AWS 账户的事件,请选择所有人(*)

    如果您选择了 Organization (组织),请选择 My organization (我的组织) 以便为当前账户所属组织中的所有账户授予权限。或者选择 Another organization (另一个组织),然后输入该组织的组织 ID。键入组织 ID 时,必须包含 o- 前缀。

  4. 选择 Add

  5. 您可以重复这些步骤来添加其他账户或组织。

使用 AWS 允许您的账户从其他 AWS CLI 账户接收事件

  1. 要允许一个特定 AWS 账户发送事件,请运行以下命令:

    aws events put-permission --action events:PutEvents --statement-id MySid --principal SenderAccountID

    要允许 AWS 组织发送事件,请运行以下命令:

    aws events put-permission --action events:PutEvents --statement-id MySid --principal \* --condition '{"Type" : "StringEquals", "Key": "aws:PrincipalOrgID", "Value": "SenderOrganizationID"}'

    要允许所有其他 AWS 账户发送事件,请运行以下命令:

    aws events put-permission --action events:PutEvents --statement-id MySid --principal \*

    您可以运行 aws events put-permission 多次以便为独立 AWS 账户和组织授予权限,但您无法在单个命令中同时指定独立账户和组织。

  2. 为您的默认事件总线设置权限后,您可以选择使用 describe-event-bus 命令检查权限:

    aws events describe-event-bus

将事件发送到另一个 AWS 账户

要将事件发送到另一个账户,请配置一个 CloudWatch Events 规则,该规则将另一个 AWS 账户的默认事件总线作为目标。该接收账户的默认事件总线也必须配置为从您的账户接收事件。

使用控制台从您的账户向另一个 AWS 账户发送事件

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在导航窗格中,选择 EventsCreate Rule

  3. 对于 Event Source (事件源),选择 Event Pattern (事件模式),然后选择要发送到另一个账户的服务名称和事件类型。

  4. 选择 Add Target

  5. 对于 Target (目标),请选择 Event bus in another AWS account (另一 AWS 账户中的事件总线)。对于 Account ID (账户 ID),请输入要向其发送事件的 AWS 账户的 12 位账户 ID。

  6. 当此发送方账户有权发送事件时,需要一个 IAM 角色,因为接收方账户已为整个组织授予权限。

    • 若要自动创建 IAM 角色,请选择为此特定资源创建新角色

    • 否则,请选择 Use existing role (使用现有角色)。选择已具有足够权限调用该构建的角色。CloudWatch Events 不会为您选择的角色授予额外权限。

  7. 在页面底部,选择配置详细信息

  8. 键入规则的名称和描述,然后选择创建规则

使用 AWS CLI 将事件发送到另一个 AWS 账户

  1. 如果发送方账户由于是接收方账户已授予权限的 AWS 组织的一部分而有权发送事件,则发送方账户还必须拥有一个角色,该角色具有支持它将事件发送到接收方账户的策略。此步骤介绍了如何创建该角色。

    如果已为发送方账户授予通过其 AWS 账户 ID 而不是通过组织发送事件的权限,则此步骤为可选步骤。您可以跳至步骤 2。

    1. 如果通过组织为发送方账户授予了权限,请创建所需的 IAM 角色。首先,使用以下内容创建名为 assume-role-policy-document.json 的文件:

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. 要创建角色,请输入以下命令:

      $ aws iam create-role \ --profile sender \ --role-name event-delivery-role \ --assume-role-policy-document file://assume-role-policy-document.json
    3. 使用以下内容创建名为 permission-policy.json 的文件:

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "events:PutEvents" ], "Resource": [ "arn:aws:events:us-east-1:${receiver_account_id}:event-bus/default" ] } ] }
    4. 输入以下命令以将此策略附加到角色:

      $ aws iam put-role-policy \ --profile sender \ --role-name event-delivery-role \ --policy-name EventBusDeliveryRolePolicy --policy-document file://permission-policy.json
  2. 使用 put-rule 命令创建一条规则,此规则应与要发送至其他账户的事件类型相匹配。

  3. 将其他账户的默认事件总线作为规则的目标添加。

    如果已为发送方账户授权按其账户 ID 发送事件,则无需指定角色。运行以下命令:

    aws events put-targets --rule NameOfRuleMatchingEventsToSend --targets "Id"="MyId","Arn"="arn:aws:events:region:$ReceiverAccountID:event-bus/default"

    如果已为发送方账户授权按其组织发送事件,请按以下示例所示指定角色:

    aws events put-targets --rule NameOfRuleMatchingEventsToSend --targets "Id"="MyId","Arn"="arn:aws:events:region:$ReceiverAccountID:event-bus/default","RoleArn"="arn:aws:iam:${sender_account_id}:role/event-delivery-role"

编写与来自其他 AWS 账户的事件进行匹配的规则

如果您的账户设置为从其他 AWS 账户接收事件,则可以编写与这些事件进行匹配的规则。将规则的事件模式设置为与您从其他账户接收的事件相匹配。

除非您在规则的事件模式中指定 account,否则您的账户中与您从其他账户收到的事件进行匹配的任何规则 (包括新规则和现有规则) 都将基于这些事件触发。如果您要从另一个账户接收事件,并且希望仅对从您自己的账户生成的事件模式触发规则,则必须添加 account 并将您自己的账户 ID 指定为规则的事件模式。

如果将您的 AWS 账户设置为接受来自所有 AWS 账户的事件,强烈建议您将 account 添加到您账户的每一个 CloudWatch Events 规则中。这可以防止账户中的规则对来自未知 AWS 账户的事件触发。在规则中指定 account 字段时,可以在该字段中指定多个 AWS 账户的账户 ID。

要使规则触发来自您已授予权限的任何 AWS 账户的匹配事件,请不要在规则的 account 字段中指定 *。这样做不会匹配任何事件,因为 * 从不显示在事件的 account 字段中。相反,只需忽略规则的 account 字段即可。

使用控制台编写与来自另一个账户的事件进行匹配的规则

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在导航窗格中,选择 EventsCreate Rule

  3. 对于 Event Source,选择 Event Pattern,然后选择规则应匹配的服务名称和事件类型。

  4. 选择 Event Pattern Preview 旁的 Edit

  5. 在编辑窗口中,添加一个 Account 行,指定发送此事件的 AWS 账户应与规则匹配。例如,编辑窗口最初显示以下内容:

    { "source": [ "aws.ec2" ], "detail-type": [ "EBS Volume Notification" ] }

    添加以下内容以使规则与 AWS 账户 123456789012 和 111122223333 发送的 EBS 卷通知匹配:

    { "account": [ "123456789012","111122223333" ], "source": [ "aws.ec2" ], "detail-type": [ "EBS Volume Notification" ] }
  6. 编辑事件模式后,选择 Save

  7. 像往常一样完成规则的创建,在您的账户中设置一个或多个目标。

使用 AWS CLI 编写与来自另一个 AWS 账户的事件进行匹配的规则

  • 使用 put-rule 命令。在规则事件模式的 Account 字段中,指定规则要匹配的其他 AWS 账户。以下示例规则与 AWS 账户 123456789012 和 111122223333 中的 Amazon EC2 实例状态更改进行匹配:

    aws events put-rule --name "EC2InstanceStateChanges" --event-pattern "{\"account\":["123456789012", "111122223333"],\"source\":[\"aws.ec2\"],\"detail-type\":[\"EC2 Instance State-change Notification\"]}" --role-arn "arn:aws:iam::123456789012:role/MyRoleForThisRule"