跳至内容

使用 EventBridge 进行跨账户和跨区域活动的逐步指南

3 分钟阅读
内容级别:中级
1

本文重点介绍 EventBridge,并提供了一个分步指南,用于简化跨多个帐户和区域的事件驱动架构的编排。

事件驱动架构 (EDA) 彻底改变了软件系统的构建方式,实现了高效通信、低耦合和可扩展性。然而,跨多个账户和区域管理事件历来复杂且充满挑战。EventBridge 正是解决这一难题的利器。

本文将提供一份循序渐进的指南,介绍 EventBridge 如何简化事件驱动架构的编排,实现跨账户和跨区域的事件路由。

架构设计

该架构涉及三个账户:

  • AccountA(源事件账户):包含一个 Lambda 函数,用于发送事件。
  • AccountGlobal(全局事件总线账户):托管全局事件总线,并将事件转发到目标账户。
  • AccountB(目标事件账户):包含目标工作负载(一个 Lambda 函数)。

在此处输入图片描述

该事件流工作流程包含四个步骤:

  1. 事件发送器 (EventSender) Lambda 函数被触发。
  2. 事件发送器 (EventSender) Lambda 将事件发送至全局事件总线。
  3. 全局事件总线将事件转发至目标事件总线。
  4. 目标事件总线将事件转发至接收器 (Event Receiver) Lambda。

前提条件:通过 AWS 组织服务 (Organizations) 设置多账户

设置账户最简单的设置方式是使用 AWS 组织服务 (Organizations):

  1. 进入 AWS 组织服务 (Organizations),创建一个组织。
  2. 开始添加或邀请 AWS 账户

在此处输入图片描述

  1. 创建 AccountA、AccountBAccountGlobal

在此处输入图片描述

  1. 您也可以选择将账户置于组织单元 (OU) 下,以便更好地管理。
  2. 组织结构应如下所示。

在此处输入图片描述

有关 AWS Organizations 的教程/故障排除(超出本文范围),请参阅以下内容:

最后,请记下相应的 AWS 账户 ID,然后我们开始执行步骤。

分步操作指南

1. 设置全局账户(Global Account)

  • 登录 AccountGlobal
  • 选择 爱尔兰区域 (eu-west-1)。
  • 在 EventBridge 中,创建一个名为 event-bus-global 的自定义事件总线。
  • 关联资源基于策略,将占位符替换为正确的 AWS 账户 ID:

在此处输入图片描述

  • 如果上述操作出现问题,请点击“加载模板”并进行相应修改:

在此处输入图片描述

  • 点击“创建”,自定义总线即创建完成。
  • 请记下事件总线的 Amazon 资源名称 (ARN)。

2. 设置 (Account A) 账户 A(发件人)步骤

  • 登录AccountA

  • 选择 爱尔兰区域 (eu-west-1)。

  • 在 Lambda 中,创建一个名为 eventSender 的 NodeJS 18.x Lambda 函数。

在此处输入图片描述

  • 添加以下代码。该代码利用 AWS SDK EventBridge 客户端库,向全局事件总线发送一个简单的 JSON 有效负载,该有效负载由其 ARN 标识。事件的“Source”和“DetailType”稍后将用于筛选事件并将其转发到相应的目标。
    import { EventBridgeClient, PutEventsCommand } from “@aws-sdk/client-eventbridge”;
    
    export const handler = async(event) => {
     try {
       const eventBridge = new EventBridgeClient({ region: ‘eu-west-1’ });
       const eventParams = {
         Entries: [
           {
             Source: ‘event.sender.source’,
             DetailType: ‘EventA.Sent’,
             Detail: JSON.stringify({ type: ‘a’, value: ‘111’ }),
             EventBusName: ‘arn:aws:events:eu-west-1:<ACCOUNT_GLOBAL_ID>:event-bus/event-bus-global’
           }
         ]
       };
    
       await eventBridge.send(new PutEventsCommand(eventParams));
    
       return {
         statusCode: 200,
         body: ‘Event sent successfully’
       };
     } catch (err) {
        console.error(‘Failed to send event:’, err);
     
        return {
           statusCode: 500,
           body: ‘Failed to send event’
        };
     }
    };
  • 在“配置”->“权限”下,单击 IAM 执行角色,并将以下自定义策略添加到该角色:
{
      “Version”: “2012–10–17”,
      “Statement”: [
        {
          “Effect”: “Allow”,
          “Action”: [“events:PutEvents”],
          “Resource”: [
            “arn:aws:events:eu-west-1:<ACCOUNT_GLOBAL_ID>:event-bus/event-bus-global”
          ]
        }
      ]
    }

3. 设置 (Account B) 账户 B(接收方)

  • 登录AccountB
  • 在 EventBridge 中,创建一个名为 event-bus-account-b 的自定义事件总线,该总线应位于与账户 A 总线和发送方不同的区域,例如斯德哥尔摩 (eu-north-1)。
  • 关联以下基于资源的策略:
 {
     "Version": "2012–10–17",
     "Statement": [{
     "Sid": "allow_account_to_put_events",
     "Effect": "Allow",
     "Principal": {
       "AWS": "arn:aws:iam::<ACCOUNT_GLOBAL_ID>:root"
     },
     "Action": "events:PutEvents",
     "Resource": "arn:aws:events:eu-north-1:<ACCOUNT_B_ID>:event-bus/event-bus-account-b"
     }]
    }
  • 在 Lambda 中,像往常一样创建一个名为 EventReceiver 的 NodeJS 18.x Lambda 函数:
 export const handler = async(event) => {
      console.log(“Event received: “, event);
     
      const response = {
        statusCode: 200,
        body: JSON.stringify(‘Hello from Lambda!’),
      };
     
      return response;
    };

4. 通过规则连接账户

  • 现在需要使用 EventBridge 规则将账户之间的事件关联起来。我们需要两条规则。

4.1 在全局帐户中设置规则

  • AccountGlobal 中,创建一个名为 global-to-account-b 的事件规则,并将其关联到自定义事件总线(而非默认事件总线)。
  • 在向导中,选择创建方法“自定义模式(JSON 编辑器)”,并创建以下事件模式,该模式匹配 AccountA 中 Lambda EventSender 发送的任何源和详细信息类型的事件。
    {
     “source”: [“event.sender.source”],
     “detail-type”: [“EventA.Sent”]
    }

在此处输入图片描述

  • 目标类型是另一个 EventBridge 事件总线 (event-bus-account-b),它位于与全球事件总线 (eu-west-1) 不同的账户和区域 (eu-north-1)。请从 AccountB 中选择事件总线 ARN。

在此处输入图片描述

  • 接下来,创建规则。

4.2 在 AccountB 中设置规则

  • AccountB 中,创建一个名为 account-b-to-target 的事件规则,并将其关联到自定义事件总线(而非默认事件总线)。
  • 填写与上一步相同的事件模式。
  • 这次,目标类型是之前在 AccountB 中创建的名为 EventReceiver 的 Lambda 函数。

在此处输入图片描述

  • 继续操作,直到规则创建完成。

验证

要验证 AccountA (eu-west-1) 中的 EventSender 是否通过全局总线 (eu-west-1) 向 AccountB (eu-north-1) 中的 EventReceiver 发送事件,只需触发 EventSender Lambda 函数即可。

AccountB 中,转到与目标函数 (EventReceiver) 关联的 CloudWatch 日志组,以下日志将证明事件已成功跨账户和区域接收。

在此处输入图片描述

总结

总而言之,本文证明了 EventBridge 的跨账户和跨区域事件功能为管理工作负载和编排事件驱动架构提供了一种简单高效的解决方案。

下一步,请使用 IaC(例如 CDK)实现上述功能,祝您开发愉快!

AWS
支持工程师

已​发布 2 个月前69 查看次数