

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 組織でクロスアカウント Amazon EventBridge 接続を作成する
<a name="create-cross-account-amazon-eventbridge-connection-organization"></a>

*Amazon Web Services、Sam Wilson および Robert Stone*

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

大規模な分散システムでは、Amazon EventBridge を使用して、 AWS Organizations 組織内のさまざまな Amazon Web Services (AWS) アカウント間で状態の変化を通信します。しかし、EventBridge は通常、同じ AWS アカウント内のエンドポイントまたはコンシューマーのみをターゲットにできます。例外は、別のアカウントのイベントバスです。そのイベントバスは有効なターゲットです。別のアカウントのイベントバスからイベントを使用するには、イベントをソースアカウントのイベントバスから送信先アカウントのイベントバスに反映する必要があります。異なる 内のアプリケーション間で重要なイベントを管理する際の課題を回避するには AWS アカウント、このパターンで示されている推奨アプローチを使用します。

このパターンは、 AWS Organizations 組織 AWS アカウント 内の複数の が関与する EventBridge を使用してイベント駆動型アーキテクチャを実装する方法を示しています。このパターンでは AWS Cloud Development Kit (AWS CDK) Toolkit と を使用します AWS CloudFormation。

EventBridge には、イベントを受信、フィルタリング、変換、ルーティング、配信するのに役立つサーバーレスのイベントバスが用意されています。イベント駆動型アーキテクチャの重要なコンポーネントである EventBridge は、メッセージの作成者とそのメッセージの使用者の分離に対応しています。これは、単一のアカウントでは簡単です。マルチアカウント構成では、1 つのアカウントのイベントバス上のイベントを同じ組織内の他のアカウントで使用するために、さらなる考慮が必要です。

作成者と使用者のアカウント固有の考慮事項については、「[追加情報](#create-cross-account-amazon-eventbridge-connection-organization-additional)」セクションを参照してください。

## 前提条件と制限
<a name="create-cross-account-amazon-eventbridge-connection-organization-prereqs"></a>

**前提条件**
+ 少なくとも 2 つの が関連付けられている AWS Organizations 組織 AWS アカウント
+ を使用して両方の でインフラストラクチャをプロビジョニング AWS アカウント できる の AWS Identity and Access Management (IAM) ロール 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 ツールキット 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と互換性がありません。

## アーキテクチャ
<a name="create-cross-account-amazon-eventbridge-connection-organization-architecture"></a>

**ターゲットアーキテクチャ**

次の図は、あるアカウントからイベントを送信し、別のアカウントで消費するためのアーキテクチャワークフローを示しています。

![\[送信元のプロデューサーアカウントと送信先のコンシューマーアカウントを接続する 3 ステップのプロセス。\]](http://docs.aws.amazon.com/ja_jp/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 関数を呼び出すターゲット Lambda ルールがあります。

ベストプラクティスは、コンシューマー Lambda 関数の失敗した呼び出しを処理するために[デッドレターキュー (DLQ)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) を使用することです。しかし、わかりやすくするために DLQ はこのソリューションでは省略されています。ワークフローに DLQ を実装し、ワークフローが障害から回復する機能を向上させる方法の詳細については、[AWS Lambda 「エラー処理パターンの実装](https://aws.amazon.com/blogs/compute/implementing-aws-lambda-error-handling-patterns/)」ブログ記事を参照してください。

**自動化とスケール**

AWS CDK は、必要なアーキテクチャを自動的にプロビジョニングします。EventBridge は、 AWS リージョンに応じて 1 秒あたり数千レコードまでスケールできます。詳細は、「[Amazon EventBridge quotas](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 アプリケーションの操作に役立つコマンドラインクラウド開発キットである [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) を使用します。
+ [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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ソースアカウントと送信先アカウントのローカル認証情報を設定する。 | 「[Setting up new configuration and credentials](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html#getting-started-quickstart-new)」を確認し、環境に最も適した認証方法と認証情報を使用します。ソースアカウント認証と送信先アカウント認証の両方 AWS CLI に を設定してください。この手順では、`sourceAccount` と `destinationAccount` の 2 つの AWS プロファイルをローカルに設定していることを前提としています。 | アプリ開発者 | 
| 両方をブートストラップします 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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  AWS Organizations とアカウントの詳細`cdk.json`を使用して を変更します。 | プロジェクトのルートフォルダで、`cdk.json` に次の変更を加えます。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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/ja_jp/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | アプリデベロッパー | 

### ConsumerStack を送信先アカウントにデプロイする
<a name="deploy-consumerstack-to-the-destination-account"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ConsumerStack リソースをデプロイする。 | プロジェクトのルートディレクトリから、次のコマンドを実行します。<pre>cdk deploy ConsumerStack --profile destinationAccount</pre>プロンプトが表示されたら、新しい IAM ロールと、 を通じて作成されたその他のセキュリティ関連のアクセス許可を受け入れます CloudFormation。 | アプリ開発者 | 
| ConsumerStack リソースがデプロイされていることを確認する。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | アプリデベロッパー | 

### イベントの生成と消費
<a name="produce-and-consume-events"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| プロデューサー Lambda 関数を呼び出す。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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/ja_jp/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | アプリデベロッパー | 

### クリーンアップ
<a name="cleanup"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 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/ja_jp/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` | Lambda `ProducerStack-ProducerLambdaXXXX` 関数に対する適切な`lambda:Invoke`アクション許可を受け取るには、 AWS アカウント 管理者にお問い合わせください。 | 

## 関連リソース
<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)

**チュートリアルと動画**
+ [Tutorial: Creating and configuration an organization](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 リソースネーム) が必要であり、`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 ルールがデフォルトのクォータです。これは必要に応じて拡張できますが、ほとんどのユースケースに合わせる必要があります。
+ 1 つのルールにつき 5 つのターゲットが最大許容数です。アプリケーションアーキテクトは、イベントパターンをきめ細かく制御できるように、送信先アカウントごとに個別のルールを使用することをお勧めします。