Amazon EventBridgeで同一アカウント&同一リージョン内でのイベント連携を試してみた

2021.06.02

こんにちは、杉金です。

先月のアップデートでAmazon EventBridgeが同一アカウント&同一リージョンのイベント連携に対応しました。実際に触ってみて理解を深めてみたいと思います。

これまでのアップデートの流れ

EventBridgeにおける、イベント連携アップデートの流れとしては次のような形です。

  • 複数AWSアカウント間のイベント連携ができる!
    ↓アップデート
  • 同一アカウントでリージョン間のイベント連携ができるように!
    ↓今回のアップデート
  • 同一アカウント&同一リージョン内でのイベント連携ができるように!

アップデートの流れが一般的なサービスとは逆のように見えるのがこのサービスの面白いところです。根幹となるサービスコンセプトがあって、枝葉のようにできることが増えていってるような感じですね。今回のアップデートの一例をイメージ図で表すと以下になります。

Before(これまで)

After(こんな形にできます)

これまではAWSリージョン間でイベント連携させる場合、連携先のイベントバスは連携元のイベントバスに個別にサブスクライブする必要がありました。今回のアップデートにより、リージョン間のイベントバスを1つに集約させてリージョン内のイベントバス同士で連携させることができます。以前と比べてイベント連携の柔軟性が高まり、より目的や用途に応じたイベントバスが作りやすくなりました。

使いどころなども含めてAWS公式ブログでも紹介されていますので、ぜひご覧ください。  

やってみた  

シンプルにリージョン内に2つイベントバスを作って連携しても単純であまり面白くないです。   そこで今回は複数のイベントバスを作り、ルールで結んでイベントバスによる連携が機能すること、ルールで結ばれてないところはイベント連携が機能しないことを確認します。前回アップデートのリージョン間イベントバス連携のおさらいも兼ねて、東京リージョンでS3バケットが作成されたら、バージニアリージョンからメール通知させてみます。構成としてはこのような形です。

ポイント  

  • AWSのAPIコールイベントを連携させるにはDefaultのイベントバスを使用する必要があります
  • 東京リージョンでS3バケットを作成したらメール通知されることを確認します
  • バージニアリージョンでS3バケットを作成しても通知されないことを確認します
  • my-event-bus4はバケット削除時に通知するよう設定していますが、Defaultイベントバスからルールで結ばれていないため、削除イベントが発生してもメール通知されないことを確認します

(補足)一見すると、バージニアリージョンでバケットを削除したらメール通知されるように見えますが、AWSのAPIコールはDefaultのイベントバスとの連携が必要で、カスタムイベントバス単体で定義しても機能しません。

イベントバス作成

まずバージニアリージョンにイベントバスを作成します。
イベント"パ"ス作成になっていますがフィードバック済みです。いずれ修正されることを願って次に進みます。イベントバスの名前を入力して、リソースベースのポリシーはデフォルト権限で問題ありませんので空欄のまま作成ボタンを押します。  
同様にmy-event-bus3と4も作成します。

イベントルール作成

イベントバス同士の連携やメール通知のアクションを設定するためにイベントルールを作成します。最初にルール#1を作成しますので、東京リージョンのイベントルール設定画面に移動して、defaultのイベントバスを選択した状態でルールを作成します。

ルールには適当な名前をつけます。

イベントパターンにS3を指定します。  
イベントタイプを設定します。ルール#1は「すべてのイベント」にします。他のルール作成もこの部分から任意のイベントを選ぶ形です。設定しやすくて助かります。

ターゲットを指定します。ルール#1はリージョン間のイベントバス連携ですので、タイプを「別のアカウントまたはリージョンのイベントバス」にします。連携先となるイベントバスのarnを貼り付けます。下のIAMロール作成は新規作成のものを使用します。     

ルール#1を作成したら、バージニアリージョンに切り替えてルール#2を作成します。イベントタイプのところで、バケットレベルの操作すべてを選びます。

ターゲットの選択で、ようやく今回のアップデート機能であるリージョン内連携を指定します。「Event bus in the same account and Region」を選び、ターゲットとしてmy-event-bus3を選択します。

次はルール#3のメール通知設定を作成します。イベントタイプでは、CreateBucketを選択します。

メール通知としては事前に作成しておいたSNSトピックを指定します。

そのままJSONを通知させても分かりにくいので「入力の設定」を展開して、インプットトランスフォーマーで特定の要素だけ抽出してメール本文となる文章に埋め込みます。   

ルール#3に必要な設定も完了しました。ルール#3作成と同様の手順でバケット削除のパターンを指定してルール#4を作成します。これで準備は整いました。

動作テスト

東京リージョンでバケットを作成してみます。

よっしゃあああ!通知が来たー!

このあと以下も試して想定通りの動きになることを確認しました。

  • 東京リージョンでバケットを削除しても通知されないこと
  • バージニアリージョンでバケット作成/削除しても通知されないこと
  • my-event-bus4をmy-event-bus2やdefaultバスと繋げてバケット削除イベントで通知されること

注意点

便利なイベントバスですが注意点があります。

イベント送信先のリージョンに指定あり

イベント送信できるリージョンには指定があります。(us-east-1, us-west-2, eu-west-1のみイベント送信先にできる) 例えばバージニアリージョン(us-east-1)から東京リージョン(ap-northeast-1)にputeventできません。ルール作成の画面でエラーになります。
リージョン間を自由にイベント送受信できるわけではないようです。前回のアップデート時点でそのようになっており、今回のアップデートで更新されたかな?と思っていたのですが変わらずでした。AWS公式マニュアルですと以下のドキュメントにリージョン指定についての記載があります。  

https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutTargets.html  

Event bus in a different AWS account or Region.
You can use an event bus in the US East (N. Virginia) us-east-1, US West (Oregon) us-west-2, or Europe (Ireland) eu-west-1 Regions as a target for a rule.

リージョン内のイベントバス連携は1回だけ

公式ブログで次のように案内されています。

同リージョンのバス間でイベントを転送できるのは1回だけです。ソースバスからターゲットバスにイベントをルーティングした場合、ターゲットバスはイベントを別のバスに転送できません。  

こちらも試してみたのですがルール作成時にエラーが発生しないため注意が必要です。  

まとめ

リージョン内のイベントバス連携について動作検証ができました。意識しておくべきポイントはあるものの素晴らしい機能です。
CloudWatch EventsがEventBridgeに統合されて、EventBridgeってなんだろうという認識でしたが、試しに使ってみて今までのCloudWatch Eventsと使い勝手は変わらず、より機能拡張されたものなんだと理解できました。EventBridgeと仲良くなれた気がします。

参考資料