[salesforce][Treasure Data] Treasure DataのResult exportにSalesforce.comが追加されたので試してみた
Treasure DataのRelease Note 20150203にてTreasure DataのResult export先としてSalesforce.comが追加されました。これでTreasure Dataで集計した結果を直接Salesforce.comへpushできるようになりました。
以下、Treasure DataのドキュメントとnahiさんのQiitaの記事を参考に実際に連携してみます。
試すにはTreasure DataのトライアルとSalesforce.comのDeveloper Editionが必要ですので取得します(※今回のエントリはTreasure DataまたはSalesforce.com若しくは両方をまったく触ったことも無い人を想定して書いてますので回りくどい説明は便宜読み飛ばしてください)
まずは非常にシンプルに静的なTreasure Dataの集計クエリの結果をSalesforce.comのカスタムオブジェクトにレコードを追加(append)していく方法をやってみます。
Treasure Dataにログインしたら何はともあれTutorialを始めましょう。以下のようにHelp > Tutorialをクリックします。
サンプルデータはNASDAQの株式相場履歴データのようですね。StartをクリックしてTutorialを進めます。
あとは以下のようにハイライト表示されポップアップで概要説明がありますので進めてみてください。
簡単にまとめますと以下のような説明だったと思います。
- グローバルメニューの”Databases”を選択
- データベース一覧から”sample_dataset”を選択
- sample_datasetのテーブル一覧から”nasdaq”テーブルを選択
- nasdaqテーブルのプレビュー
- グローバルメニューの”New Query”を選択
- New Queryの”Databases”セレクトボックスで”sample_dataset”選択
- ある期間における各銘柄の終値の最大値と最小値を求めるクエリを挿入
- クエリを実行
- クエリ結果の冒頭100レコードを表示
- 結果を”Browser Download”や”CLI Download”でCSV出力などが可能
- 「ではデータを投入してみましょう」みたいな感じで終了
あとグローバルメニューの”Jobs”と”Queries”について補足しておきます。
“Jobs”はQueryやTreasure Dataに対するバルクインポート(大量データの一括インポート)のタスクの履歴や状況を確認するものです。
“Queries”はQueryをCronのような感じでスケジューリングすることで予約済みのQuery一覧としてQueriesに表示されるようになります。
ではグローバルメニューの”Jobs”から先ほどのTutorialで行ったJobを見てみましょう。Job IDをクリックするとJobの詳細が開きます。
“Edit Query”ボタンをクリックすると先ほどのクエリを編集できます。
実はクエリ結果をSalesforce.comに連携するにはクエリ編集画面の”Result Export”で”Salesforce.com”を指定すれば良いだけです。Result Exportの”add”をクリックしてみてください。
以下のように”Export to”としてセレクトボックスでエクスポート先を選択できるようになっているのでSalesforce.comを選択します。
あとは以下の設定画面で接続先Salesforce.com環境の情報を登録するだけなのですが、ここからSalesforce.com側の説明に移ります。
まず、Salesforce.com側と連携するために必要な情報をまとめますと以下のようになります。
- Host(login.salesforce.com or test.salesforce.com)
- Username(メールアドレスっぽい形式のユーザID)
- Password(セキュリティトークンが必要な場合は連結)
- Object(一般的なDBで言うところのテーブルのこと)
- 項目(一般的なDBで言うところのカラムのこと)
先ほど取得したSalesforce.comのDeveloper Editionにログインし、”カスタムオブジェクト”という一般的なデータベースで言うところのテーブルに相当するものを作成しますので以下のように”設定”を開きます。
“アプリケーションの設定”のところの”作成”メニューから”オブジェクト”を選択します。
カスタムオブジェクト一覧が表示されます。”新規カスタムオブジェクト”ボタンをクリックしてカスタムオブジェクト(ユーザカスタムのテーブル)を作成します。
以下のように入力して保存します。Salesforce.comのオブジェクトには必ず”Name”というカラムが存在し、テキストか自動採番(インクリメント)ナンバーか指定しますが、今回は銘柄別の集計結果が投入されるので”Name”は銘柄が妥当かと思います。
保存後、そのまま登録したオブジェクトの詳細画面が表示されるので、そこから引き続き、このオブジェクト(テーブル)に対する”カスタム項目(カスタムカラム)”を登録します。
こちらはウィザード形式になっていて最初にデータ型を決めなければいけません。これから作成するカスタムカラムは株価終値の最大値と最小値ですから”数値型”を選択します。
次にカラム名などを入力します。Treasure Data側と同様に”max_close”にします。桁数は小数点第2位まで必要なようなので以下のようにします。
次は項目レベルセキュリティの設定ですが、とりあえずは無視して進んで結構です。デフォルトのまま次へ進みます。
次はページレイアウトへの追加ですが、こちらもデフォルトのままで結構です。そのまま保存します。
同じ要領で”min_close”項目(カラム)を作成して保存してください。以下のように設定できればカスタムオブジェクト作成は完了です。
更に”タブ”というものを作成します。
タブはグローバルメニューのようなもので先ほど作成したオブジェクトの標準詳細画面などへのリンクを作成するイメージです。
“アプリケーションの設定”のところの”作成”メニューから”タブ”を選択します。
続いて”カスタムオブジェクトタブ”の”新規”ボタンをクリックします。
タブに表示するオブジェクトやアイコンを設定します。もちろんnasdaqオブジェクトです。
続いてのプロファイルの設定は今回無視して結構なので飛ばします。
最後に表示するアプリケーションを選択します。アプリケーションってなに?と思いますが今はひとまず以下のように”Force.com”のみチェックをして保存します。
これで以下のようにタブが表示されるようになりました。
先ほどのアプリケーションというのは上の画像の赤丸の部分のリストに表示されるもので、このリストで”Force.com”が選択されている時にnasdaqタブが表示されるように設定したのが最後の設定です。
つまりSalesforce.comで言うところのアプリケーションとは”タブの集合”と言えます。
これで投入先のデータの器は作られたわけですが、あと1点だけ必要な設定があります。
Salesforce.comはセキュリティの観点からデフォルトのままですとユーザのログインIPアドレスが変わる度にメールなどに送付される確認コードを入力させる仕様になっています。
これが今回のような外部サービスからログインしてデータを投入するような場合はメールなどでのフローは難しいため”セキュリティトークン”というものを発行します。
セキュリティトークンを発行するには”個人設定”のところにある”私の個人情報” > “私のセキュリティトークンのリセット”でリセットします。
メールでセキュリティトークンが届くので外部システムのパスワード入力欄に”パスワード+セキュリティトークン”という文字列を登録することで外部システムからSalesforce.comにログインできるようになります。
ちなみに今回のような開発環境で試すような場合にセキュリティトークンは面倒だというようなケースでは、特定のネットワークアドレスを信頼するという設定で回避することもできますがココでは触れません。
それではSalesforce.com側と連携するために必要な情報を振り返ります。
- Host -> login.salesforce.com
- Username -> <あなたのユーザID>
- Password -> <あなたのパスワード+セキュリティトークン>
- Object -> nasdaq__c
- 項目 -> Name, max_close__c, min_close__c
まず、Hostですが”login.salesforce.com”と”test.salesforce.com”があって今回は”login.salesforce.com”です。
Salesforce.comではプロダクション環境は”login.salesforce.com”でテスト環境(Sandboxと呼びます)は”test.salesforce.com”というホストにログインするということになっていて、Developer Editionは一応プロダクション環境と同じホストということになっているからです。
次にUsernameとPasswordですが、これは上述した通りセキュリティトークンに気をつければ問題ありません。
- username: user@treasure-data.com
- password: PASSWORD
- security_token: 7SMvicR9ojdPz0XLtlWi3Rtw
解りやすく例を示すと上記のような場合は以下のようになります。
- Host -> login.salesforce.com
- Username -> user@treasure-data.com
- Password -> PASSWORD7SMvicR9ojdPz0XLtlWi3Rtw
- Object -> nasdaq__c
- 項目 -> Name, max_close__c, min_close__c
最後にObject名と項目名ですが、一部のオブジェクト名や項目名には、先ほど設定したはずの名前に”__c”(アンダースコア&アンダースコア&c)というものを付与しなければいけません。
これはSalesforce.comではカスタムで作成したオブジェクトや項目には”__c”が付くことで、標準オブジェクトや標準項目(Salesforce.comがもともと用意しているテーブルやカラム)と同名のカスタムオブジェクトやカスタム項目を作成しても別物として扱えるようになっています。
従ってカスタムオブジェクトの標準項目(ややこしい)である”Name”項目には”__c”は付かず、他の項目(カスタム項目であるmax_close__c, min_close__c)には”__c”が付くと言うことです。
ただし、色々考えなくても先ほどのカスタムオブジェクト詳細画面で”API参照名”に表示されている文字列を転記すれば問題ありません。
では、先ほどのTreasure Data側の画面に戻ってSalesforce.comへの接続設定の続きをやります。
上記でまとめた通り以下のように接続設定をします。
続いてクエリを以下のように書き換えて”Run”で実行します。
成功して2,623レコードがSalesforce.com側に投入されたようです。
Salesforce.com側を確認してみるとデータが投入されているのが解ります。
私が便利だと思ったのはTruncate Modeで、こちらは一旦対象のオブジェクトのデータを全削除してから投入します。これは、常にSalseforce.com上には過去3ヶ月分のデータだけが存在する状態にするような時に便利です。
これまでは、Herokuアプリのような中間サーバやSalseforce.com内部でApex言語を用いてTruncate Modeと同様のことを実装していたことを考えると非常に重宝すると思います。
また、以下のような裏ワザもあるようです。Treasure Data側のクエリを以下のように何もデータを投入しないクエリとすることで全削除だけ利用するというものだと思います。
@kzk_mover @joeartsea テスト中に便利だったワザとして、select 1 from test where falseみたいな空クエリをtruncate + hard_delete onで連携し、DEのデータストレージを解放するというものがあります。
— Hiroshi Nakamura (@nahi) 2015, 2月 11