

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在組織中建立跨帳戶 Amazon EventBridge 連線
<a name="create-cross-account-amazon-eventbridge-connection-organization"></a>

*Sam Wilson 和 Robertstone，Amazon Web Services*

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

大型分散式系統使用 Amazon EventBridge 來傳達 AWS Organizations 組織中各種 Amazon Web Services (AWS) 帳戶之間的狀態變更。不過，EventBridge 通常只能以相同 中的端點或取用者為目標 AWS 帳戶。例外狀況是不同帳戶中的事件匯流排。該事件匯流排是有效的目標。若要使用來自另一個帳戶中事件匯流排的事件，必須將事件從來源帳戶的事件匯流排推送到目的地帳戶的事件匯流排。為了避免在不同應用程式中管理關鍵事件時遇到挑戰 AWS 帳戶，請使用此模式中顯示的建議方法。

此模式說明如何使用涉及 AWS 帳戶 AWS Organizations 組織中多個 的 EventBridge 實作事件驅動型架構。模式使用 AWS Cloud Development Kit (AWS CDK) Toolkit 和 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
+ [本機安裝](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)的 Git
+ AWS Command Line Interface 在[本機安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) (AWS CLI)
+ 在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 工具組 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 AWS CDK.6.0 版與 不相容。

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

**目標架構**

下圖顯示從一個帳戶推送事件並在另一個帳戶中使用事件的架構工作流程。

![\[連接來源生產者帳戶和目的地消費者帳戶的三個步驟程序。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/34a5f3ae-511d-4636-999f-c73396770117/images/ccc4878a-6281-4a77-a483-4e6f299d7807.png)


工作流程包含下列步驟：

1. 來源帳戶中的生產者 AWS Lambda 函數會在帳戶的 EventBridge 事件匯流排上放置事件。

1. 跨帳戶 EventBridge 規則會將事件路由到目的地帳戶中的 EventBridge 事件匯流排。

1. 目的地帳戶中的 EventBridge 事件匯流排具有目標 Lambda 規則，可叫用 Consumer 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-organization](https://github.com/aws-samples/aws-cdk-examples/tree/main/python/cross-account-eventbridge-in-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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定來源帳戶和目的地帳戶的本機登入資料。 | 檢閱[設定新的組態和登入](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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| `cdk.json` 使用 AWS Organizations 和 帳戶詳細資訊修改 。 | 在專案的根資料夾中，對 進行下列變更`cdk.json`：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 
| 部署 ProducerStack 資源。 | 從專案的根目錄執行下列命令：<pre>cdk deploy ProducerStack --profile sourceAccount</pre>出現提示時，請接受透過 建立的新 IAM 角色和其他安全相關許可 AWS CloudFormation。 | 應用程式開發人員 | 
| 確認已部署 ProducerStack 資源。 | 若要驗證資源，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 

### 將 ConsumerStack 部署至目的地帳戶
<a name="deploy-consumerstack-to-the-destination-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 ConsumerStack 資源。 | 從專案的根目錄執行下列命令：<pre>cdk deploy ConsumerStack --profile destinationAccount</pre>出現提示時，請接受透過 建立的新 IAM 角色和其他安全相關許可 CloudFormation。 | 應用程式開發人員 | 
| 確認已部署 ConsumerStack 資源 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 

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


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 叫用 Producer Lambda 函數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 

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


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 銷毀 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_tw/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)
+ [Amazon 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 - 使用 Amazon EventBridge (COM301-R) 的進階事件驅動模式](https://www.youtube.com/watch?v=6X4lSPkn4ps)

## 其他資訊
<a name="create-cross-account-amazon-eventbridge-connection-organization-additional"></a>

**製作者規則**

在來源帳戶中，建立 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 Resource Name) 才能唯一識別目標事件匯流排，而 `id`是 使用的[邏輯 ID](https://docs.aws.amazon.com/cdk/v2/guide/identifiers.html#identifiers_logical_ids) AWS CloudFormation。建立目標規則時，目標事件匯流排實際上不需要存在。

**目的地帳戶特定的考量事項**

在目的地帳戶中，會建立 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 個規則是預設配額。這可以視需要擴展，但應該適合大多數的使用案例。
+ 每個規則允許五個目標。我們建議應用程式架構師為每個目的地帳戶使用不同的規則，以支援對事件模式的精細控制。