View a markdown version of this page

組織でクロスアカウント Amazon EventBridge 接続を作成する - AWS 規範ガイダンス

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

組織でクロスアカウント Amazon EventBridge 接続を作成する

Amazon Web Services、Sam Wilson および Robert Stone

概要

大規模な分散システムでは、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 つのアカウントのイベントバス上のイベントを同じ組織内の他のアカウントで使用するために、さらなる考慮が必要です。

作成者と使用者のアカウント固有の考慮事項については、「追加情報」セクションを参照してください。

前提条件と制限

前提条件

製品バージョン

このパターンは、次のツールとバージョンを使用して構築され、テストされています。

  • 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と互換性がありません。

アーキテクチャ

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

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

送信元のプロデューサーアカウントと送信先のコンシューマーアカウントを接続する 3 ステップのプロセス。

ワークフローの主なステップは、次のとおりです。

  1. ソースアカウントのプロデューサー AWS Lambda 関数は、アカウントの EventBridge イベントバスにイベントを配置します。

  2. クロスアカウント EventBridge ルールは、送信先アカウントの EventBridge イベントバスにイベントをルーティングします。

  3. 送信先アカウントの EventBridge イベントバスには、コンシューマー Lambda 関数を呼び出すターゲット Lambda ルールがあります。

ベストプラクティスは、コンシューマー Lambda 関数の失敗した呼び出しを処理するためにデッドレターキュー (DLQ) を使用することです。しかし、わかりやすくするために DLQ はこのソリューションでは省略されています。ワークフローに DLQ を実装し、ワークフローが障害から回復する機能を向上させる方法の詳細については、AWS Lambda 「エラー処理パターンの実装」ブログ記事を参照してください。

自動化とスケール

AWS CDK は、必要なアーキテクチャを自動的にプロビジョニングします。EventBridge は、 AWS リージョンに応じて 1 秒あたり数千レコードまでスケールできます。詳細は、「Amazon EventBridge quotas」を参照してください。

ツール

AWS のサービス

  • AWS Cloud Development Kit (AWS CDK) は、コードで AWS クラウド インフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。このパターンでは、 AWS CDK アプリケーションの操作に役立つコマンドラインクラウド開発キットである AWS CDK Toolkit を使用します。

  • 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 を使用する際のベストプラクティスは、次のリソースを参照してください。

エピック

タスク説明必要なスキル

ソースアカウントと送信先アカウントのローカル認証情報を設定する。

Setting up new configuration and credentials」を確認し、環境に最も適した認証方法と認証情報を使用します。

重要

ソースアカウント認証と送信先アカウント認証の両方 AWS CLI に を設定してください。

この手順では、sourceAccountdestinationAccount の 2 つの AWS プロファイルをローカルに設定していることを前提としています。

アプリ開発者

両方をブートストラップします 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
アプリデベロッパー
タスク説明必要なスキル

AWS Organizations とアカウントの詳細cdk.jsonを使用して を変更します。

プロジェクトのルートフォルダで、cdk.json に次の変更を加えます。

  • organization_id – デプロイに関与するアカウントの組織 ID

  • event_bus_nameCrossAccount または名前を変更します

  • rules[].targets[].arn ‒ 消費アカウント (送信先アカウント) の AWS アカウント ID

アプリ開発者

ProducerStack リソースをデプロイする。

プロジェクトのルートディレクトリから、次のコマンドを実行します。

cdk deploy ProducerStack --profile sourceAccount

プロンプトが表示されたら、新しい IAM ロールと、 を通じて作成されたその他のセキュリティ関連のアクセス許可を受け入れます AWS CloudFormation。

アプリ開発者

ProducerStack リソースがデプロイされていることを確認する。

リソースを確認するには、次の手順を実行します。

  1. ソースアカウントの AWS マネジメントコンソール で、CloudFormation を選択します。

  2. スタックのリストから、[ProducerStack] を選択します。

  3. [スタックの情報] タブで、スタックのステータスが CREATE_COMPLETE であることを確認します。必要に応じて、[リソース] タブで、設定されたリソースを確認します。

アプリデベロッパー
タスク説明必要なスキル

ConsumerStack リソースをデプロイする。

プロジェクトのルートディレクトリから、次のコマンドを実行します。

cdk deploy ConsumerStack --profile destinationAccount

プロンプトが表示されたら、新しい IAM ロールと、 を通じて作成されたその他のセキュリティ関連のアクセス許可を受け入れます CloudFormation。

アプリ開発者

ConsumerStack リソースがデプロイされていることを確認する。

  1. 送信先アカウントのコンソールで、[CloudFormation] を選択します。

  2. スタックのリストから、[ConsumerStack] を選択します。

  3. [スタックの情報] タブで、スタックのステータスが CREATE_COMPLETE であることを確認します。必要に応じて、[リソース] タブで、設定されたリソースを確認します。

アプリデベロッパー
タスク説明必要なスキル

プロデューサー Lambda 関数を呼び出す。

  1. ソースアカウントのコンソールで、[Lambda] を選択します。

  2. 関数のリストから、[ProducerStack-ProducerLambdaXXXX] (XXXX は AWS CDK によって自動生成される文字の並びを表します) を選択します。

  3. [テスト] タブを選択します。

  4. [テストイベント] セクションで [テスト] を選択します。

    イベント JSON テキストエリアのコンテンツは、ペイロードとして Lambda 関数に提供される任意の有効な JSON にすることができます。この場合、デフォルトで指定された JSON で十分です。

  5. [Executing function: succeeded] のメッセージが、[テストイベント] セクションの上にある緑色のバナーに表示されることを確認します。

アプリデベロッパー

イベントが受信されたことを確認する。

  1. 送信先アカウントのコンソールで、[Lambda] を選択します。

  2. 関数のリストから、[ConsumerStack-ConsumerLambdaXXXX] (XXXX は AWS CDK によって自動生成される文字の並びを表します) を選択します。

  3. [Monitor] (モニタリング) タブを選択します。

  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'}}

アプリデベロッパー
タスク説明必要なスキル

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

Lambda ProducerStack-ProducerLambdaXXXX 関数に対する適切なlambda:Invokeアクション許可を受け取るには、 AWS アカウント 管理者にお問い合わせください。

関連リソース

リファレンス

チュートリアルと動画

追加情報

プロデューサールール

ソースアカウントでは、プロデューサーからのメッセージを受け入れる 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 ルールがデフォルトのクォータです。これは必要に応じて拡張できますが、ほとんどのユースケースに合わせる必要があります。

  • 1 つのルールにつき 5 つのターゲットが最大許容数です。アプリケーションアーキテクトは、イベントパターンをきめ細かく制御できるように、送信先アカウントごとに個別のルールを使用することをお勧めします。