外部データソース(External Data Source)について
Winter '15から External Data Source(外部データソース)機能がGAとなり Developer Edition で利用できるようになりました。マーケティングネームとしてLightning Connectと呼ばれていたりしますが、Apple製のデバイスに刺すあいつのことではありません。
外部データソースとは、Salesforceの外部のサービスをあたかもSalesforce内のオブジェクトであるかのように扱える便利な機能なのですが、今のところ2つの課題があります。1つ目は、接続できる外部サービスはSalesforceからリーチできる場所(=クラウド上)にある必要があるということで、2つ目は、サービスがODataというちょっと馴染みの薄いエンタープライジー(?)なプロトコルに対応している必要があるということです。
外部データソースとファイアーウォール越え
1つ目の課題については、セキュアエージェントという機能がいずれそれを解決してくれる模様です。セキュアエージェントとは、Salesforceからファイアーウォール内のデータソースにアクセスできるように、ファイアーウォール内に置くブリッジプログラムのことです。内部ではおそらくWebSocket/Cometのような形で通信路を確保することで、クラウドからの逆向きのリクエストを処理できるようになっているのではないかと思います。現在は残念ながらSharePointデータソースのファイル検索にしか対応していない模様ですが、いずれ任意の外部データソースに対してもブリッジしてくれるようになるのではないかと思います。
もしそれが待てないなら、3rd Partyのソリューションを使うという手もあります。DataDirect Cloudは、ファイアーウォール内のOn−Premiseデータベースに接続するブリッジソフトウェアとクラウド上のODataプロキシがセットになったサービスです。Salesforceの外部データソース経由の接続についてはこちらに記事があります。
OData と Apex Connector Framework
もうひとつの課題、現在はODataプロトコルに対応する必要があるという点ですが、こちらについてはODataでなくとも Apex Connector Framework というものを用いれば対応できるとのことです(現在はパイロットプログラムのみ)。しかしながら、Apexですべて賄うのは何かと面倒な上、そもそも外部データソースでは認証プロバイダ経由で自動的にアクセス管理をしてくれるのが良い点なので、そこをカスタムでやらなければいけないのであれば魅力が半減してしまいます。
OData プロキシと freee API
サービスがODataプロトコルが話せないのであれば、強制的に話せるようにしてしまえばいいのでしょう。ここで、Heroku上にOData変換プロキシを設けてやることで、通常のOAuth保護されたREST APIを持つサービスにアクセスできないだろうかと考えました。せっかくなので、連携のニーズの多そうなクラウドベースの会計ソフトであるfreee のAPIを題材にしてみます。
ちなみにfreeeのAPIはこちらに説明があります。OAuth2に対応しています。
認証プロバイダの登録
Salesforceには、認証プロバイダという外部のアイデンティティプロバイダにログインを委ねられる機能があります。FacebookやSalesforceだけでなく、OpenID Connectに対応したプロバイダについても扱えるようになっています。さらにSpring '14からOpenID Connectプロバイダでなくとも、任意のOAuth 2.0プロバイダに対しても接続できるようになりました。こちらに関しては以前書いたこちらの記事をご参照下さい。
freee APIにアクセスする際にも、この認証プロバイダの機能を活用することになります。freeeのAPIコンシューマキー・シークレットの取得は、freeeにログインした上でこちらから登録できます。
外部データソースの設定
認証プロバイダを作成したら、External Data Sourceを登録します。種別は「プラットフォーム接続: OData 2.0」に設定する必要があります。サービスURLには、freeeのAPI Endpointではなく、以降に説明するHeroku上のODataプロキシのURLを指定します。
ID種別としてユーザを選び、認証プロトコルはOAuth、そして認証プロバイダには先ほど作成した「freee」を設定します。
Heroku上のODataプロキシ実装
今回はNode.js+Expressでプロキシを書いています。freee APIの deals (取引(収入/支出)) の情報を取得するだけの、もっとも最小限のプログラムのみを記述することにします。
External Data Sourceでは、接続時に<External Data SourceのサーバURL>/$metadata
に対して、このサービスが持つテーブル情報のメタデータをリクエストしてきますので、埋め込みのXMLを返しています。この中にはDeal
テーブルとそのスキーマ情報が記載されています。
次に<External Data SourceのサーバURL>/Deal
エンドポイントを用意します。こちらでSalesforceからfreeeのOAuthトークン情報を受け取り、その上でfreee APIのdealsリソースの情報をリクエストし、返ってくるJSONを前述のODataスキーマ情報に合わせて変換します。
外部オブジェクトの作成とタブの追加
あとは、External Data Source 内のDealテーブルを表示する外部オブジェクトを作成し、それをタブ化してあげれば大丈夫です。
その結果はこちらです。
...あれれ?
お詫び
理論的にはこれでうまくいくとおもってたんですけど、なんかいろいろできてないみたいです。
もう時間切れですすいません、見積り誤りました。
結果についてはいずれアップデートします。
ソースもちゃんとうまく行ったら公開しますので、勘弁して下さい...
※ このエントリはSalesforce1 Advent Calendar 2014に参加することになっていました。