View a markdown version of this page

在组织中创建跨账户 Amazon EventBridge 连接 - AWS 规范指引

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

在组织中创建跨账户 Amazon EventBridge 连接

Sam Wilson 和 Robert Stone,Amazon Web Services

Summary

大型分布式系统使用亚马逊 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 Organizations 组织 AWS 账户

  • 两者中都有一个 AWS Identity and Access Management (IAM) 角色 AWS 账户 ,允许您使用以下方法在两 AWS 账户 者中配置基础设施 AWS CloudFormation

  • Git 已在本地安装

  • AWS Command Line Interface (AWS CLI) 已在本地安装

  • AWS CDK 在本地安装并在两者中都已引导 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不兼容。

架构

目标架构

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

连接源创建者账户和目标使用者账户的三步流程。

工作流包含以下步骤:

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

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

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

最佳实践是使用死信队列(DLQ)来处理使用者 Lambda 函数的失败调用。但是,为清楚起见,此解决方案中省略了 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 账户 到一个由您创建和集中管理的组织中。

其他工具

  • Node.js 是一个事件驱动的 JavaScript 运行时环境,专为构建可扩展的网络应用程序而设计。

  • npm 是在 Node.js 环境中运行的软件注册表,用于共享或借用软件包以及管理私有软件包的部署。

  • Python 是通用的计算机编程语言。

代码存储库

此模式的代码可在 GitHub cross-account-eventbridge-in- organization存储库中找到。

最佳实践

有关使用时的最佳实践 EventBridge,请参阅以下资源:

操作说明

Task说明所需技能

为源账户和目标账户配置本地凭证。

查看设置新配置和凭证,并使用对您的环境最有意义的身份验证和凭证方法。

重要

请务必同时 AWS CLI 为源帐户和目标帐户身份验证进行配置。

这些说明假定您已在本地配置了两个 AWS 配置文件:sourceAccountdestinationAccount

应用程序开发人员

两者都 AWS 账户引导。

要引导账户,请运行以下命令:

cdk bootstrap --profile sourceAccount cdk bootstrap --profile destinationAccount
应用程序开发人员

克隆模式代码。

要克隆存储库,请运行以下命令:

git clone git@github.com:aws-samples/aws-cdk-examples.git

然后,将目录更改为新克隆的项目文件夹:

cd aws-cdk-examples/python/cross-account-eventbridge-in-organization
应用程序开发人员
Task说明所需技能

cdk.json使用您的 AWS Organizations 和账户详细信息进行修改。

在项目的根文件夹中,对 cdk.json 进行以下更改:

  • organization_id ‒ 部署中涉及的账户的组织 ID

  • event_bus_nameCrossAccount,或者您可以将其重命名

  • rules[].targets[].arn− 消费账户(目标账户)的 AWS 账户 ID

应用程序开发人员

部署 ProducerStack 资源。

从项目的根目录运行以下命令:

cdk deploy ProducerStack --profile sourceAccount

出现提示时,接受通过 AWS CloudFormation创建的新 IAM 角色和其他与安全相关的权限。

应用程序开发人员

验证 ProducerStack 资源是否已部署。

要验证资源,请执行以下操作:

  1. 在 “ AWS 管理控制台 源帐户” 上,选择CloudFormation

  2. 从堆栈列表中选择ProducerStack

  3. 堆栈信息选项卡上,验证堆栈状态是否为 CREATE_COMPLETE。或者,在资源选项卡上,查看已配置的资源。

应用程序开发人员
Task说明所需技能

部署 ConsumerStack 资源。

从项目的根目录运行以下命令:

cdk deploy ConsumerStack --profile destinationAccount

出现提示时,接受通过 CloudFormation创建的新 IAM 角色和其他与安全相关的权限。

应用程序开发人员

验证 ConsumerStack 资源是否已部署

  1. 在目标账户的控制台上,选择CloudFormation

  2. 从堆栈列表中选择ConsumerStack

  3. 堆栈信息选项卡上,验证堆栈状态是否为 CREATE_COMPLETE。或者,在资源选项卡上,查看已配置的资源。

应用程序开发人员
Task说明所需技能

调用创建者 Lambda 函数。

  1. 在源账户的控制台上,选择 Lambda

  2. 从函数列表中选择 ProducerStack-ProducerLambda XXXX(XX XX 表示由 AWS CDK 自动生成的字符序列)。

  3. 选择测试选项卡。

  4. 测试事件部分中,选择测试

    事件 JSON 文本区域内容可以是作为有效载荷提供给 Lambda 函数的任何有效 JSON。在这种情况下,默认提供的 JSON 便已足够。

  5. 验证正在执行函数:已成功消息是否显示在测试事件部分上方的绿色横幅中。

应用程序开发人员

验证事件是否已接收。

  1. 在目标账户的控制台上,选择 Lambda

  2. 从函数列表中选择 ConsumerStack-ConsumerLambda XXXX(XX XX 表示由 AWS CDK 自动生成的字符序列)。

  3. 选择监控选项卡。

  4. 在 “监控” 部分,选择 “查看 CloudWatch 日志”。

  5. 在新打开的选项卡中,选择最新日志流的日志流名称。

  6. 验证日志语句是否如下所示:

    [DEBUG]    2024-04-08T19:08:10.091Z    9c16844a-f9de-444d-b621-86afe64d4cc8    Event: {'version':'0', 'id':'0b9faa96-973f-8be2-ecf8-75e4f328b980', 'detail-type':'TestType', 'source':'Producer', 'account':'XXXXXXXXXXXX', 'time':'2024-04-08T19:08:09Z', 'region':'us-east-1', 'resources': [], 'detail': {'key1':'value1', 'key2':'value2', 'key3':'value3'}}

应用程序开发人员
Task说明所需技能

摧毁 ConsumerStack 资源。

如果您使用此模式作为测试,请清理已部署的资源,进而避免产生额外成本。

从项目的根目录运行以下命令:

cdk destroy ConsumerStack --profile destinationAccount

系统将提示您确认删除堆栈。

应用程序开发人员

摧毁 ProducerStack 资源。

从项目的根目录运行以下命令:

cdk destroy ProducerStack --profile sourceAccount

系统将提示您确认删除堆栈。

应用程序开发人员

问题排查

问题解决方案

目标账户中未收到任何事件。

  1. 验证提供的组织 ID 是否正确。

  2. 验证源账户是否是提供的组织的一部分。

  3. 验证源账户中的事件总线规则是否映射到目标账户中的正确信息。

从控制台调用 Lambda 函数会返回以下错误:

User: arn:aws:iam::123456789012:user/XXXXX is not authorized to perform: lambda:Invoke

请联系您的 AWS 账户 管理员以获取对 ProducerStack-ProducerLambdaXXXX Lambda 函数的相应lambda:Invoke操作权限。

相关资源

参考

教程和视频

附加信息

创建者规则

在 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 是 AWS CloudFormation使用的逻辑 ID。在创建目标规则时,不必实际存在目标事件总线。

目标账户特定的注意事项

在目标账户中,创建了一个 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 条规则是默认配额。如有必要,可以对其进行扩展,但它应该适用于大多数使用案例。

  • 每条规则允许的最大目标为五个。我们建议应用程序架构师为每个目标账户使用不同的规则,以支持对事件模式的精细控制。