🦧

クロスアカウントでEventbridge BusへLambdaでイベント発行する

2025/02/24に公開

前提

  • AWSアカウントが2つあること

出来ること

  • AアカウントからBアカウントへのイベントをLambdaで発行し、イベント内容をCLoudwatchlogsで表示

構成図

Bアカウント側(イベント受け取り)の設定

EventBridge

  1. EventBridge Busの作成
     デフォルトのBusでも良いが、今回はカスタムイベントバスを作成
     
  2. リソースベースのポリシーの編集
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::XXXXXXXXXXXX:root"
    },
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:ap-northeast-1:XXXXXXXXXXXX:event-bus/MyCustomEventBus"
  }]
}

※Principal内のXXXXXXXXXXXXには送信側のアカウントIDを入れる
 Resource内のXXXXXXXXXXXXには受信側のアカウントIDを入れる
4. ルールの作成

  1. 以下の設定をして次へ
  2. イベントパターンを構築で以下を設定
{
  "source": ["put.event"],
  "detail-type": ["PutCloudwatchlogs"]
}

※sourceとdetail-typeは送信側のlambdaの値と一致していればある程度なんでもOK!!
7. ターゲットの選択を以下設定をして他に何もなければそのままルール作成

  1. ルールが作成完了!Bアカウント側の設定以上!

Aアカウント側(イベント送信)の設定

IAMポリシー、ロールの設定

  1. 以下IAMポリシーを作成
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ActionsForResource",
            "Effect": "Allow",
            "Action": [
                "events:PutEvents"
            ],
            "Resource": [
                "BアカウントのカスタムEventBusのarn"
            ]
        }
    ]
}
  1. IAMロール以下Lambda用に設定しIAMポリシーをアタッチして作成

Lambdaの設定

  1. Lambdaで関数の作成

  2. 以下Lambdaの設定をする。ロールは上記で作成したもの

  3. コードソースに以下を設定し、デプロイ

import boto3
import json

def lambda_handler(event, context):
    region = "ap-northeast-1"
    eventbridge = boto3.client('events', region_name=region)
    target_event_bus_arn ="XXXXXXXXXXXX" #BアカウントのカスタムEventBusのarn
    
    try:
        eventbridge.put_events(
            Entries=[
                {
                    'EventBusName': target_event_bus_arn,
                    'Source': 'put.event', # Eventbrigdeで作成したSource
                    'DetailType': 'PutCloudwatchlogs', # Eventbrigdeで作成したDetailType
                    'Detail': json.dumps({
                        'body': 'このログはAアカウントより送信されております。',
                        'test':'test'
                    }),
                    'Resources': []
                }
            ]
        )

        return {
            "statusCode": 200,
            "body": "success"
        }
    
    except Exception as e:
        return {
            "statusCode": 500,
            "body": json.dumps(str(e))
        }
  1. テストの実行を押す

以下が表示されていればBアカウントのcloudwatchlogsに送られている

Bアカウントで受信確認

  1. Cloudwatchlogsにロググループの確認
    ログストリームができているので押す
  2. Aアカウントで作成したイベントが確認できる

以上

感想

これで別アカウントへのイベント作成が可能になった。
今回はCloudwatchlogsへの書き込みにしたが、EventBridgeのルールを変更すれば、LambdaやSNSなどに送ることが可能である

参考サイト

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/events/client/put_events.html#

Discussion