【アップデート】EventBridgeのターゲットにHTTPのエンドポイントが指定可能になったので、EventBridgeから直接SlackのAPIを叩いてみた

マイクロサービスアーキテクチャに便利な熱いアップデートです
2021.03.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部@大阪の岩田です。本日のアップデートによりEventBridgeがAPI Destinations(APIの送信先)をサポートし、イベントルールのターゲットにHTTPのエンドポイントが指定可能になりました。

早速試してみたので、簡単に内容をご紹介します。

アップデート内容

これまでもEventBridgeのターゲットにAPI Gatewayを指定することは可能でしたが、今回のアップデートによりサードパーティのSaaS製品や、ALB&EC2で独自開発したAPIとEvent Bridgeを簡単に連携できるようになりました。API Destinationsは以下のような機能をサポートしています。

3つの認証タイプをサポート

HTTPエンドポイント接続時の認証タイプとして

  • ベーシック認証
  • OAuthのClient Credentials
  • APIキー

をサポートしています。

ペイロードの変換

Input Transformerを利用してEventBridgeが受け取ったイベントデータを連携先サービスの仕様に合わせた形に自動変換可能です。

レートリミットの調整

一般的にAPIにはレートリミットが設定されており、レートリミット以上にAPIを呼び出した場合はエラーが返却されることになります。EventBridgeでAPI Destinationsを定義する際に呼び出しレートの制限が指定できるようになっており、連携先エンドポイントのレートリミットに抵触しないように、呼び出し速度を自動調節可能です。

やってみる

早速実際に試してみたいと思います。今回はEventBridgeのターゲットにSlack APIのエンドポイントを指定し、EC2関連のイベントをSlackにそのまま通知する構成を組んでみます。

Slackアプリの作成

まずはテスト用のSlackアプリを作成します。作成したアプリのBot Token Scopeschat:writeを設定し、Bot User OAuth Tokenを控えます。

アプリが作成できたら適当なチャンネルにアプリをインストールしておきましょう。

Event Bridgeの設定

続いてEvent Bridge側を設定していきます。今回はデフォルトのイベントバスをそのまま利用します。「検出を開始する」をクリックしてスキーマの検出を開始します。

続いてルールを作成します。今回はEC2の全てのイベントを拾うように設定しました。

続いてターゲットの指定です。API 送信先を指定し、新しい API 送信先を作成に必要事項を入力します。

API 送信先エンドポイントにhttps://slack.com/api/chat.postMessageを、HTTP メソッドにはPOSTを指定します。続いて接続の作成です。

認証タイプにAPIキーを選択し、AuthorizationヘッダーにBearer <Slackアプリ作成時に確認したボットユーザーのOAuthトークン>と設定します。入力の設定には入力トランスフォーマーを指定します。ここでSlackのAPI仕様に合わせてペイロードを変換してやります。

SlackのAPIからメッセージを投稿するには、最低限チャンネルIDとメッセージを指定する必要があります。最低限のペイロードは以下のようなイメージです。

{
  "channel":"チャンネルID",
  "text":"投稿するメッセージ"
}

イベントデータを上記の形式に合わせるためInput Transformerを使用します。入力パスは

{"detail":"$.detail"}

を設定し入力テンプレートには

{
  "channel":"アプリから投稿するチャンネルのID",
  "text":<detail>
}

を設定します。

この特定のリソースに対して新しいロールを作成するを選択して、そのままルールを作成します。これで準備完了です。

EC2インスタンスを開始/停止してみる

準備ができたので、適当なEC2インスタンスを開始/停止してみます。すると

無事Slackに通知が飛んできました!!

まとめ

マイクロサービス間の連携が容易になる非常に熱いアップデートだと思います。従来はEventBridgeからLambdaを介して外部APIと連携していたようなケースでは、今回のアップデートを活用することでLambdaを廃止できる可能性も高そうです。ぜひEventBrdge ✕ API Destinationsの利用を検討して下さい。