こんにちは、初投稿!SRE部のcw-furuyaです。
10/07(金)Chatworkが主催するオンラインカンファレンス『Chatwork Product Day 2022』が実施されます。
それに合わせ弊社社員がほぼ毎日ブログを投稿している、ということでChatwork x AWSなネタをひとつ。
AWSのAmazon EventBridgeというサービス、いろんなイベントをいろんなところに通知できる、夢がひろがりんぐなサービスですよね。そんなEventBridgeのAPI Destinationsという機能を使ってChatworkに通知をしてみた、というお話です。
背景
従来、AWSからChatworkへ何か通知を行いたい場合はLambdaを使うのが鉄板でした。Lambda関数内でChatworkのAPIをコールする形ですね。とはいえできればLambdaも管理したくないですよね。
そこでAmazon EventBridgeのAPI Destinationsです。お好きなAPIに対してEventBridgeからリクエストを送信できる機能です。これを使えばLamdaなしでChatworkにメッセージが送れるのではないか!と思い、やってみました。
用意するもの
やってみた
API Destinationsの作成
諸々準備ができたらEventBridgeの設定をしていきます。 まずはAPI Destinationsの作成から。
API 送信先エンドポイントでメッセージ送信用のエンドポイントを指定します。今回はメッセージの送信なので、
https://api.chatwork.com/v2/rooms/[送信先のルームID]/messages
となります。HTTPメソッドはPOSTで、新しい「接続」も作成しましょう。「接続」とはエンドポイントにリクエストを送る際の認証情報をまとめたものです。ここでは送信先として「その他」、認証タイプはAPIトークンを使うので「APIキー」を選択してトークンを入れます。ヘッダー名は「X-ChatWorkToken」です。ここで設定したトークンは自動的にAWS Secrets Managerに保管されます。
ルールの作成
API Destinationsの設定ができればルールを作成していきます。今回は「特定のS3バケットに格納されたオブジェクトが削除されたら通知を送る」というルールにしてみます。
イベントパターンにて、S3バケットで発生した「Object Deleted」イベントを検知するようにします。
ターゲットでは先程作成したAPI Destinationsを指定します。クエリ文字列パラメータを追加して、「body」に送信したいメッセージを記載します。これでルールを作成します。
S3バケットの設定
EventBridgeにイベントを送るため、S3バケット側で設定変更が必要です。
バケットのプロパティから「このバケット内のすべてのイベントについて Amazon EventBridge に通知を送信する」をオンにします。これで準備OKです。
動作確認
試しに適当なファイルをS3バケットにアップロード、削除します。すると...
Chatworkに通知が届きました。
注意点
送信するデータをより柔軟に変更できる「入力トランスフォーマー」という機能があるのですが、こちらはEventBridgeとChatworkの仕様が噛み合わず利用できません。Chatworkでメッセージを送る(たとえばcurlでPOSTする場合)には
--data body=メッセージ!
のような形式でデータを送ってあげる必要があります。対して入力トランスフォーマーの仕様として、送信するデータはダブルクオーテーションで囲わないといけない、かつそのダブルクオーテーションはエスケープされてそのまま送信される、というようになっているらしく、先のcurlの例でいうと
--data \"body=メッセージ!\"
みたいな感じになってしまい、「bodyが認識できない」とChatwork側で弾かれてしまいます。
まとめ
Amazon EventBridgeとAPI Destinationsを使ってChatworkに通知を送る方法についてお伝えしました。メッセージを細かく制御することは(現状)できないのですが、かんたんな通知であればLambda等作り込むことなく送信することができますので、ご活用いただければと思います。