Napkinを利用してEvent WebhookのデータをSlackに投稿する

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を作成します。

Create your Slack appのボタンからappを作成

App Nameに「Event Webhook」など任意の名前を入力し、プルダウンでworkspaceの選択をしてappを作成(Create App)します。

App Nameに任意の名前を入力、workspaceの選択をしてappを作成(Create App)

Incoming Webhooksのページを開いて有効化します。下の画像の②をOnに切り替えてください。

Incoming Webhooksのページを開いて有効化

次に、投稿先のチャンネルを選びましょう。

投稿先のチャンネルを選択

Slackへの通知に必要なWebhook URLを取得できます。このURLは次のNapkinの設定で使用します。

Webhook URLを設定

2. Napkinの処理スクリプト作成

次に、SendGridから渡されたデータをSlack用に変換するスクリプトを作成します。
Napkinのダッシュボードで、Create a new functionを選択します。Pythonで記述していくので、今回はBlank Python Functionのテンプレートを選択します。

NapkinのダッシュボードでCreate a new functionを選択、Blank Python Functionのテンプレートを選択

環境変数を設定します。キーに「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の設定で使用します。

画面上部のURLをコピー

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の設定方法について、詳細はこちらをご覧ください。

「Enable endpoint」をONにし、「Post URL」に、2.で取得したNapkinのURLを入力

4. 動作確認

上記の工程で、イベントの発生に応じてEvent WebhookのデータがSlackのURLにPOSTされるようになりました。
実際にSendGridからメールを送信して、イベントがSlackに通知されるかをお試しください。成功していれば、Slackで以下のような通知が届きます。

Slackに通知が届く

検証終了後は、Event Webhookの設定画面から、実際に通知するイベントをお選びください。設定をそのままにすると、Deliveredイベント発生ごとに通知が行われますのでご注意ください。

まとめ

NapkinとEvent Webhook、Slackの3つを連携することで、初心者でも短いコードを書くだけで簡単にイベント通知機能を作成することができました。
利用したい場面に合わせて通知するイベントを変更するなど、ぜひご活用ください。

アーカイブ

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。