[アップデート]Amazon EventBridgeで別のアカウントのリソースに直接イベントを配信できるようになりました!
お疲れさまです。とーちです。
Amazon EventBridgeで別のアカウントのリソースに直接イベントを配信できるようになった という個人的に熱いアップデートが発表されていたので紹介します。
AWS公式ブログはこちら
とりあえずまとめ
- EventBridgeでの別アカウントリソースへのイベント送信がシンプルになった
- 今回のアップデートによる別アカウントリソースへのイベント送信は、リソースベースポリシーに対応したリソースのみサポート
何が変わったのか
従来、EventBridgeで別のアカウントのリソースをターゲットにイベントを配信するには以下のような構成をとる必要がありましたが、今回のアップデートにより下図の点線の部分が不要になりました。
とてもシンプルになりましたね。こういった従来の複雑な構成をシンプル化するようなアップデートはとても良いですよね。
別アカウントのSQSキューをターゲットとする設定を例に、手順についても新旧の違いを見てみましょう。従来は以下のような設定をする必要がありました。
- 受信側アカウント:配信ターゲットとなるSQS キューを作成。
- 受信側アカウント:EventBridgeデフォルトイベントバスで送信側AWSアカウントIDを許可する設定
- 送信側アカウント:EventBridgeルールにて受信側アカウントのイベントバスをターゲットとするEventBridgeルールを設定
- EventBridgeルールには受信側イベントバスにメッセージ送信する権限を持つ実行ロールをアタッチする
- 受信側アカウント:受信側アカウントでもEventBridgeルールを作成。ターゲット SQS キュー ARN をルールターゲットとして設定
- ターゲット SQS キューにメッセージを送信する権限を持つ実行ロールをアタッチする
新しい方法では以下のようになります。
- 受信側アカウント:配信ターゲットとなるSQS キューを作成。
- 送信側アカウント:EventBridgeルールにて受信側アカウントのターゲット SQS キュー ARN をルールターゲットとするEventBridgeルールを設定
- ターゲット SQS キューにメッセージを送信する権限を持つ実行ロールをアタッチする
- 受信側アカウント:ターゲット SQS キューにリソースベースポリシーを適用し、送信側EventBridgeルールに付与した実行ロールがイベントを送信できるようにする
図にするとこんな感じでしょうか
注意点
注意点として、上記のようにリソースベースポリシーをサポートするリソースに対してのみクロスアカウントでのイベント配信をサポートしています。
リソースベースポリシーがないリソースについては従来の方法で対応する必要があります。
試してみた
それではさっそく試してみようと思います。
たまたまECRにコンテナイメージがpushされたことをトリガーにイベント起動するEventBridgeルールを作っていたのでこれを変更して、コンテナイメージがpushされたら別アカウントのLambdaを起動してLambdaでpushされたコンテナイメージ情報をログに出すという仕組みを作ってみます。
送信側アカウント作業
EventBridgeルールの設定はこんな感じです。
イベントパターン
{
"detail": {
"action-type": ["PUSH"],
"repository-name": ["example-repo"],
"result": ["SUCCESS"]
},
"detail-type": ["ECR Image Action"],
"source": ["aws.ecr"]
}
ターゲット設定
ターゲットとして別アカウントのLambda関数を指定します。
モザイクが多く分かりづらくて恐縮ですが、関数ARNには別アカウントのLambda関数のARNを指定してます。
EventBridgeルールの実行ロール
IAMロールには以下のようなポリシーが割り当てられています
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-1:<受信側アカウントID>:function:<Lambda関数名>"
]
}
]
}
受信側アカウント作業
受信側アカウントでは以下の作業をします。
- Lambda関数の作成
- Lambda関数のリソースベースポリシーにEventBridgeルールの実行ロールを許可する設定
Lambda関数の作成
Lambda関数のコードはこんな感じで極めてシンプルに受け取ったイベントをログ表示するだけのものです
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info("Function started")
logger.info(f"Event: {event}")
return {
'statusCode': 200,
'body': 'Event logged successfully'
}
Lambda関数のリソースベースポリシーにEventBridgeルールの実行ロールを許可
またマネージメントコンソールのLambdaの画面からリソースベースポリシーの設定をします。
- 設定タブのアクセス権限を開く
- リソースベースのポリシーステートメントの項目で「アクセス権限を追加」のボタンを押す
- 以下のような設定をする
実行してみる
それでは実際にECRにイメージをpushしてみます。適当にnginx:latestのイメージをpushしてみました。
すると別アカウントのLambda関数が想定通り起動し、以下のようにpushされたコンテナイメージの情報がログに表示されました。
まとめ
Amazon EventBridgeで別のアカウントのリソースに直接イベントを配信できるようになった というアップデートの紹介でした。
実際に試してみてとても良いアップデートだなと思ったのでクロスアカウントでイベント送信をしたい場合に検討してみていただければと思います。
以上、とーちでした。