CData Sync を使ってSalesforceのデータをSnowflake にロードしてみた

2019.11.14

はじめに

Snowflakeは、クラウドサービスで提供されるデータウェアハウスサービスです。本記事では、CData Software 社のクラウドデータパイプライン製品であるCData Sync を使用して、CRMクラウドサービスであるSaleforceのデータをSnowflakeにロードする方法をご紹介します。

1. Snowflakeデータベースの準備

Snowflakeには、30日間利用できる評価版環境があります。今回はこちらの記事を見ながらSnowflakeの評価版環境を構築しました。

Snowflakeへの理解を深めるために、概念・機能まとめや様々なデータロード方法の記事も併せて読むと良いでしょう。

構築したSnowflake環境の「Database」タブを開き、データ収集用のDatabase(本例では「SYNC」)を作成します。

これでデータロード用のSnowflake側の準備は完了です。

2. CData Sync製品のインストール

CData Sync製品にも、30日間利用出来る評価版があります。CData Software社のCData SyncのWebページからダウンロード可能です。

CData Syncは、Windowsプラットフォーム向けの.NETエディション、Linux / Mac などクロスプラットフォーム向けのJavaエディションが選択出来ます。本手順では、Windowsプラットフォーム向けの.NETエディションを使用します。

連絡先情報(必須項目:Eメール)を入力してダウンロードします。

ダウンロードされたインストーラ(CDataSync.exe)を実行します。ソフトウェア使用許諾契約書を確認して、インストールパス、および、インストールコンポーネントはデフォルトのまま進みます。

途中、CData Syncの管理コンソールへのログインで必要な管理者向けのパスワードを設定する画面が表示されるので、パスワードを入力して手元に控えましょう。

インストールが完了すると、デフォルトで組み込みのWebサーバがポート:8019で起動して管理コンソールのログイン画面がデフォルトブラウザで開くようになっています。

CData Syncの管理コンソールに、ユーザ名:admin、パスワードはインストール時に設定したものを利用してログインします。

正常にログイン出来ると「情報」タブが開きます。評価版を利用の場合は「30日の評価版をアクティベート」、製品版をご利用の場合は「新しいライセンスをインストール」をクリックします。

30日の評価版の場合は、名前とEメール、製品版の場合にそれらに加えてプロダクトキーを登録して「使用許諾契約書」を確認した上でアクティベートしてください。

(注意) アクティベーション時に、CData社のライセンスサーバへの通信が発生します。社内ネットワークでプロキシサーバー経由での外部アクセスとなる場合は、CData社のサポートまでお問い合わせください。

アクティベーションが成功するとライセンス情報にてアクティベートされたライセンス情報が確認出来ます。

以上で、CData Sync 製品のインストールおよびライセンスアクティベーションが完了です。

3. CData SyncからSnowflakeへの接続設定

CData SyncからSnowflakeへの接続を設定します。CData Sync の「接続」>「同期先」タブを開き「Snowflake」アイコンをクリックします。

Snowflakeへの接続設定を設定します。

設定項目 備考
名前 (任意) 例では「Snowflake」と設定
プロバイダークラス: System.Data.CData.Snowflake 変更不可
フォーマット設定: プロパティリスト デフォルト設定
Database: (Snowflake側で作成したデータベースの名称) 例では「SYNC」と設定
User: (Snowflakeへの接続ユーザ)
Password: (Snowflakeへの接続ユーザのパスワード)
Schema: (Snowflake側で作成したデータベースのスキーマ名) 例では「PUBLIC」と設定
Warehouse: (Snowflake側で作成したデータベースのWarehouse名) 例では「COMPUTE_WH」と設定

(補足) Schema名は、Snowflake管理コンソールのDatabaseタブから確認出来ます。

(補足) Warehouse名は、Snowflake管理コンソールのWarehouseタブから確認出来ます。

「変更を保存」をクリックしてSnowflake への接続情報を保存します。

4. CData SyncからSalesforceへの接続設定

ロード先のSnowflake側に続いて、データソースとなるSalesforce への接続を設定します。CData Syncの「接続」>「データソース」タブ内の「Salesforce」アイコンをクリックします。

(補足) 一覧にアイコンがないデータソースを選択したい場合は「+Add More」ボタンをクリックすると、100を超えるデータソースが選択出来て画面から接続先を任意に追加出来ます。

Salesforceへの接続情報を設定します。

設定項目 備考
名前 (任意) 例では「Salesforce」と設定
プロバイダークラス: System.Data.CData.Salesforce 変更不可
フォーマット設定: プロパティリスト デフォルト設定
User: (Salesforceへの接続ユーザ)
Password: (Salesforceへの接続ユーザのパスワード)
Security Token: (Salesforce側で発行したセキュリティトークン)
Use Sandbox: (Salesforce環境がサンドボックスか否か) デフォルト値はFalse

(補足) セキュリティトークンの取得方法

  • Salesforceの[私の設定]->[個人用]->[私のセキュリティトークンのリセット]を開きます。
  • [セキュリティトークンのリセット]をクリックします。トークンがE メールで送られます。
  • SecurityToken 接続プロパティでセキュリティトークンを入力するか、Password に追加します。

(補足) Salesforceへ認証にOAuthを利用する場合は、CData社の製品マニュアル OAuth 認証の使用をご参照ください。

「接続テスト」を実施して「接続に成功しました。」が表示されることを確認して、「変更を保存」ボタンをクリックして接続情報を保存します。

5. ジョブの作成、および、手動での実行

次に、SalesforceのデータをSnowflakeのテーブルにデータをロードするジョブを作成します。CData Syncの「ジョブ」タブを開き、「+ジョブを追加」ボタンをクリックします。「新しいジョブを作成」ダイアログが表示されるので、以下の内容で設定して「+作成」ボタンをクリックしてください。

設定項目 備考
ジョブ名 (任意) 例では「Salesforce2Snowflake」と設定
ソース Saleforce
同期先 Snowflake

ジョブ設定画面に切り替わるので「ジョブ設定」>「テーブル」タブ内の「+テーブルを追加」ボタンをクリックします。「テーブルを追加」ダイアログが起動してSaleforce内のオブジェクトがテーブル一覧として表示されます。今回は、Saleforceの「取引先(Account)」と「見込み客(Lead)」を選択して「+選択したテーブルを追加」ボタンをクリックします。

選択したSaleforceのオブジェクト(例では「Account」と「Lead」)がテーブルリストに追加されたことを確認してジョブの「変更を保存」します。それでは、実際に手動でジョブを実行してみます。テーブルリスト左のチェックボックスを選択して「実行」ボタンをクリックします。

ジョブが実行され「Running...」状態になり、データのロードが完了すると「ジョブ(ジョブ名)は正常に完了しました」メッセージが表示されます。

6. ロードされたデータの確認

それでは、SalesforceのデータがSnowflakeのテーブルにロード出来たかをSnowflakeの管理コンソールで確認してみましょう。「Database」タブの作成したデータベース(本例ではSYNC)を選択します。すると「Lead」と「Account」テーブルが作成されていることが確認出来ます。

SnowflakeのWorksheets機能からSQLでSalesforceからロードされた「取引先(Account)」のデータをSELECTしてみてみます。

select * from "SYNC"."PUBLIC"."Account"

データが取得出来れば成功です。なお、CData Syncの評価版ライセンスの制限で、50行以上のテキストデータは「N/A-Trial Version」となります。

7. ジョブの定期実行と差分更新について

先ほどは手動でジョブを実行しましたが、日次などの定期サイクルでジョブを自動実行出来るようにしてみましょう。CData Syncの管理画面のジョブ設定画面に戻り、作成したジョブの「スケジュール」タブを開きます。「このジョブをスケジュールに従って自動的に実行」内の「スケジュールを有効にする」をオンにすると様々な間隔でのスケジュールを設定することが出来ます。

試しに毎時(Hour)ゼロ分に実行するスケジュールを設定すると、ジョブの「次の実行」列に次にジョブが実行される日時がセットされます。

ジョブの実行は、手動、スケジュールの実行の他に、 WebAPI、exeバッチからの起動も出来ますので、既存のジョブスケジューリングソフトや外部プログラムから呼び出すことも可能です。

curl --header "x-cdata-authtoken: MY_AUTH_TOKEN" -X POST -H "Content-Type: application/json" -d '{"JobName": "Salesforce2Snowflake", "ExecutionType": "Run"}' "/api.rsc/executeJob"
.\CData.exe api/executeJob.rsb -JobName Salesforce2Snowflake -ExecutionType "Run" -@x-http-method "POST"

2回目以降のジョブ実行の結果(ステータス)を確認すると、全レコードが処理されていない(Records affectsが少ない)ことに気付きます。これは、2回目以降のジョブ実行では、データソース(Salesforce)側で変更があったレコードのみを処理しているためです。CData Syncでは、データソース側のレコード単位の最終更新日時と前回のジョブ実行の日時を比較することで、このような差分ロードを実現しております。データソースがSalesforceの場合は、削除データも論理削除データとして内部的にSalesforce側で保持されているため、Snowflake側のデータも削除されます。

差分更新でなく、毎回、全件取得し直したい場合は、ジョブ設定のAdvancedタブ内の「テーブルデータを削除」、テーブル自体を作り直す場合は「テーブルを削除」のチェックをオンにしてください。この他にもテーブル名にプレフィクスを付けたいなどきめ細やかな設定も本画面から可能です。

まとめ

いかがでしたでしょうか? CData Sync を利用することでノンコードでSnowflake にデータをロード出来ました。CData Syncは、Salesforce以外にも、170を超えるSaaS/アプリケーション/NoSQL/ファイルなど様々なデータソースをSnowflake にロードすることが出来ます。是非、こちらのCData Sync 製品サイトにアクセスして30日間の評価版をお試しください。