🦧
クロスアカウントでEventbridge BusへLambdaでイベント発行する
前提
- AWSアカウントが2つあること
出来ること
- AアカウントからBアカウントへのイベントをLambdaで発行し、イベント内容をCLoudwatchlogsで表示
構成図
Bアカウント側(イベント受け取り)の設定
EventBridge
- EventBridge Busの作成
デフォルトのBusでも良いが、今回はカスタムイベントバスを作成
- リソースベースのポリシーの編集
{
"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. ルールの作成
- 以下の設定をして次へ
- イベントパターンを構築で以下を設定
{
"source": ["put.event"],
"detail-type": ["PutCloudwatchlogs"]
}
※sourceとdetail-typeは送信側のlambdaの値と一致していればある程度なんでもOK!!
7. ターゲットの選択を以下設定をして他に何もなければそのままルール作成
- ルールが作成完了!Bアカウント側の設定以上!
Aアカウント側(イベント送信)の設定
IAMポリシー、ロールの設定
- 以下IAMポリシーを作成
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ActionsForResource",
"Effect": "Allow",
"Action": [
"events:PutEvents"
],
"Resource": [
"BアカウントのカスタムEventBusのarn"
]
}
]
}
- IAMロール以下Lambda用に設定しIAMポリシーをアタッチして作成
Lambdaの設定
-
Lambdaで関数の作成
-
以下Lambdaの設定をする。ロールは上記で作成したもの
-
コードソースに以下を設定し、デプロイ
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))
}
- テストの実行を押す
以下が表示されていればBアカウントのcloudwatchlogsに送られている
Bアカウントで受信確認
- Cloudwatchlogsにロググループの確認
ログストリームができているので押す
- Aアカウントで作成したイベントが確認できる
以上
感想
これで別アカウントへのイベント作成が可能になった。
今回はCloudwatchlogsへの書き込みにしたが、EventBridgeのルールを変更すれば、LambdaやSNSなどに送ることが可能である
参考サイト
Discussion