ArcESBでEvent Webhookデータを受信する

SendGridサポートエンジニアの佐藤(@awwa500)です。今回は、ArcESBというノーコードで各種サービス間連携を実現できるアプリケーションを利用してEvent Webhookのデータを受信する方法をご紹介します。受信したデータは、Amazon S3上に保存し、Amazon Athenaで検索できるようにします。

Event Webhookとは

Event WebhookはSendGridから送信したメールに関連するさまざまな情報(イベントデータ)をHTTPで送信する仕組みです。イベントデータを保存・分析することで、メールの配送状況をトラッキングしたり、開封率やクリック率などを計算したりすることができます。Event Webhookはイベントデータを活用するために欠かせない機能ですが、受信アプリケーションを実装するのは手間がかかります。そこで、ArcESBのようなWebhookを受信できるアプリケーションを利用して、ノーコードで簡単に受信環境を構築します。

前提条件

本記事の前提条件は以下のとおりです。

システム構成

今回作成するシステムの構成は次のとおりです。S3に保存したデータから自動的にスキーマを更新するためにAWS Glueを利用します。

システム構成

設定

Amazon S3

まずはじめに、データの保存先となるS3にバケットを作成します。バケット名は任意で、特別な設定は不要です。

Amazon S3

ArcESB

続いて、ArcESBの設定を行います。設定は管理画面にログインして行います。

ArcESB

Webhookコネクタ

画面左のConnectors一覧からWebhookを探し出して、ワークスペース(画面右側の広い領域)上にコネクタをドラッグ&ドロップします。

Webhookコネクタ

Connector IDの入力を求められるので、適当な文字列を入力します。今回は「Webhook」としました。

Connector IDの入力

Request Formatで「JSON」を選択して、Sample RequestSendGridのドキュメントに掲載されているイベントデータ例(JSON配列)を貼り付けます。その後、画面右上のSave Changesを選択して、設定を保存します。

設定を保存

続いて、WebhookコネクタでBasic認証を行うため、Usersタブ内の+Addボタンを選択します。

+Addボタンを選択

User名を入力して、PrivilegesPOSTのチェックボックスをONにしたら、Save Changesボタンを選択して保存します。ここではUser名を「testuser」としています。

User名「testuser」

ユーザが1件作成されていることを確認します。ここに表示されているUserAuthtokenを後述するSendGridのEvent Webhook設定で利用します。

ユーザが作成されている

次に、Webhookコネクタにアクセスできるホストの設定を行うために、Serverタブで、+Addボタンを選択します。

Serverタブで、+Addボタンを選択

Event Webhookの送信元IPアドレスは固定されないため、IP Addressにはアスタリスク(*)を入力します。これで、任意のホストからのリクエストを受け付けるようになります。Save Changesボタンを選択して保存します。

Save Changesボタンを選択

アスタリスク(*)のレコードが1件表示されていることを確認したら画面右上のSave Changesを選択して設定を保存します。

Save Changesを選択し設定を保存

最後に、Settingsタブで、Webhook Endpointを確認します。先ほど作成したBasic認証の認証情報と合わせて、SendGridのEvent Webhookに設定します(後述します)。

Webhook Endpointを確認

Scriptコネクタ

続いて、Webhookコネクタで受信したデータを変換するため、Scriptコネクタを配置します。

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 KeySecret KeyRegionに、S3バケットへのPutObject権限を持つ認証情報を登録して、Save Changesを選択します。認証情報はAWSのIAMにて事前に作成しておきます。

S3コネクタ

コネクタの接続

最後に、配置した3つのコネクタを、WebhookScriptS3となるよう接続します。接続したら、画面右端に表示されている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」を選択します。

Event Webhook

S3への保存動作確認

HTTP Post URLを登録したら、設定が正しいか動作確認するため、Test Your Integrationボタンを選択します。

Test Your Integration

正しく設定されていれば、S3にオブジェクトがアップロードされているのが確認できます。

アップロードの確認

期待通りアップロードされない場合、ArcESBの各コネクタのInputおよびOutputを確認して、どこまでデータが伝達されているか確認してください。エラーが起きている場合ログを確認して原因を調査します。

S3にオブジェクトがアップロード

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コネクタ周りで効率的なスクリプトの書き方についてサポートいただきました。この場を借りてお礼申し上げます。

メールを成功の原動力に

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