この記事では、ArcESB のWebhook コネクタでSalesforce からのコールアウトを受信する方法についてご紹介します。
ArcESB とは
ファイル転送(MFT)と SaaS データ連携をノーコードで実現できるデータ連携ツールです。ファイル・データベース・SaaS API、オンプレミスやクラウドにある様々なデータをノーコードでつなぐ事ができます。
Webhook コネクタとは
Webhook とは SaaS 等のWeb アプリケーションで何か特定のイベントが実行された際、外部サービスへHTTP で通知する仕組みです。現在では、多くのSaaS でWebhook の機能が提供されています。
ArcESB のWebhook コネクタを利用すると、外部からのメッセージを受け付ける受信用URL(エンドポイント)を生成することができます。このArcESB の受信用URL(エンドポイント)に向けて、SaaS からメッセージを通知することでSaaS 起動の連携フローをArcESB で実現することができます。SaaS から通知されるメッセージに含まれるリクエストBODY のJSON/XML データを活用した連携フローもノーコードで作成することができるので、SaaS 側でイベントが発生したタイミングでニアタイムに実行したい連携フローがある場合に効果を発揮します。 なお、メッセージの通知をセキュアに実現する必要があるので、Webhook で送信する機能を提供する多くのSaaS では、通知を受ける側(この記事ではArcESB)に対して、HTTPSでの通信(待ち受け)を求めています。
Webhook コネクトの詳しい使い方についてはヘルプもあわせてご覧ください。
この記事のシナリオ
この記事では「Salesforce のAccount(取引先)へ登録したレコードをJSON でコールアウトするApex トリガを設定して、Account(取引先)レコードが追加されたらArcESB でコールアウトを受信してMySQL へ連携する」シナリオを実現します。
事前準備
Salesforce からコールアウトされたリクエストを受信するためには、Salesforce からHTTPS でアクセスできる必要があります。ArcESB をSalesforce から接続できる環境に構成してください。
ArcESB のインストール、SSL/TLS 構成についてはこちらの記事を参考にしてください。この記事で用意した環境では、8080番ポートでArcESB のHTTPS 接続を構成しています。
もし検証に利用できるドメインや証明書をお持ちでない方は、こちらの記事も参考にしてください。AWS のサービスだけでArcESB やその他のCData 製品をHTTPS 化して公開することができます。
必要な設定と連携フローの作成
シナリオに必要な設定と連携フローを作成していきます。
ArcESB Webhook コネクタの設定
最初にSalesforce からの通知を受け取るためのWebhook コネクタをフローキャンバスに配置します。
コネクタをクリックするとコネクタの詳細を設定・確認することができます。Webhook エンドポイント:
として生成されたURL と、サンプルリクエスト
のリクエスト形式をJSON に変更して、サンプルのJSON を手元に控えておきます。
続いて「ユーザー」タブを開きます。「+追加」ボタンでPOST/PUT 権限を付与したユーザーを作成します。認証トークン:
の値はSalesforce からのコールアウト設定で利用しますので、控えておいてください。「変更を保存」で保存します。
次に「サーバー」タブを開きます。規定では、localhostからのアクセスのみが許可されています。「+追加」をクリックして、IP アドレス:
にSaaS(Salesforce)のIP アドレスを指定します。*
であらゆるIP アドレスからの接続を許可することも可能です。
許可すべきSalesforce のIP アドレス等については以下のページを参考にしてください。
ArcESB のWebhook コネクタでは認証が必要です。今回のSalesforce からのコールアウトでは、認証情報をURL に埋め込んで通知するようにしますので、「サーバー」タブの高度な設定に含まれるURL の認証トークンを許可
を有効にします。これにより、「[Webhook エンドポイント:]として生成されたURL
?@authtoken=[認証トークン]」のようにリクエストパラメータに認証トークンを含んだ形でリクエストすることが可能となります。
Webhook コネクタのテスト(Postman からのテスト)
Salesforce 側の設定に移る前に、WebAPI 開発ツールのPostman を使って、ここまでの設定でArcESB のWebhook コネクタが正しく受信できるように構成されているかを確認してみます。
Postman に以下の通り設定してリクエストを送ります。
- Method : POST
- URL : 認証トークン付きのWebhook URL(
[Webhook エンドポイント:]として生成されたURL
?@authtoken=認証トークン
) - Body : 設定タブ内のサンプルJSON
ArcESB のWebhook コネクタの「アウトプット」タブで送ったJSON データが受信できていれば成功です。
Salesforce 側の設定
今回のシナリオは、シンプルに「標準オブジェクトであるAccount(取引先)にレコードが追加されたタイミングで、追加されたAccount レコードをJSON 形式でコールアウトする」ように設定にしました。
今回、Apex トリガや、実際にコールアウトするApex クラスの作成には、Salesforce Webhook Creator を利用させて貰いました。
「Salesforce Webhook Creator」ではApex トリガをイベントとして外部へコールアウトするために必要となる以下のような設定を生成してくれるので、今回のようなシナリオには便利です。
- リモートサイトの設定
- Apex トリガの作成
Salesforce の設定やApex に関する詳しい情報はSalesforce のヘルプを確認してください。
Webhook の受信確認
それでは、実際にSalesforce のAccount(取引先)にレコードを追加してApex トリガ経由でArcESB が受信できるか確認してみます。
Account(取引先)にレコードを追加します。
ArcESB のWebhook コネクタの「アウトプット」タブでレコードが増えていればWebhoook の受信は成功です。
受信したファイル名をクリックしてSalesforce から通知されたJSON データを確認してみます。
以下のようにAccount(取引先)に登録したデータが格納されていることを確認できます。
{ "new": [ { "attributes": { "type": "Account", "url": "/services/data/v53.0/sobjects/Account/0015h00000VxiXnAAJ" }, "Site": "□□部", ... snip ... "Name": "○○株式会社", "CleanStatus": "Pending", ... snip ... "Id": "0015h00000VxiXnAAJ", "LastModifiedById": "0055h000004Lv1EAAS" } ], "old": [], "userId": "0055h000004Lv1EAAS" }
Webhook で受信したJSON データをMySQL に連携する
あとは、Webhook で受信したJSON データをXML に変換して、MySQL へ連携するフローを作成していきます。
MySQL に連携する(MySQL コネクタ)
ArcESB ではフローの起点と終点の設定から開始するのが簡単です。起点となる Webhook コネクタは設定したので、終点となるMySQL コネクタを設定します。MySQL への接続情報をセットして「接続テスト」で確認します。
MySQL への入力となるので、受信した顧客データを追加する「インプットマッピング」を設定します。今回はシンプルにid
をキーに取引先名と取引先 部門名をそれぞれ会社名と部署名としてUPSERT する設定にしました。
受信したJSON データをXML に変換(JSON コネクタ)
次に、JSON コネクタで、Webhook で受信したJSON データをXML にフォーマット変換をするための設定をします。コネクタの設定は規定のままで、Webhook コネクタからフローをつないでください。
変換結果を確認するために、JSON コネクタの「インプット」タブから「ファイルをアップロード」で先ほどWebhook コネクタで取得したJSON ファイルをアップロードします。
変換結果を「アウトプット」タブからダウンロードします。
JSON コネクタにより、先ほどのJSON データが以下のようなXML に変換されます。
<?xml version="1.0" encoding="utf-8"?> <Items xmlns:json="http://www.arcesb.com/ns/jsonconnector" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <new json:array="true"> <attributes> <type>Account</type> <url>/services/data/v53.0/sobjects/Account/0015h00000VxiXnAAJ</url> </attributes> <Site>□□部</Site> ... snip ... <Name>○○株式会社</Name> ... snip ... <Id>0015h00000VxiXnAAJ</Id> <LastModifiedById>0055h000004Lv1EAAS</LastModifiedById> </new> <userId>0055h000004Lv1EAAS</userId> </Items>
受信したデータをMySQL へマッピングする(XMLMap コネクタ)
最後に「XMLMap」コンポーネントで、Salesforce から受信してJSON から変換したXML ファイルと、MySQL の登録するテーブル情報とのマッピングを作成します。JSON コネクタからXMLMap コネクタ、XMLMap コネクタからMySQL コネクタへとフローをつないでください。つないだらワークスペースを保存してください。これでXMLMap コネクタではMySQL へ連携するフォーマットが認識されます。
XMLMap コネクタを開き、JSON コネクタで変換されるXML フォーマットを読み込ませます。
マッピングエディタに、JSON コネクタで変換されるXML フォーマットがソース
に。MySQL コネクタへ連携するフォーマットが宛先
として表示されます。取引先名・取引先 部門名をマッピングします。
これで「Salesforce のAccount(取引先)へ登録したレコードをJSON でコールアウトするApex トリガを設定して、Account(取引先)レコードが追加されたらArcESB でコールアウトを受信してMySQL へ連携する」ために必要な手順が完了しました。
シナリオの動作を確認する
あらためてSalesforce のAccount(取引先)へレコードを追加してみます。
MySQL コネクタの「インプット」タブでレコードが追加されれば、作成したフローを通してMySQL へデータが届いたことを確認できます。
実際にMySQL のテーブルをMySQL WorkBench などで確認してみてください。Salesforce に追加したAccount レコードのデータが格納されていれば成功です。
さいごに
Salesforce からのコールアウトを受信できるようにするまでの環境設定で少し手間が掛かる部分もありますが、ArcESB でWebhook を受信したり、受信したデータを活用すること自体はとても簡単です。Webhook のような仕組みを利用すると連携の自由度が大きく広がります。是非お試しください。
この記事では ArcESB™ 2021 - 21.0.7964
を利用しています。