ArcESBでEvent Webhookデータを受信する
- 2020年10月27日
- by 佐藤 航
- Category: 技術ネタ
SendGridサポートエンジニアの佐藤(@awwa500)です。今回は、ArcESBというノーコードで各種サービス間連携を実現できるアプリケーションを利用してEvent Webhookのデータを受信する方法をご紹介します。受信したデータは、Amazon S3上に保存し、Amazon Athenaで検索できるようにします。
Event Webhookとは
Event WebhookはSendGridから送信したメールに関連するさまざまな情報(イベントデータ)をHTTPで送信する仕組みです。イベントデータを保存・分析することで、メールの配送状況をトラッキングしたり、開封率やクリック率などを計算したりすることができます。Event Webhookはイベントデータを活用するために欠かせない機能ですが、受信アプリケーションを実装するのは手間がかかります。そこで、ArcESBのようなWebhookを受信できるアプリケーションを利用して、ノーコードで簡単に受信環境を構築します。
前提条件
本記事の前提条件は以下のとおりです。
- SendGridアカウント
- AWSアカウント
- ArcESBのダウンロードとインストール
- Version: 20.0.7580
システム構成
今回作成するシステムの構成は次のとおりです。S3に保存したデータから自動的にスキーマを更新するためにAWS Glueを利用します。
設定
Amazon S3
まずはじめに、データの保存先となるS3にバケットを作成します。バケット名は任意で、特別な設定は不要です。
ArcESB
続いて、ArcESBの設定を行います。設定は管理画面にログインして行います。
Webhookコネクタ
画面左のConnectors一覧からWebhookを探し出して、ワークスペース(画面右側の広い領域)上にコネクタをドラッグ&ドロップします。
Connector IDの入力を求められるので、適当な文字列を入力します。今回は「Webhook」としました。
Request Formatで「JSON」を選択して、Sample RequestにSendGridのドキュメントに掲載されているイベントデータ例(JSON配列)を貼り付けます。その後、画面右上のSave Changesを選択して、設定を保存します。
続いて、WebhookコネクタでBasic認証を行うため、Usersタブ内の+Addボタンを選択します。
User名を入力して、PrivilegesのPOSTのチェックボックスをONにしたら、Save Changesボタンを選択して保存します。ここではUser名を「testuser」としています。
ユーザが1件作成されていることを確認します。ここに表示されているUserとAuthtokenを後述するSendGridのEvent Webhook設定で利用します。
次に、Webhookコネクタにアクセスできるホストの設定を行うために、Serverタブで、+Addボタンを選択します。
Event Webhookの送信元IPアドレスは固定されないため、IP Addressにはアスタリスク(*)を入力します。これで、任意のホストからのリクエストを受け付けるようになります。Save Changesボタンを選択して保存します。
アスタリスク(*)のレコードが1件表示されていることを確認したら画面右上のSave Changesを選択して設定を保存します。
最後に、Settingsタブで、Webhook Endpointを確認します。先ほど作成したBasic認証の認証情報と合わせて、SendGridのEvent Webhookに設定します(後述します)。
Scriptコネクタ
続いて、Webhookコネクタで受信したデータを変換するため、Scriptコネクタを配置します。
Settingsタブ内のScriptに以下の内容を貼り付けて、画面右上のSave Changesを選択します。このスクリプトは、JSON配列の要素毎にS3オブジェクトとして分割します。これにより、1イベント=1オブジェクトとしてS3上に保存されます。
<!-- NOTE: Do not edit arc:info --> <arc:info title="Custom Script" desc="This script will be executed when a file is processed."> <input name="ConnectorId" desc="The id of this connector." /> <input name="MessageId" desc="The message id." /> <input name="FilePath" desc="The path of the file being processed." /> <input name="FileName" desc="The name of the file being processed." /> <input name="Attachment#" desc="The path of the attachment being processed." /> <input name="Header:*" desc="The message headers of the file being processed." /> <output name="Data" desc="The data that will be written to the file in the Receive folder." /> <output name="FileName" desc="The name of the output file in Receive folder." /> <output name="FilePath" desc="The path of file that will be written to Receive folder." /> <output name="Header:*" desc="The message headers of the file being written." /> </arc:info> <arc:set attr="push.Data" value="" /> <arc:set attr="_input.Count" value="0" /> <arc:call op="fileReadLine?file=[FilePath]" out="out"> <arc:set attr="out.Data" value="[out.data | replace('\[{','{') | replace('},','}') | replace('}\]','}')]"/> <arc:set attr="_input.Count" value="[_input.Count | add()]" /> <arc:set attr="out.FileName" value="[FileName | replace('.json','_')][_input.Count].json" /> <arc:push item="out" /> </arc:call>
S3コネクタ
続いて、Scriptコネクタで変換したデータをAmazon S3に保存するため、S3コネクタを配置します。Bucket Nameに冒頭で作成したS3バケット名を入力し、Amazon Account Settings配下のAccess Key、Secret Key、Regionに、S3バケットへのPutObject権限を持つ認証情報を登録して、Save Changesを選択します。認証情報はAWSのIAMにて事前に作成しておきます。
コネクタの接続
最後に、配置した3つのコネクタを、Webhook→Script→S3となるよう接続します。接続したら、画面右端に表示されているSave Workspaceボタンを選択して設定を保存します。以上で、ArcESBの設定は完了です。
Event Webhook
続いてEvent Webhookの設定を行います。SendGridのダッシュボードにログインして、Settings > Mail Settings > Event Webhookを選択します。Event Webhook Statusを「ENABLED」に変更して、各項目を次のように設定します。
- HTTP Post URL
先ほどArcESBで設定および確認したWebhook URLと認証情報(UserとAuthtoken)を以下の形式になるように登録します。詳しくは、Event WebhookのAPIリファレンスをご覧ください。http://User名:Authtoken@Webhook URL
- Events to be POSTed to your URL
POSTするイベントを選択します。全イベントをPOSTする場合は、「Select all」を選択します。
S3への保存動作確認
HTTP Post URLを登録したら、設定が正しいか動作確認するため、Test Your Integrationボタンを選択します。
正しく設定されていれば、S3にオブジェクトがアップロードされているのが確認できます。
期待通りアップロードされない場合、ArcESBの各コネクタのInputおよびOutputを確認して、どこまでデータが伝達されているか確認してください。エラーが起きている場合ログを確認して原因を調査します。
S3にオブジェクトがアップロードできることを確認したら、Event Webhookの設定画面右下のSaveボタンを選択して設定を保存します。以上でEvent Webhookの設定は完了です。
AWS Glue
S3上に保存されたデータをAmazon Athenaで検索できるようにするため、AWS Glueを利用してスキーマ情報を自動的に作成します。AWS Glueコンソールで、インクルードパスにイベントデータを保存するS3バケットを指定して、クローラを作成します。
クローラを作成したら、手動で実行します。実行が完了したら、追加したテーブルが1となることを確認します。
Amazon Athena
Amazon Athenaのコンソール上でデータベースを選択して、Glueによって作成されたテーブルに対してクエリを実行すると、S3上に保存されたイベントデータが表示されます。
さいごに
ArcESBで受信したイベントデータをS3に保存して、Athenaで検索できました。今回はWebhookのURLはHTTPで設定しましたが、HTTPS化することでセキュアになります。詳しい手順についてはCData Software Japan様のブログ記事をご覧ください。
ArcESBはこの他にも多数のコネクタがあります。ArcESBを利用することで、ノーコードでさまざまなサービスと連携ができますが、スクリプトを利用することで柔軟に拡張することもできます。ぜひお試しください。
本記事はCData Software Japan杉本様(@sugimomoto)のご協力をいただき執筆しました。特に、Scriptコネクタ周りで効率的なスクリプトの書き方についてサポートいただきました。この場を借りてお礼申し上げます。