
SalesforceとDWHを双方向同期してSSOTを目指そう!
概要
「SalesforceとDWHの情報一元化(Single Sorce of Truth、以下SSOT)」を目指してみたいですよね!
Salesforceはデータ管理という点でも優れたサービスです。意識せずにSSOTを実現するケースも。なぜなら…すべてSalesforceのオブジェクトにデータが貯まるから!リレーション管理もできるし楽だね!
…膨大なデータソースや外部依存データは管理は悩ましいですが、Salesforceのアドミニストレータは、「Salesforceにデータを集約する」ことでSSOTを実現してます。

一方で、データアナリスト・データエンジニアのSSOTはSalesforce内部で完結させることは少ない気がします。
「Salesforceもデータソースの一つ」と考えて、BigQuery等のDWHに情報を集約することが多い気がします。

ただし…Salesforceを積極活用する/できる企業は、SalesforceでDWH上で閲覧出来る情報をシームレスに確認したいケースがあります。
BigQueryでSQL叩いたり、TableauでSalesforceに埋め込むことで疑似解決できるのですが、「Salesforce上のデータとして扱いたい」って思うケースがあるのです…

そこで本記事では
・SalesforceからDWHに転送しよう
・DWHからSalesforceに転送しよう
に分けて紹介します。
正直いうと、この記事で紹介していない方法も数多くあるはずなので参考までに…という形で。
ちなみに本記事で紹介する検証方法は「無償」かつ「定期実行」ができるもののみを対象とします。手動実行は色んな手段が出てくるので…
「本当にできるのかな?」という方はぜひ検証してみてください!
紹介サービス(全部必須ではないないです)
記事で紹介するサービス一覧です。当たり前に知っている方とそうでない方に分かれそうだな、と思いそれぞれ、紹介します。本検証にあたりすべて無償で始められるので、ご興味ありましたら各ページに遷移いただければと思います。
・Tableau Developer program
・Salesforce Developer Edition
・Tableau CRM
・Heroku
・Heroku Postgres SQL
・Heroku Connect
・Google Apps Script
・BigQuery
各種利用サービスの概要
Tableau Developer Program
Tableau Developer御用達?のTableauの検証環境。無償で開始できますが、各種利用規約をご注意ください。本件のAPI検証目的であれば無償利用が可能です。
Salesforce Developer Edition
Salesforceアドミニストレータは御用達のSalesforceの学習用検証環境です。同じく利用規約はご注意ください。ちなみに下記URLで紹介するDeveloper Editionは少し特別です。Tableau CRMも利用できます。
Tableau CRM
Salesforceが過去買収したBIサービス、一つ前の名称はEinstein Analytics。
Tableau買収後、Einstein AnalyticsからTableau CRMに名前が変わりました。
上記リンクからDeveloper Editionを作成した場合のみ、Tableau CRMの検証環境が利用できます。今回は詳細の説明を省きますが、Salesforceにデータを書き込む、という、
「もうこの機能紹介して本記事終了でいいじゃん」
という位便利な機能です!ガッツリとした紹介はまたの機会に。
Heroku
Salesforceが買収したPaas(Platform as a Service)サービスです。もちろん他社のPaasサービスと比較してSalesforce関連サービスとの相性はいいです。
Ruby使う人が好きなイメージがあります。とはいえ、私はPython使い。それでも自由度高く設定できます。無論記事通り無料でスタートできます。
Heroku Postgres SQL/Connect
Herokuは数多くのアドオンを有効活用して、環境準備を省略できます。
・Heroku Postgres SQLはHeroku内で展開されるPostgres SQL
・Heroku ConnectはSalesforceとネイティブ連携してくれる

Google Apps Script
Google サービスとの連携が非常に簡単にできる無償のローコードプラットフォームです。Javascrpitベースの言語です。これで救われている方々どの程度いらっしゃるのだろう…
BigQuery
Google が提供する人気の分析データウェアハウス。無料枠があり安心して始められます。
以上のサービスで利用します。
SalesforceからDWHに転送しよう
すみません…山程ありますよね…
本記事では…無償の方法、またはSalesforceサービスで実践した経験があるもののみ書きます。
Google Apps Scriptを利用する
下記は過去、執筆した記事です。本番環境含めて無料できます。
Tableau CRMを利用する
Tableau CRMは「レシピ」と呼ばれるETL機能があります。
Snowflakeには書き込めます。(BigQueryは書き込めない)
Amazon S3、Tableau Hyperファイル、Salesforce Platformにも書き込めます。先に言っておくと、Salesforce書き込みには、これが一番安定かなぁと思っています。
Tableau Prep Conductorを利用する
すみません、Prep大好きなので贔屓目かもしれません…
Tableau Prep Conductorは簡単に、定期的に、BigQueryにデータを書き込めます。(新規作成・増分更新含めて!)
他にもAmazon Redshift、Microsoft SQL Server、MySQL、Oracle、PostgreSQL、Snowflake、Teradataを書き込み先として設定できます。
ちなみに・・・下記画像のようにたった一つのPrepフローで対象オブジェクトをBigQueryに書き込めます。なんて楽なのでしょう!

DWHからSalesforceに転送しよう
おそらくこれが本題ですね。
SalesforceからDQHに書き込む方法は数多いです troccoさんとか日本の素晴らしいサービスからも書き込みできますしね!
ただし、DWHからSalesforceに書き込む方法は限られてます。
Heroku Connectを利用する(Insertでオススメ)
Salesforce Developer大好き!Heroku!
そのアドオンであるHeroku ConnectというSalesforceとHerokuを連携する「Heroku Connect」を利用します。

まずはHeroku上でこのようにHeroku Connectの設定をして、SalesforceからPostgres SQLにデータを書き出し続けるよ!という設定をします。
Accelerate PollingをONにすると10分ごと、どころかほぼ即時反映してくれるようになります。ただしSalesforce側の処理が不安なのでOFFにしておきます。
またDataBase→Salesforce設定をONにすること外部Idの設定をして、書き込めるように設定しました(注意:連番コードは利用できなかったので一旦、Salesforce 18桁Idを利用してます)

その結果、下記のように名称がA-から始まる取引先名などが取得できました。そしてそこから得られた結果をTableau Prep Conductorを利用してBigQueryに転送します。

無事にBigQueryにテーブルを作成できました。
注意!
失敗パターンを見せるのでここから先のエラー報告まで絶対本番環境でやらないでください
じゃあ逆をやりたくなりますね。本来ならばBQ側で集計した情報を更新します。
「NameのをAとB入れ替えてみよう!」
と考えた上で、別のTableau Prep Flowを走らせてみると…

できました!シンプルですね!その結果…じゃん。取引先名が変更され多用に見えます。じゃあ…Salesforceは?と見てみると…あらら…?

BとAが混ざっていて、作成日が新しくなっている…?

嫌な文言が…!削除を試みただって…???
はい、そうなんです。Tableau Prepの場合、Updateとは…特定カラムを更新する的な作業ではなく、一度データを削除した後、更新する作業なので超注意してください。(これ伝えたいと思ってました、危ないので)
レコードのインサートするときはこれでいいんですけどね。

ちなみに下記のようにPostgres SQLを外部から呼び出しできます。ここでUpdateするのが一番安全ですが楽ではありません…Heroku ConnectでUpdateは要注意って覚えておいてください!

Tableau CRMを利用する(すべておススメ)
先述の通りですが、現在安定的に動くのは、Tableau CRMな気がします。
Update / Upsert / Insert、ベータ版ではありますがすべて安定的に動いてくれます。

まずはリモート接続種別を選びます。Heroku Postgres SQLやBigQueryが選べます。BigQuery側だと非公開鍵の登録が必要になるので、Heroku Postgres SQLが好きです。
ただし将来、Tableau Prep から Tableau CRMに書き出す機能が実装される予定なので、それが最も望ましいです。

その結果をTableau CRMが持つレシピ機能を用いて、Salesforceアウトプットを実装します。その結果、下記のように結構簡単にデータを更新できます。今までの苦労は…???と思うほど楽です。ネイティブ機能で作成してくれたものは楽ですねやっぱり…

これで完了です!

ちなみにTableau CRM も Tableau Prepもデータ転送従量課金ではありません(アカウント課金サービス)。詳細の金額は差し控えますが…めちゃ安いですよ。一緒に語れると嬉しいです!
結論
SalesforceとDWH間で同じ信頼できるデータをやり取りする方法は下記の通りです。方法論として一つは答え出せましたが…うーん…まだまだSalesforceへのデータ取り込みは障壁高いですね。

そして今回個人チャレンジのPoCでもあり、色々調べてわかったことですが、Salesforceファミリーの製品は他社製品と比較すると、買収されたもの含めて相性いいように機能開発されているなと気が付きます。
やり方わからないよーという方はぜひツイッターでご連絡ください!
ありがとうございました!