

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

# 在组织中创建跨账户 Amazon EventBridge 连接
<a name="create-cross-account-amazon-eventbridge-connection-organization"></a>

*Sam Wilson 和 Robert Stone，Amazon Web Services*

## Summary
<a name="create-cross-account-amazon-eventbridge-connection-organization-summary"></a>

大型分布式系统使用亚马逊 EventBridge 在 AWS Organizations 组织中的各个 Amazon Web Services (AWS) 账户之间传达状态变化。但是， EventBridge 通常只能定位同一个端点或消费者 AWS 账户。不同账户中的事件总线除外。该事件总线是一个有效目标。要在另一个账户中使用来自事件总线的事件，必须将事件从源账户的事件总线推送到目标账户的事件总线。为避免在管理不同应用程序中的关键事件时遇到困难 AWS 账户，请使用此模式中推荐的方法。

这种模式说明了如何实现一个事件驱动的架构 EventBridge ，该架构涉及组织 AWS 账户 中的多个事件 AWS Organizations 。该模式使用 AWS Cloud Development Kit (AWS CDK) 工具包和 AWS CloudFormation.

EventBridge 提供无服务器事件总线，可帮助您接收、过滤、转换、路由和传递事件。作为事件驱动架构的关键组成部分， EventBridge 它支持将消息的生成者和消息的使用者分开。在单个账户中，这非常简单。多账户结构则需要额外注意，才能将一个账户中的事件总线上的事件用于同一组织内的其他账户。

有关创建者和使用者的账户特定注意事项的信息，请参阅[其他信息](#create-cross-account-amazon-eventbridge-connection-organization-additional)部分。

## 先决条件和限制
<a name="create-cross-account-amazon-eventbridge-connection-organization-prereqs"></a>

**先决条件**
+ 至少有两个关联的 AWS Organizations 组织 AWS 账户
+ 两者中都有一个 AWS Identity and Access Management (IAM) 角色 AWS 账户 ，允许您使用以下方法在两 AWS 账户 者中配置基础设施 AWS CloudFormation
+ Git [已在本地安装](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ AWS Command Line Interface (AWS CLI) [已在本地安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ AWS CDK [在本地安装并在](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)两者中都已[引导](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-howto) AWS 账户

**产品版本**

此模式已使用以下工具和版本构建和测试：
+ AWS CDK Toolkit 2.126.0
+ Node.js 18.19.0
+ npm 10.2.3
+ Python 3.12

这种模式应该适用于任何版本的 AWS CDK v2 或 npm。13.0.0 至 13.6.0 版本的 Node.js 与 AWS CDK不兼容。

## 架构
<a name="create-cross-account-amazon-eventbridge-connection-organization-architecture"></a>

**目标架构**

下图显示了从一个账户推送事件并在另一个账户中使用该事件的架构工作流。

![\[连接源创建者账户和目标使用者账户的三步流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/34a5f3ae-511d-4636-999f-c73396770117/images/ccc4878a-6281-4a77-a483-4e6f299d7807.png)


工作流包含以下步骤：

1. Source 账户中的 Producer AWS Lambda 函数在账户的事件总线上放置一个 EventBridge 事件。

1. 跨账户 EventBridge 规则将事件路由到目标账户中的 EventBridge 事件总线。

1. 目标账户中的 EventBridge 事件总线具有调用使用者 Lambda 函数的目标 Lambda 规则。

最佳实践是使用[死信队列（DLQ）](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)来处理使用者 Lambda 函数的失败调用。但是，为清楚起见，此解决方案中省略了 DLQ。要详细了解如何在工作流程中实现 DLQ 并提高工作流程从故障中恢复的能力，请参阅[实现 AWS Lambda 错误处理模式](https://aws.amazon.com/blogs/compute/implementing-aws-lambda-error-handling-patterns/)博客文章。

**自动化和扩展**

AWS CDK 自动配置所需的架构。 EventBridge 可以扩展到每秒数千条记录，具体取决于 AWS 区域. 有关更多信息，请参阅 [Amazon EventBridge 配额文档](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-quota.html)。

## 工具
<a name="create-cross-account-amazon-eventbridge-connection-organization-tools"></a>

**AWS 服务**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)是一个软件开发框架，可帮助您在代码中定义和配置 AWS 云 基础架构。此模式使用 [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)，这是一款命令行云开发套件，可帮助您与 AWS CDK 应用程序进行交互。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一项无服务器事件总线服务，可帮助您将应用程序与来自各种来源的实时数据连接起来。例如， AWS Lambda 函数、使用 API 目的地的 HTTP 调用端点或其他 AWS 账户目的地的事件总线。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)是一项账户管理服务，可帮助您将多个账户整合 AWS 账户 到一个由您创建和集中管理的组织中。

**其他工具**
+ [Node.js](https://nodejs.org/en/docs/) 是一个事件驱动的 JavaScript 运行时环境，专为构建可扩展的网络应用程序而设计。
+ [npm](https://docs.npmjs.com/about-npm) 是在 Node.js 环境中运行的软件注册表，用于共享或借用软件包以及管理私有软件包的部署。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码存储库**

此模式的代码可在 GitHub [cross-account-eventbridge-in-](https://github.com/aws-samples/aws-cdk-examples/tree/main/python/cross-account-eventbridge-in-organization) organization存储库中找到。

## 最佳实践
<a name="create-cross-account-amazon-eventbridge-connection-organization-best-practices"></a>

有关使用时的最佳实践 EventBridge，请参阅以下资源：
+ [Amazon EventBridge 事件模式的最佳实践](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-patterns-best-practices.html)
+ [在 Amazon 中定义规则时的最佳实践 EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules-best-practices.html)

## 操作说明
<a name="create-cross-account-amazon-eventbridge-connection-organization-epics"></a>

### 准备您的本地 AWS CDK 部署环境
<a name="prepare-your-local-cdk-deployment-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为源账户和目标账户配置本地凭证。 | 查看[设置新配置和凭证](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html#getting-started-quickstart-new)，并使用对您的环境最有意义的身份验证和凭证方法。请务必同时 AWS CLI 为源帐户和目标帐户身份验证进行配置。这些说明假定您已在本地配置了两个 AWS 配置文件：`sourceAccount` 和 `destinationAccount`。 | 应用程序开发人员 | 
| 两者都 AWS 账户引导。 | 要引导账户，请运行以下命令：<pre>cdk bootstrap --profile sourceAccount<br />cdk bootstrap --profile destinationAccount</pre> | 应用程序开发人员 | 
| 克隆模式代码。 | 要克隆存储库，请运行以下命令：<pre>git clone git@github.com:aws-samples/aws-cdk-examples.git</pre>然后，将目录更改为新克隆的项目文件夹：<pre>cd aws-cdk-examples/python/cross-account-eventbridge-in-organization</pre> | 应用程序开发人员 | 

### 部署 ProducerStack 到源账户
<a name="deploy-producerstack-to-the-source-account"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| `cdk.json`使用您的 AWS Organizations 和账户详细信息进行修改。 | 在项目的根文件夹中，对 `cdk.json` 进行以下更改：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 应用程序开发人员 | 
| 部署 ProducerStack 资源。 | 从项目的根目录运行以下命令：<pre>cdk deploy ProducerStack --profile sourceAccount</pre>出现提示时，接受通过 AWS CloudFormation创建的新 IAM 角色和其他与安全相关的权限。 | 应用程序开发人员 | 
| 验证 ProducerStack 资源是否已部署。 | 要验证资源，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 应用程序开发人员 | 

### 部署 ConsumerStack 到目标账户
<a name="deploy-consumerstack-to-the-destination-account"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 ConsumerStack 资源。 | 从项目的根目录运行以下命令：<pre>cdk deploy ConsumerStack --profile destinationAccount</pre>出现提示时，接受通过 CloudFormation创建的新 IAM 角色和其他与安全相关的权限。 | 应用程序开发人员 | 
| 验证 ConsumerStack 资源是否已部署 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 应用程序开发人员 | 

### 创建和使用事件
<a name="produce-and-consume-events"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 调用创建者 Lambda 函数。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 应用程序开发人员 | 
| 验证事件是否已接收。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 应用程序开发人员 | 

### 清理
<a name="cleanup"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 摧毁 ConsumerStack 资源。 | 如果您使用此模式作为测试，请清理已部署的资源，进而避免产生额外成本。从项目的根目录运行以下命令：<pre>cdk destroy ConsumerStack --profile destinationAccount</pre>系统将提示您确认删除堆栈。 | 应用程序开发人员 | 
| 摧毁 ProducerStack 资源。 | 从项目的根目录运行以下命令：<pre>cdk destroy ProducerStack --profile sourceAccount</pre>系统将提示您确认删除堆栈。 | 应用程序开发人员 | 

## 问题排查
<a name="create-cross-account-amazon-eventbridge-connection-organization-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 目标账户中未收到任何事件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 
| 从控制台调用 Lambda 函数会返回以下错误：`User: arn:aws:iam::123456789012:user/XXXXX is not authorized to perform: lambda:Invoke` | 请联系您的 AWS 账户 管理员以获取对 `ProducerStack-ProducerLambdaXXXX` Lambda 函数的相应`lambda:Invoke`操作权限。 | 

## 相关资源
<a name="create-cross-account-amazon-eventbridge-connection-organization-resources"></a>

**参考**
+ [AWS Organizations 用户指南](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)
+ [亚马逊 EventBridge 事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)
+ [Amazon 中的规则 EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html)

**教程和视频**
+ [教程：创建和配置组织](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tutorials_basic.html)
+ [AWS re: Invent 2023-亚马逊的高级事件驱动模式 (01-R) EventBridge COM3](https://www.youtube.com/watch?v=6X4lSPkn4ps)

## 附加信息
<a name="create-cross-account-amazon-eventbridge-connection-organization-additional"></a>

**创建者规则**

在 Source 账户中，创建了一个 EventBridge 事件总线来接受来自生产者的消息（如*架构*部分所示）。在此事件总线上创建了附带 IAM 权限的规则。这些规则基于以下`cdk.json`结构将目标账户中的 EventBridge 事件总线作为目标：

```
"rules": [
  {
    "id": "CrossAccount",
    "sources": ["Producer"],
    "detail_types": ["TestType"],
    "targets": [
      {
        "id": "ConsumerEventBus",
        "arn": "arn:aws:events:us-east-2:012345678901:event-bus/CrossAccount"
      }
    ]
  }
]
```

对于每条使用的事件总线，必须包括事件模式和目标事件总线。

*事件模式*

[事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)会筛选出此规则适用的事件。在本示例中，事件源和记录 `detail_types` 标识了哪些事件要从源账户的事件总线传输到目标账户的事件总线。

*目标事件总线*

此规则针对另一个账户中存在的事件总线。需要完整的 `arn`（Amazon 资源名称）来唯一标识目标事件总线，并且 `id` 是 AWS CloudFormation使用的[逻辑 ID](https://docs.aws.amazon.com/cdk/v2/guide/identifiers.html#identifiers_logical_ids)。在创建目标规则时，不必实际存在目标事件总线。

**目标账户特定的注意事项**

在目标账户中，创建了一个 EventBridge 事件总线，用于接收来自源账户的事件总线的消息。要允许从来源账户发布事件，您必须创建[基于资源的策略](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-use-resource-based.html)：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [{
    "Sid": "AllowOrgToPutEvents",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:us-east-2:012345678901:event-bus/CrossAccount",
    "Condition": {
      "StringEquals": {
        "aws:PrincipalOrgID": "o-XXXXXXXXX"
      }
    }
  }]
}
```

授予 `events:PutEvents` 权限尤为重要，该权限允许同一组织中的任何其他账户将事件发布到此事件总线。将 `aws:PrincipalOrgId` 设置为组织 ID 可授予所需的权限。

**事件模式**

您可以修改所包含的事件模式，以满足您的使用案例：

```
rule = events.Rule(
    self,
    self.id + 'Rule' + rule_definition['id'],
    event_bus=event_bus,
    event_pattern=events.EventPattern(
        source=rule_definition['sources'],
        detail_type=rule_definition['detail_types'],
    )
)
```

为了减少不必要的处理，事件模式应指定只有目标账户要处理的事件才会传输到目标账户的事件总线。

*基于资源的政策*

此示例使用组织 ID 来控制允许哪些账户在目标账户的事件总线上放置事件。考虑使用限制性更强的策略，例如指定源账户。

*EventBridge 配额*

记住以下[配额](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-quota.html)：
+ 每个事件总线 300 条规则是默认配额。如有必要，可以对其进行扩展，但它应该适用于大多数使用案例。
+ 每条规则允许的最大目标为五个。我们建议应用程序架构师为每个目标账户使用不同的规则，以支持对事件模式的精细控制。