RSSBus Connectを用いてPostgreSQLからSalesforceにContactデータを同期する方法

# はじめに

昨今業務システムのクラウドサービス活用も進み、マルチクラウド、オンプレ×クラウドのハイブリッドで利用されている企業も多くなってきています。

しかし、各アプリケーションで必要なデータはオーバラップしていることが多く、特に顧客情報・取引先情報などは様々なアプリケーションで必要かつ利用されていることが実情です。

そこで今回はRSSBus Connectを用いて、既存のDBで生成された潜在顧客（Lead）の情報をSalesforceの取引先担当者（Contact）へ同期する方法を紹介したいと思います。

# RSSBus Coonectとは？

https://www.rssbus.com/

RSSBus Connectは、ファイル、データベース、またはクラウドアプリケーションのデータをすべて1つのアプリケーションで簡単に統合することができるソフトウェアです。

アプリケーションとデータの接続を行い、Mrketoなどのマーケティングサービスから得た顧客情報をSalesforce等のSFAに連係したり、バイナリファイル転送・EDIによるプロセスの自動化も行うことが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/2dd6a4e5-c1be-b97f-4fc7-32d91e5d5d6e.png)

RSSBus Connectは以下のようにフロー形式のUIで各データソースを繋ぐようにデータ連携のプロセスを開発することが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/106a418a-2c3a-fd90-f0fa-53e284a9784c.png)

# 本記事で実装するシナリオ

本記事では、PostgreSQLで生成されたLeadの情報をSalesforceの取引先担当者（Contact）情報へ、EmailアドレスをKeyとしてUpsertする方法をお伝えします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/f0c27452-34a0-a066-19df-9877d473f13d.png)

対象は以下のPostgreSQLのLeadデータです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/1a952e89-b86a-042a-9950-e27cc25df541.png)

上記データをSalesforceのContact情報へ同期します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/755d4930-9aa9-039c-3f15-cdc8d8e1bcef.png)


# 事前準備

## RSSBus Connectのダウンロード・インストール

まず、RSSBus Connectをダウンロードします。

RSSBus Connectは30日間無償の試用版が提供されているので、以下からダウンロードしてください。

https://www.rssbus.com/download/

本記事ではWindows版（Windowsサービスで実行）を使用します。

ダウンロード後、インストーラーが立ち上がるので、ダイアログに沿ってインストールを実施します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/077b6fba-ede4-63bf-9583-0b2c5c2fee38.png)

インストール後自動的にRSSBus Connectの画面が立ち上がるので、インストーラーで設定したID・PWを用いてログインします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/d3de5331-5b9f-a9bf-ada8-3173bb6f755f.png)

ログイン後の画面でトライアルキーのインストールができるので［Activate 30-Day Trial］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/520f87d0-0531-55cf-f7b7-53aa3d209f49.png)

Name, Emailなどの必要情報を入力の上、ライセンス規約に同意し、［Activate Trial］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/aae8312b-52ad-65ce-08f1-108598049c39.png)

以上で、RSSBus Connectのインストールは完了です。

## Salesforce Portのダウンロード

続いて本フローを作成するにあたり必要となるSalesforceのモジュール（RSSBus ConnectではPortと呼びます）を追加でインストールします。

RSSBus Connectでは標準でも多様なPortが備わっていますが、以下のページから追加でPortをダウンロードし、機能を拡張することが可能です。

https://www.rssbus.com/apps/?tag=CRM

Port一覧からSalesforceをクリックし

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/aafe000c-6bb1-7591-6fc9-73fe2b6e1bfa.png)

［Download Port］をクリックすることで、インストーラーを入手できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/afafc623-37dc-ad0f-af71-7bc2e56e6e85.png)

Portインストーラーはダイアログに沿って進めるだけで簡単にインストールすることが可能です。

## PostgreSQLのテーブル構成

本記事では以下のようなPostgreSQLのテーブルを構成し、データの同期先としています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/59e7e393-2310-3132-f91b-703a952012df.png)

# フローの作成

## 作成手順

それでは、実際にフローを作成していきたいと思います。

本記事では、前述の通りPostgreSQLからSalesforceへデータを連係する以下のようなフローを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/6ed9ce02-4496-429d-873d-78dfc8fc6755.png)

大まかな手順は以下の通りです。

RSSBus Connectでは、それぞれの処理単位であるPortを構成し、つなぎ合わせることで一連のフローを形作ることが可能です。

1. PostgreSQL のデータを受信するPortの構成

2. Salesforce へデータを送信するPortの構成

3. PostgreSQL のデータをSalesforce へ送信するための変換を行うPortの構成

4. 各Portの接続

## PostgreSQL Receive Port の構成

まず最初にPostgreSQLのデータを受信するためのPortを構成します。

画面上のメニューから［FLOW］を選択すると、フローデザイナーの画面へ移動します。この画面で基本的なフローの作成が可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/c3ac40a7-d4f3-c68e-b555-5e95ab2c5baf.png)

左ナビゲーションのPortの一覧からドラッグアンドドロップでPostgreSQLのPortをキャンパスへ配置します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/4f423f48-b398-a9ca-f918-d60ddaf73a07.png)

任意のPort Nameを入力の上［＋Create Port］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/aa0fc6ed-b1d4-aa78-b8d0-f5f608328680.png)

配置したPostgreSQL Portを選択し、PostgreSQLへの接続情報［Host］［Port］［Database］［User］［Password］を入力の上、［Save Changes］をクリックします。なお［Test Connection］をクリックすることで、接続情報に問題が無いかどうかを確認することが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/76458bf1-d297-695b-2ea5-720817b93800.png)

次にこのPortでPostgreSQL上のどのデータを受信するかを設定します。

Portのプロパティペインの下にあるMappings から［Output］を選択し、［＋］ボタンから［Table or View］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/209ce46e-9361-1fad-4745-a2048c66d381.png)

事前に作成しておいた、［Lead］テーブルを選択し［Next］をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/d37132b2-4ac4-7b02-8acc-0eab0e309104.png)

この画面で取得するカラムと取得の条件を設定することができます。今回はすべてのカラムのデータを都度全件取得するように設定します。カラムを選択し、［Create］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/c4fac52c-dcd7-ba22-79f9-6cb6ad3e1524.png)

対象テーブルが追加されたことを確認後、［Save Changes］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/c0bebd9f-a835-70d5-923c-23dfea114a56.png)

Receiveの設定は初期値では手動実行状態になっているので、［Automation］タブから自動処理に設定を変更します。

データの送信は必要無いため［Send］のチェックは外し、［Receive］のチェックを入れて、任意の実行間隔を設定します。

今回はDefaultのまま、60分間隔としました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/80d97051-5e51-3cf6-f08a-46f7459c66b3.png)

以上で、PostgreSQLからのReceive Portの構成は完了です。

## Salesforce Sent Portの構成

続いて、Salesforceへのデータ登録を行う、Sent Portを構成します。

左メニューにSalesforceのPortがあるので、ドラッグアンドドロップでキャンパスに配置します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/af4d54ff-7c06-5f88-50f4-b43a4e7a52c8.png)

PortのNameの入力が求められるので、任意の名称を入力の上［＋Create Port］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/fd707b51-7660-4c5b-7138-2b5c1598f018.png)

配置したSalesforce Portをクリックすると、画面右にPortのプロパティペインが表示されるので、Salesforceへの接続情報となる［User］［Password］［Security Token］を入力し、［Save Changes］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/0809da39-56ca-9d51-dbfd-20ae7e995cba.png)

今度はデータを送信するためのPortのため、Mappingsから［Input］を選択し、［＋］ボタンから［Table or View］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/f85df487-a87e-87c3-729c-87b4f660fa81.png)

クリック後、Salesforceのテーブルとビュー一覧が表示されるので、［Contact］を選択し［Next］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/15e321c1-d7e3-732f-c40c-e66cb1b8f7a7.png)

データ挿入対象とする特定のカラムを選択しますが、今回は更新の識別を行うための項目としてEmailカラムを利用するのでEmailカラムも選択します。

しかしながらSalesforceは更新のために、Email項目では実施できないため、合わせてKeyであるIdも追加します。

必要なカラムの選択が完了後、［Create］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/80b1b9b3-25dc-c6d8-554b-9ed8e483527a.png)

次に、作成するべきデータか、更新するべきデータか、の識別条件としてEmailを有効にする設定を行います。

RSSBus ConnectのInputモジュールは、Keyが存在した場合、事前にそのKeyの値を元にデータの存在チェックを行い、作成するべきか更新するべきかの自動判断を実施しますが、今回はKeyではない項目で処理を行う必要があるため、処理条件を書き換える必要があります。

作成したテーブルの情報にマウスカーソルを合わせると、Editボタンが表示されるので、これをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/ce8d12e9-aadf-b7dc-ecd9-9998de225630.png)

先程のUIで設定された定義の本体であるXMLが表示されるので、以下に示すようにUpsertQueryの条件を追記し、保存します。このUpsertQueryによって、事前のチェック方法が変わります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/fea56fc8-3bb6-a410-9856-50becdd078be.png)


```xml

<Items>
  <Contact table="[Contact]" upsertQuery="Select * from Contact where [Email]=@Email">
    <Id  key="true"/>
    <Email />
    <FirstName />
    <LastName />
  </Contact>
</Items>

```

保存後、［Save Changes］をクリックすれば、Salesforceのデータ送信用Portの構成は完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/e8e8c47b-0825-a9ce-7e73-8ad6b7d937a2.png)

## MAP Port の構成

続いて、PostgreSQLのデータをSalesforceに連係できるように、データの形式を変換するためのMAP Portを構成します。

RSSBusは内部的には1レコード・1XMLファイル単位で処理するよう設計されており、そのXMLの構成に準じて、データの変換や挿入が実施されます。

今回は、PostgreSQLのLeadテーブルから取得したデータ（XMLデータ）を、SalesforceのContactテーブルへ挿入できるデータ変換処理をこのMAP Portを用いて構成します。

先程と同様に左のPort一覧から今度は［MAP］Portをドラッグアンドドロップでキャンパスに配置します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/f0683dd9-c78d-8d1e-fed0-3008e6510411.png)

任意のPort Nameを入力の上、［Create Port］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/f38a6d4e-5c6a-73d1-479e-6e3c060dfc69.png)

MAPは元となるXMLファイルをベースにすることで簡単に構成することができます。

事前に設定したPostgreSQL Receive Portでは以下のようなデータが送られるので、このファイルをアップロードします。

```xml

<Items>
  <Lead>
    <Id  key="true" />
    <Email/>
    <FirstName />
    <LastName />
  </Lead>
</Items>

```

SourceFileから［Select］→［Upload Sample File］をクリックし

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/14d7a03c-b947-89df-c1fd-2bdd6a7c9c69.png)

上記XMLファイルを選択の上、［Upload］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/dee3e034-8336-03ea-c454-39e8cf6195b1.png)

続いて送信先です。送信先は以下のようなXMLフォーマットとなります。

```xml

<Items>
	<Contact>
		<Id>0032800000HiXxmAAF</Id>
		<Email>agreen@uog.com</Email>
		<FirstName>Avi</FirstName>
		<LastName>Green</LastName>
	</Contact>
</Items>

```

同じように今度は［Destination File］から［Select］→［Upload Sample File］をクリックし

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/832a201f-7440-5fda-5921-12751e3a4545.png)

上記XMLファイルを選択の上［Upload］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/0d972ab8-b25f-6ca4-ad18-30cb322666c4.png)

各ファイルをアップロード後、下のMapping画面にそれぞれのXMLフィアルを元にした項目一覧が表示されるため、任意の項目同士をマッピングします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/300b84b0-a282-7620-af38-18db164257a6.png)

マッピング完了後、［Save Changes］をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/819f79d8-f0b9-cc14-210d-02eab607ca18.png)

以上でMAP Portの構成は完了です。

## 各Port の接続

最後に、それぞれ構成したPortをコネクタで接続します。

それぞれの始点と終点をドラッグアンドドロップで紐づけます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/b7531cb0-2c1f-dd49-9ac7-cbb0e3f2ad02.png)

以下のように紐づけたら、画面右下の［保存］マークをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/70fb9096-4872-0a6f-f4ef-b88ee6805cdc.png)

以上で、すべて構成が完了しました。

## 手動実行

それでは、実際に実行してみましょう。

今回の設定では60分ごとにPostgreSQLのReceive Portがデータを受信し、処理を開始しますが、手動で実行することも可能です。

PostgreSQL Portを選択し［Receive］タブを選択し［Receive］ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/1d694052-17c2-32df-975d-4985eeea5368.png)

自動的にデータが取得され、処理が行われます。

## 実行ログの確認

RSSBus Connectは各ポートから実行ログを確認することが可能です。

PostgreSQL Receive Portは、Receiveタブから取得した結果生成されたXMLの履歴を確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/1146547e-68f6-43f6-8389-727fc20a1323.png)

Map Portは変換結果を［Send］タブから確認できます。File Nameをクリックすることで、変換後に生成されたXMLファイルをダウンロードすることも可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/30aff105-b027-1746-e2fe-a04e5909f392.png)

Salesforce Port では、［Send］タブから、データベースへの送信結果を確認することができます。

StatusがSentになっているものは正常に処理されたデータとなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/8632ee81-4608-6d83-aa24-f514cbd6a625.png)

なお、以下がSalesforce Portで処理された際のLogファイルになります。

```log

[2018-03-14T23:01:16] LoadTemplate C:\Program Files\RSSBus\RSSBus Connect\data\Salesforce2\Templates\Input\[AppMenuItem].xml
[2018-03-14T23:01:16] System.Data.CData.Salesforce
[2018-03-14T23:01:16] Execute Before Send Event:
                      Event processed successfully.
[2018-03-14T23:01:16] Validate XML file: Lead_2018-03-14-23-00-39_0018.xml
[2018-03-14T23:01:16] The XML file is valid.
[2018-03-14T23:01:16] Begin parsing file: Lead_2018-03-14-23-00-39_0018.xml
[2018-03-14T23:01:16] Find root element "Items", begin processing all sub-elements.
[2018-03-14T23:01:16] Starting transaction.

[2018-03-14T23:01:16] Provider: System.Data.CData.Salesforce
[2018-03-14T23:01:16] TransactionId: a5a65f3f576d4f509b1d06ee493342e2
[2018-03-14T23:01:16] SQLCommand: Select * from Contact where [Email]= @Email; @Email=agreen@uog.com
[2018-03-14T23:01:17] 1 row(s) affected.
[2018-03-14T23:01:17] Result column(s): (Id, IsDeleted, MasterRecordId, AccountId, LastName, FirstName, Salutation, Name, OtherStreet, OtherCity, OtherState, OtherPostalCode, OtherCountry, OtherLatitude, OtherLongitude, OtherGeocodeAccuracy, MailingStreet, MailingCity, MailingState, MailingPostalCode, MailingCountry, MailingLatitude, MailingLongitude, MailingGeocodeAccuracy, Phone, Fax, MobilePhone, HomePhone, OtherPhone, AssistantPhone, ReportsToId, Email, Title, Department, AssistantName, LeadSource, Birthdate, Description, OwnerId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, LastActivityDate, LastCURequestDate, LastCUUpdateDate, LastViewedDate, LastReferencedDate, EmailBouncedReason, EmailBouncedDate, IsEmailBounced, PhotoUrl, Jigsaw, JigsawContactId, CleanStatus, Level__c, Languages__c)
[2018-03-14T23:01:17] Matching record: ('0032800000HiXxmAAF', 'False', '', '0012800000QsYMFAA3', 'Green', 'Avi', 'Mr.', 'Green Avi', '', '', '', '', '', '', '', '', '1302 Avenue of the Americas 
                      New York, NY 10019
                      USA', '', '', '', '', '', '', '', '(212) 842-5500', '(212) 842-5501', '(212) 842-2383', '', '', '(212) 842-5428', '', 'agreen@uog.com', 'CFO', 'Finance', 'Chris Nobel', 'Public Relations', '1929-09-21T00:00:00+09:00', '', '00528000002Oc7TAAS', '2016-03-11T14:50:12+09:00', '00528000002Oc7TAAS', '2016-03-11T14:50:12+09:00', '00528000002Oc7TAAS', '2017-11-29T18:32:42+09:00', '', '', '', '', '', '', '', 'False', '/services/images/photo/0032800000HiXxmAAF', '', '', 'Pending', 'Primary', 'English')
[2018-03-14T23:01:17] SQLCommand: UPDATE [Contact] SET [Email]=@Email, [FirstName]=@FirstName, [LastName]=@LastName WHERE [Id]=@Id; @Email=agreen@uog.com; @FirstName=Avi; @LastName=Green; @Id=0032800000HiXxmAAF
[2018-03-14T23:01:19] 0 row(s) affected.
[2018-03-14T23:01:19] End parsing file.
[2018-03-14T23:01:19] Ending transaction: a5a65f3f576d4f509b1d06ee493342e2
[2018-03-14T23:01:19] TransactionAction: commit
[2018-03-14T23:01:19] Execute After Send Event:
                      Event processed successfully.

```

以下の行で、Emailを条件として、データを探索し

[2018-03-14T23:01:16] SQLCommand: Select * from Contact where [Email]= @Email; @Email=agreen@uog.com

最終的には、IdをWhere条件として更新処理を行っていることがわかるかと思います。

[2018-03-14T23:01:17] SQLCommand: UPDATE [Contact] SET [Email]=@Email, [FirstName]=@FirstName, [LastName]=@LastName WHERE [Id]=@Id; @Email=agreen@uog.com; @FirstName=Avi; @LastName=Green; @Id=0032800000HiXxmAAF

# おわりに

いかがでしたでしょうか。もともとEDIの機能が中心であったため、XMLファイルに都度変換して、各Portでやり取りを行っているという点を理解することがRSSBus Connectを用いた開発を行う上でのポイントとなります。

是非様々なクラウド・アプリケーション連係シナリオで活用してみてください。

また、RSSBus Connectでは、下記にようなKnowledgeやドキュメントがOnline上で公開されているので、是非参考にしてみてください。

Sample Package では、各種シナリオに応じたフローがダウンロードし、自身のRSSBusへインストールの上、設定値などが確認できるので、とても参考になるかと思います。

Online Knowledge Base

https://www.rssbus.com/kb/

Sample Package

https://www.rssbus.com/examples/

Product Document

http://cdn.rssbus.com/help/ARD/mft/