Napkinを利用してEvent WebhookのデータをSlackに投稿する
はじめに
初めまして!今年からSendGridチームに配属となりました、稲丸・森と申します。二人ともIT初心者なので、初学者の視点に立った情報発信ができるよう努めて参ります。よろしくお願いします!
皆さんは、メールの開封やバウンスなど、送信状況がどこかに通知されたら便利だと思うことはありませんか?Twilio SendGridのEvent Webhook機能を使えば、これらの通知を受け取ることができます。
SendGridではメールの送信状況を「イベント」として確認でき、さらにEvent Webhookでは自分で用意した環境にイベントデータを転送することができます。
この機能を他のサービスと連携させれば、イベントデータを保存して好きな時に見返すことや、イベント発生時に通知させることも可能になります。
今回は、Event Webhookを使ってイベントデータをSlackに自動投稿する方法をご紹介します。設定が必要な部分にはすべてキャプチャを付け、コードにも細かく説明を記載しているので、プログラミング(今回はPythonを使用)が初めてという方もぜひお試しください!
必要なもの
Napkinとは?
NapkinはFaaS(Function as a Service)の一つです。そのため、アプリケーション開発で通常必要となるサーバを意識する必要がありません(サーバレス)。ブラウザ上でコードを書くだけでWebアプリケーションを動かすこともでき、アプリケーション開発初心者にもおすすめです。
構成
アプリケーションの構成は以下の図のとおりです。
まず、SendGridで発生したイベントデータをEvent Webhookを使ってNapkinにPOSTします。そのデータをNapkinからSlackの指定のチャンネルにPOSTすることで、Slack上でSendGridのイベント情報が見られるようになります。
わざわざNapkinを中継させるのは、SendGridのPOSTデータをSlack投稿用に整形する必要があるためです。Napkin上に用意したスクリプトでSlackに対応した形式に整えています。
アプリケーション作成の手順
ここからは、具体的な手順をご紹介します。
1. イベント投稿先のSlackの準備
最初にSlackのIncoming Webhooks機能を使って、POSTされたデータを指定のチャンネルに投稿する準備をします。手順はこちらの公式ドキュメントに記載されている通りです。
最初にCreate your Slack appのボタンからappを作成します。
App Nameに「Event Webhook」など任意の名前を入力し、プルダウンでworkspaceの選択をしてappを作成(Create App)します。
Incoming Webhooksのページを開いて有効化します。下の画像の②をOnに切り替えてください。
次に、投稿先のチャンネルを選びましょう。
Slackへの通知に必要なWebhook URLを取得できます。このURLは次のNapkinの設定で使用します。
2. Napkinの処理スクリプト作成
次に、SendGridから渡されたデータをSlack用に変換するスクリプトを作成します。
Napkinのダッシュボードで、Create a new functionを選択します。Pythonで記述していくので、今回はBlank Python Functionのテンプレートを選択します。
requestsライブラリをインストールします。このライブラリを使用することで、シンプルなコードでHTTPリクエストを送信できます。
環境変数を設定します。キーに「SLACK_INCOMING_WEBHOOK」、値に先ほどSlackで取得したURLを設定して保存します。これにより、コード上でSLACK_INCOMING_WEBHOOKという文字列を入力するとSlackで取得したURLとして認識されます。
Event WebhookのPOSTデータを受け取り、Slack投稿用の形式(詳しくはこちら)に整形するスクリプトを記述します。コードは以下の通りです。
# イベントがSendGridからPOSTされたら以下の処理が実行される # 必要なライブラリのインポート import os import requests import napkin from json import dumps # Slackへデータを送るために、POST先(Slack)のURLを環境変数から取得 slack_incoming_webhook = os.environ.get("SLACK_INCOMING_WEBHOOK") # 関数mainで行う処理内容を定義 def main(): # POSTされたデータの取得(JSON形式で取得) data_list = napkin.request.get_json() # 複数のイベントがPOSTされた際に、1つのイベントごとに1つのブロックを割り当てるようにしていく slackblock_list = [] for data in data_list: dumped = dumps(data, indent=2) event_name = data["event"] # Slackに投稿する際の見た目を整えて、slackblock_listに追加 slackblock_list.append( {"type": "section", "text": {"type": "mrkdwn", "text": f"*{event_name}*```{dumped}```"} } ) # イベントデータの成形が完了したのでSlackにPOSTに必要なパラメータを定義する headers = {"Content-Type": "application/json"} slack_json = dumps({"blocks": slackblock_list}) # HTTPライブラリのrequestsを使いWebhookのデータをSlackにPOSTする requests.post(slack_incoming_webhook, headers=headers, data=slack_json) return "" # 上記で定義した関数mainの実行 main() # SendGridにステータスコード200を返す。(2xxが返るまで、SendGridは何度もイベントデータをPOSTするため) napkin.response.status_code = 200 # SendGridにHTTPレスポンスボディとして「event received」を返す。 napkin.response.body = "event received" # Napkinのログに「done」を表示 print("done")
※このスクリプトは簡単のため、SlackのAPIがエラーになった場合のハンドリングは行っていません。
Deployをクリックすると、エンドポイント(イベントデータを受け取るURL)が公開されます。これでNapkinの設定は終了です。
最後に、画面上部のURLをコピーしておきます。このURLは次のSendGridの設定で使用します。
3. SendGridの設定
Event Webhookで、NapkinへイベントデータをPOSTする設定をします。
SendGridのダッシュボードを開き、Settings > Mail SettingsのWebhook Settingsにある「Event Webhook」リンクを選択し、「Create new webhook」を選択します。
「Enable endpoint」をONにし、「Post URL」に、2.で取得したNapkinのURLを入力してください。
「Action to be posted」ではPOSTするイベントの種類を選ぶことができます。
すべてのイベントを選択した場合、送信するメールの通数によっては通知の数が多くなりRate Limitに達する恐れがあるため、例えば、BounceやDropを選択してメールの不達を検知する、OpenやClickを選択してメールのエンゲージメント(開封やメール内のURLのクリック)を検知するなど、必要な情報のみに絞ることをお勧めします。
今回は簡単に動作確認を行えるよう、送信メールが宛先サーバに受け付けられた際に発生するDeliveredを選択します。「Save」ボタンを押せば設定は完了です。
正しく設定ができたかを確認するためテストをしてみましょう。Test Integrationボタンを押すと、テスト用のイベントが発行されます。
※テスト用イベントには、選択したイベントだけではなく全てのイベントが含まれます。
※Event Webhookの設定方法について、詳細はこちらをご覧ください。
4. 動作確認
上記の工程で、イベントの発生に応じてEvent WebhookのデータがSlackのURLにPOSTされるようになりました。
実際にSendGridからメールを送信して、イベントがSlackに通知されるかをお試しください。成功していれば、Slackで以下のような通知が届きます。
検証終了後は、Event Webhookの設定画面から、実際に通知するイベントをお選びください。設定をそのままにすると、Deliveredイベント発生ごとに通知が行われますのでご注意ください。
まとめ
NapkinとEvent Webhook、Slackの3つを連携することで、初心者でも短いコードを書くだけで簡単にイベント通知機能を作成することができました。
利用したい場面に合わせて通知するイベントを変更するなど、ぜひご活用ください。