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

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

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

作成者: Sam Wilson (AWS) と Robert Stone (AWS)

概要

大規模な分散システムでは、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。

アーキテクチャ

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

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

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

ワークフローには以下のステップが含まれます。

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

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

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

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

自動化とスケール

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

ツール

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

エピック

タスク説明必要なスキル

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

「新しい設定と認証情報の設定」を確認し、環境に最も適した認証と認証情報の方法を使用します。

重要

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

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

アプリ開発者

両方をブートストラップします 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 ‒ デプロイに関係するアカウントの Organizations ID

  • event_bus_nameCrossAccount、または名前を変更できます

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

アプリ開発者

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

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

cdk deploy ProducerStack --profile sourceAccount

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

アプリ開発者

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

リソースを確認するには、以下を実行します。

  1. ソースアカウントの AWS Management Console で、CloudFormation を選択します。

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

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

アプリ開発者
タスク説明必要なスキル

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

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

cdk deploy ConsumerStack --profile destinationAccount

プロンプトが表示されたら、 を介して作成された新しい IAM ロールとその他のセキュリティ関連のアクセス許可を受け入れます AWS 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. 実行関数: 成功したメッセージが、テストイベントセクションの上にある緑色のバナーに表示されることを確認します。

アプリ開発者

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

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

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

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

  4. Monitor セクションで、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. 指定された Organizations ID が正しいことを確認します。

  2. ソースアカウントが提供された組織の一部であることを確認します。

  3. ソースアカウントのイベントバスルールが、送信先アカウントの正しい情報にマッピングされていることを確認します。

コンソールから Lambda 関数を呼び出すと、次のエラーが返されます。

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

AWS アカウント 管理者に連絡して、ProducerStack-ProducerLambdaXXXXLambda 関数に対する適切なlambda:Invokeアクション権限を受け取ります。

関連リソース

リファレンス

チュートリアルと動画

追加情報

プロデューサールール

ソースアカウントでは、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は、 で使用される論理 ID です AWS CloudFormation。ターゲットイベントバスは、ターゲットルールの作成時に実際に存在する必要はありません。

送信先アカウント固有の考慮事項

送信先アカウントでは、ソースアカウントのイベントバスからメッセージを受信する 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、同じ組織内の他のアカウントがこのイベントバスにイベントを発行できるようになります。を組織 ID aws:PrincipalOrgIdとして設定すると、必要なアクセス許可が付与されます。

イベントパターン

含まれているイベントパターンは、ユースケースに合わせて変更できます。

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 ルールがデフォルトのクォータです。これは必要に応じて拡張できますが、ほとんどのユースケースに合わせる必要があります。

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