CData Software Blog

クラウド連携のCData Software の技術ブログです。

ArcESB のWebhook コネクタでSalesforce からのコールアウトを受信する

f:id:irokawah:20211123234932p:plain

この記事では、ArcESB のWebhook コネクタでSalesforce からのコールアウトを受信する方法についてご紹介します。

ArcESB とは

ファイル転送(MFT)と SaaS データ連携をノーコードで実現できるデータ連携ツールです。ファイル・データベース・SaaS API、オンプレミスやクラウドにある様々なデータをノーコードでつなぐ事ができます。

www.arcesb.com

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 コネクトの詳しい使い方についてはヘルプもあわせてご覧ください。

cdn.arcesb.com

この記事のシナリオ

この記事では「Salesforce のAccount(取引先)へ登録したレコードをJSON でコールアウトするApex トリガを設定して、Account(取引先)レコードが追加されたらArcESB でコールアウトを受信してMySQL へ連携する」シナリオを実現します。

f:id:irokawah:20211123234950p:plain

事前準備

Salesforce からコールアウトされたリクエストを受信するためには、Salesforce からHTTPS でアクセスできる必要があります。ArcESB をSalesforce から接続できる環境に構成してください。

ArcESB のインストール、SSL/TLS 構成についてはこちらの記事を参考にしてください。この記事で用意した環境では、8080番ポートでArcESB のHTTPS 接続を構成しています。

www.cdatablog.jp

もし検証に利用できるドメインや証明書をお持ちでない方は、こちらの記事も参考にしてください。AWS のサービスだけでArcESB やその他のCData 製品をHTTPS 化して公開することができます。

www.cdatablog.jp

必要な設定と連携フローの作成

シナリオに必要な設定と連携フローを作成していきます。

ArcESB Webhook コネクタの設定

最初にSalesforce からの通知を受け取るためのWebhook コネクタをフローキャンバスに配置します。

f:id:irokawah:20211123235004p:plain

コネクタをクリックするとコネクタの詳細を設定・確認することができます。Webhook エンドポイント: として生成されたURL と、サンプルリクエストのリクエスト形式をJSON に変更して、サンプルのJSON を手元に控えておきます。

f:id:irokawah:20211123235015p:plain

続いて「ユーザー」タブを開きます。「+追加」ボタンでPOST/PUT 権限を付与したユーザーを作成します。認証トークン:の値はSalesforce からのコールアウト設定で利用しますので、控えておいてください。「変更を保存」で保存します。

f:id:irokawah:20211123235027p:plain

次に「サーバー」タブを開きます。規定では、localhostからのアクセスのみが許可されています。「+追加」をクリックして、IP アドレス:SaaSSalesforce)のIP アドレスを指定します。* であらゆるIP アドレスからの接続を許可することも可能です。

f:id:irokawah:20211123235039p:plain

許可すべきSalesforce のIP アドレス等については以下のページを参考にしてください。

Help And Training Community

ArcESB のWebhook コネクタでは認証が必要です。今回のSalesforce からのコールアウトでは、認証情報をURL に埋め込んで通知するようにしますので、「サーバー」タブの高度な設定に含まれるURL の認証トークンを許可を有効にします。これにより、「[Webhook エンドポイント:]として生成されたURL?@authtoken=[認証トークン]」のようにリクエストパラメータに認証トークンを含んだ形でリクエストすることが可能となります。

f:id:irokawah:20211123235051p:plain

Webhook コネクタのテスト(Postman からのテスト)

Salesforce 側の設定に移る前に、WebAPI 開発ツールのPostman を使って、ここまでの設定でArcESB のWebhook コネクタが正しく受信できるように構成されているかを確認してみます。

www.postman.com

Postman に以下の通り設定してリクエストを送ります。

  • Method : POST
  • URL : 認証トークン付きのWebhook URL([Webhook エンドポイント:]として生成されたURL?@authtoken=認証トークン
  • Body : 設定タブ内のサンプルJSON

f:id:irokawah:20211123235103p:plain

ArcESB のWebhook コネクタの「アウトプット」タブで送ったJSON データが受信できていれば成功です。

f:id:irokawah:20211123235114p:plain

Salesforce 側の設定

今回のシナリオは、シンプルに「標準オブジェクトであるAccount(取引先)にレコードが追加されたタイミングで、追加されたAccount レコードをJSON 形式でコールアウトする」ように設定にしました。

今回、Apex トリガや、実際にコールアウトするApex クラスの作成には、Salesforce Webhook Creator を利用させて貰いました。

f:id:irokawah:20211123235125p:plain

Salesforce Webhook Creator」ではApex トリガをイベントとして外部へコールアウトするために必要となる以下のような設定を生成してくれるので、今回のようなシナリオには便利です。

Salesforce Webhook Creator

  • リモートサイトの設定

f:id:irokawah:20211123235221p:plain

  • Apex トリガの作成

f:id:irokawah:20211123235231p:plain

  • 実際にコールアウトするApex クラス(Triggerの内容をJSONシリアライズしてコールアウト)

f:id:irokawah:20211123235245p:plain

Salesforce の設定やApex に関する詳しい情報はSalesforce のヘルプを確認してください。

Webhook の受信確認

それでは、実際にSalesforce のAccount(取引先)にレコードを追加してApex トリガ経由でArcESB が受信できるか確認してみます。

Account(取引先)にレコードを追加します。

f:id:irokawah:20211123235316p:plain

ArcESB のWebhook コネクタの「アウトプット」タブでレコードが増えていればWebhoook の受信は成功です。

f:id:irokawah:20211123235326p:plain

受信したファイル名をクリックしてSalesforce から通知されたJSON データを確認してみます。

f:id:irokawah:20211123235337p:plain

以下のように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 への接続情報をセットして「接続テスト」で確認します。

f:id:irokawah:20211123235351p:plain

MySQL への入力となるので、受信した顧客データを追加する「インプットマッピング」を設定します。今回はシンプルにidをキーに取引先名と取引先 部門名をそれぞれ会社名と部署名としてUPSERT する設定にしました。

f:id:irokawah:20211123235402p:plain

受信したJSON データをXML に変換(JSON コネクタ)

次に、JSON コネクタで、Webhook で受信したJSON データをXML にフォーマット変換をするための設定をします。コネクタの設定は規定のままで、Webhook コネクタからフローをつないでください。

f:id:irokawah:20211123235415p:plain

変換結果を確認するために、JSON コネクタの「インプット」タブから「ファイルをアップロード」で先ほどWebhook コネクタで取得したJSON ファイルをアップロードします。

f:id:irokawah:20211123235428p:plain

f:id:irokawah:20211123235442p:plain

変換結果を「アウトプット」タブからダウンロードします。

f:id:irokawah:20211123235453p:plain

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 へ連携するフォーマットが認識されます。

f:id:irokawah:20211123235505p:plain

XMLMap コネクタを開き、JSON コネクタで変換されるXML フォーマットを読み込ませます。

f:id:irokawah:20211123235515p:plain

マッピングエディタに、JSON コネクタで変換されるXML フォーマットがソースに。MySQL コネクタへ連携するフォーマットが宛先として表示されます。取引先名・取引先 部門名をマッピングします。

f:id:irokawah:20211123235525p:plain

これで「Salesforce のAccount(取引先)へ登録したレコードをJSON でコールアウトするApex トリガを設定して、Account(取引先)レコードが追加されたらArcESB でコールアウトを受信してMySQL へ連携する」ために必要な手順が完了しました。

シナリオの動作を確認する

あらためてSalesforce のAccount(取引先)へレコードを追加してみます。

f:id:irokawah:20211123235536p:plain

MySQL コネクタの「インプット」タブでレコードが追加されれば、作成したフローを通してMySQL へデータが届いたことを確認できます。

f:id:irokawah:20211123235546p:plain

実際にMySQL のテーブルをMySQL WorkBench などで確認してみてください。Salesforce に追加したAccount レコードのデータが格納されていれば成功です。

f:id:irokawah:20211123235556p:plain

さいごに

Salesforce からのコールアウトを受信できるようにするまでの環境設定で少し手間が掛かる部分もありますが、ArcESB でWebhook を受信したり、受信したデータを活用すること自体はとても簡単です。Webhook のような仕組みを利用すると連携の自由度が大きく広がります。是非お試しください。

www.arcesb.com


この記事では ArcESB™ 2021 - 21.0.7964 を利用しています。