本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在组织中创建跨账户 Amazon EventBridge 连接
山姆·威尔逊和罗伯特·斯通,亚马逊 Web Services
摘要
大型分布式系统使用亚马逊 EventBridge 在 AWS Organizations 组织中的各个 Amazon Web Services (AWS) 账户之间传达状态变化。但是, EventBridge 通常只能定位同一个端点或消费者 AWS 账户。不同账户中的事件总线除外。该事件总线是一个有效的目标。要在另一个账户中使用来自事件总线的事件,必须将事件从源账户的事件总线推送到目标账户的事件总线。为避免在管理不同应用程序中的关键事件时遇到困难 AWS 账户,请使用此模式中介绍的推荐方法。
这种模式说明了如何实现一个事件驱动的架构 EventBridge ,该架构涉及组织 AWS 账户 中的多个事件 AWS Organizations 。该模式使用 AWS Cloud Development Kit (AWS CDK) 工具包和 AWS CloudFormation.
EventBridge 提供无服务器事件总线,可帮助您接收、过滤、转换、路由和传递事件。作为事件驱动架构的关键组成部分, EventBridge 它支持将消息的生成者和消息的使用者分开。在单个账户中,这是直截了当的。多账户结构需要额外的注意事项,才能将一个账户中的事件总线上的事件用于同一组织内的其他账户。
有关生产者和消费者的账户特定注意事项的信息,请参阅 “其他信息” 部分。
先决条件和限制
先决条件
产品版本
此模式是使用以下工具和版本构建和测试的:
AWS CDK 工具包 2.126.0
Node.js 18.19.0
npm 10.2.3
Python 3.12
这种模式应该适用于任何版本的 AWS CDK v2 或 npm。Node.js 版本 13.0.0 到 13.6.0 不兼容。 AWS CDK
架构
目标架构
下图显示了从一个账户推送事件并在另一个账户中使用该事件的架构工作流程。

该工作流程包含以下步骤:
Source 账户中的 Producer AWS Lambda 函数在账户的事件总线上放置一个 EventBridge 事件。
跨账户 EventBridge 规则将事件路由到目标账户中的 EventBridge 事件总线。
目标账户中的 EventBridge 事件总线具有调用使用者 Lambda 函数的目标 Lambda 规则。
最佳做法是使用死信队列 (DLQ) 来处理使用者 L ambda 函数的失败调用。但是,为清楚起见,此解决方案中省略了 DLQ。要详细了解如何在工作流程中实现 DLQ 并提高工作流程从故障中恢复的能力,请参阅实现 AWS Lambda 错误处理模式
自动化和扩缩
AWS CDK 自动配置所需的架构。 EventBridge 可以扩展到每秒数千条记录,具体取决于 AWS 区域. 有关更多信息,请参阅 Amazon EventBridge 配额文档。
工具
AWS 服务
AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置 AWS 云 基础架构。此模式使用 AWS CDK Toolkit,这是一款命令行云开发套件,可帮助您与 AWS CDK 应用程序进行交互。
Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如, AWS Lambda 函数、使用 API 目的地的 HTTP 调用端点或其他 AWS 账户目的地的事件总线。
AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
AWS Organizations是一项账户管理服务,可帮助您将多个账户整合 AWS 账户 到一个由您创建和集中管理的组织中。
其他工具
代码存储库
此模式的代码可在 GitHub cross-account-eventbridge-in-
最佳实践
有关使用时的最佳实践 EventBridge,请参阅以下资源:
操作说明
Task | 描述 | 所需技能 |
---|---|---|
为源账户和目标账户配置本地凭证。 | 查看设置新配置和凭据,并使用对您的环境最有意义的身份验证和凭据方法。 重要请务必同时 AWS CLI 为源帐户和目标帐户身份验证进行配置。 这些说明假设您在本地配置了两个 AWS 配置文件: | 应用程序开发人员 |
两者都 AWS 账户启动。 | 要引导账户,请运行以下命令:
| 应用程序开发人员 |
克隆模式代码。 | 要克隆存储库,请运行以下命令:
然后,将目录更改为新克隆的项目文件夹:
| 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|---|---|
| 在项目的根文件夹中,对以下内容进行以下更改
| 应用程序开发人员 |
部署 ProducerStack 资源。 | 从项目的根目录运行以下命令:
出现提示时,接受通过 AWS CloudFormation创建的新 IAM 角色和其他与安全相关的权限。 | 应用程序开发人员 |
验证 ProducerStack 资源是否已部署。 | 要验证资源,请执行以下操作:
| 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|---|---|
部署 ConsumerStack 资源。 | 从项目的根目录运行以下命令:
出现提示时,接受通过 AWS CloudFormation创建的新 IAM 角色和其他与安全相关的权限。 | 应用程序开发人员 |
验证 ConsumerStack 资源是否已部署 |
| 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|---|---|
调用 Producer Lambda 函数。 |
| 应用程序开发人员 |
验证是否已收到该事件。 |
| 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|---|---|
摧毁 ConsumerStack 资源。 | 如果您使用此模式作为测试,请清理已部署的资源以避免产生额外成本。 从项目的根目录运行以下命令:
系统将提示您确认删除堆栈。 | 应用程序开发人员 |
摧毁 ProducerStack 资源。 | 从项目的根目录运行以下命令:
系统将提示您确认删除堆栈。 | 应用程序开发人员 |
故障排除
事务 | 解决方案 |
---|---|
目标账户中未收到任何事件。 |
|
从控制台调用 Lambda 函数会返回以下错误::
| 请联系您的 AWS 账户 管理员以获取对 |
相关资源
参考
教程和视频
其他信息
制作人规则
在 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" } ] } ]
对于每条消耗的事件总线,必须包括事件模式和目标事件总线。
事件模式
事件模式筛选此规则将应用于哪些事件。在本示例中,事件源和记录detail_types
标识了哪些事件要从源账户的事件总线传输到目标账户的事件总线。
目标事件总线
此规则针对另一个账户中存在的事件总线。需要完整的arn
(Amazon 资源名称)来唯一标识目标事件总线,并且id
是使用的逻辑 ID AWS CloudFormation。在创建目标规则时,目标事件总线不必实际存在。
目标账户特定的注意事项
在目标账户中,创建了一个 EventBridge 事件总线,用于接收来自源账户的事件总线的消息。要允许从来源账户发布事件,您必须创建基于资源的策略:
{ "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 配额
请记住以下配额:
每个事件总线 300 个规则是默认配额。如有必要,可以对其进行扩展,但它应该适合大多数用例。
每条规则允许的最大目标为五个。我们建议应用程序架构师为每个目标账户使用不同的规则,以支持对事件模式的精细控制。