はじめに
概要
Salesforceには、Salesforce ConnectというSalesforce 外に保存されているデータの表示、検索、変更を可能にするフレームワークがあります。今回は、このSalesforce Connectの機能を使ってMySQLやSQL Databaseといった外部データソースおよび外部オブジェクトとして定義することでRDBMS内のデータにリアルタイムにデータアクセスする方法をご紹介します。これにより、Salesforce外で管理されているRDBMSに格納されている最新の在庫データなどにSalesforceの画面からシームレスに取得することが出来るようになります。
前提として必要なアプリ- サービス
- Salesforceアカウントを取得済であること
- CData API Server ※30日間利用可能な無償評価版あり
- HerokuやAzure App ServiceなどJavaか.NETのWebアプリケーションをホストできる環境
- 上記Webアプリケーションサーバから接続可能なRDBMS(Heroku PostgresやSQL Database)
実現イメージ
Salesforce Connectは、REST APIのOData規格のデータを読み込むことが出来ます。ただし、RDBMS標準ではODataフォーマットのデータを出力できないため、RDBMSをREST APIとしてアクセス出来るようにするCData API Serverを中継することでODataフォーマットでのレスポンスを受け取ることができるようになります。
実際にやってみよう
CData API Serverをインストールおよびローカルマシン環境で確認
まずはじめに、CData API Serverをローカルの環境で試してみるのがよいでしょう。以下の記事に、Windows環境×MySQLの環境ですが、マウス操作だけでRDBMS内のテーブルデータをREST APIとして公開する手順が書かれてますがご参考ください。
(Qiita記事) MySQL のデータをCData API Server でポチポチだけでREST API として公開する
CData API Server を Heroku や Azure App Service へデプロイする
上記手順で一度ローカルで動作確認したCData API Serverを次の手順でクラウド上のWebサーバーにデプロイします。以下CData社のKBにHerokuやAzure App Serviceへデプロイする手順がありますのでご参考ください。
CData API ServerからRDBMSに接続してREST APIとして公開してみる
それでは、Webサーバにアクセスしてみましょう。下記のようなURLでアクセスできます。
Azure App Serviceの場合:https://[your sub domain].azurewebsites.net/
Herokuの場合:https://[your sub domain].herokuapp.com/
admin アカウントで管理コンソールにログインします。
※adminのパスワードについて:Windows版の場合はインストール時に設定、マルチプラットフォーム版(Java版)の場合は、Java ApplicationServer毎に異なるのでこちらの製品マニュアルをご参照ください。
「設定」タブからRDBMSに接続するコネクションを作成します。
※RDBMSとの接続は、内部的には、ADO.NET Providerもしくは、JDBCのインタフェースで接続しているので、DBのポート(Postgresだとデフォルト5432、SQLDatabaseだと1433)で接続する必要がありますので必要に応じてポートの設定をおこなってください。
「リソース」タブを開き、コネクションを選択して、Salesforceの外部オブジェクトとして設定したいデータベースのテーブルを選択します。
「ユーザ」タブに移り、公開するREST APIへのアクセスを許可するユーザを作成します。作成するとパスワードに相当するトークンが発行されます。
「サーバー」タブを開き、「信頼されたIPアドレス」にて、APIServerにアクセス可能なIPアドレスを指定します。「クロスオリジンリソースシェアリング(CORS)を有効にする」をチェックします。
※本例では「信頼されたIPアドレス」に「*」すべてのIPアドレスとしていますが、Salesofrceの外部IPアドレスのみに絞ることが出来ます
「サーバー」タブの下のほうに移動して、ODataのデフォルトフォーマット、および、バージョンを「XML(Atom) 4.0」に設定します。設定したら「変更内容を保存」してください。
以上でCData API Server側の設定は完了です。「API」タブを開くと、左側の「リソース」一覧に追加したリソース名(DBのテーブル名)が追加されます。本リソース名をクリックすると、右側のペインに各HTTPメソッドでのアクセス方法が記載されたAPIリファレンスを見ることができます。
CData API Serverで公開したREST APIのエンドポイントにアクセスしてみる
CData API ServerのアクセスしているブラウザからAPIのエンドポイント(例:https://[your sub domain].azurewebsites.net/api.rsc/SalesLT_Product/)にアクセスすると、認証が通った状態なので認証不要で済なので、HTTP GetメソッドがリクエストされてAtom形式のXMLフォーマットでRDBMS内のデータがレスポンスされていればOKです。
PostmanなどのツールからAPIアクセスする場合には、HTTPヘッダーにx-cdata-authtokenにトークンの値をセットしてください。
Salesforce Connectを使った外部データソースおよび外部オブジェクトの作成
Salsforce にログインし、[設定]→[開発]→[外部システムへの接続を管理する]をクリックします。「外部データソース」画面で「新規外部データソース」ボタンをクリックします。
「外部データソースの編集」画面にて、以下の項目を設定します。
- 外部データソース:CDataAPIServer(任意)
- 名前:CDataAPIServer(任意)
- 種別:Salesforce Connect:OData4.0
- URL:https://[Your Sub domain].azurewebsites.net/api.rsc(左記の例はAzureの場合)
- 形式:JSON
- ID種別:ユーザ
- 認証プロトコル:パスワード認証
- 管理者ユーザ名:CData API Serverで追加したユーザ名
- 管理者パスワード:CData API Serverで追加したユーザのトークン
設定したら「保存」して「検証して同期」ボタンをクリックします。状況が「成功」になり、CData API Serverで公開したAPIエンドポイント(更にたどるとRDBMSのテーブル名)が表示されれば成功です。該当テーブルを選択して「同期」します。
[設定]→[開発]→[外部オブジェクトを管理する]を開くと、外部オブジェクトが追加されていることを確認します。
外部オブジェクトの「編集」ボタンをクリックするとプロパティ値を確認します。
外部オブジェクト名のリンクを開くと外部オブジェクトのメタデータ定義を確認できます。
特に問題なければ、次は、本カスタムオブジェクトにSalesforceのタブからアクセスできるようにカスタムタブを作成します。
[設定]→[作成]→[タブ]を選択して「カスタムオブジェクトタブ」の「新規」ボタンをクリックします。
作成が完了すると
「新規カスタムタブ」画面にて、オブジェクトには、作成したカスタムオブジェクトを選択して、適当なタブスタイルを選択して後はウィザード形式でデフォルト値にてカスタムタブを作成します。
カスタムタブが追加されたことを確認します。
ビューで、「すべてを選択」して「Go!」ボタンをクリックすると下記のような「外部オブジェクト認証エラー 外部システムの認証設定 にある個人設定に外部データソースエントリを追加またはすべて入力します。サポートが必要な場合は、システム管理者にお問い合わせください。」エラーが表示されます。これは、使用しているSalesofrceのアカウントが外部データアクセスする権限がないため表示されます。
(ご参考)Salesforce Connect の設定より
各ユーザの認証設定を行います。ユーザに、自分の個人設定で外部システムの認証を設定、管理する方法を伝えます。または、各ユーザに対してこのタスクを実行することもできます。
[私の設定]→[個人用]→[外部システムの認証設定]から「新規」で認証設定を作成します。
- 外部システム定義:外部データソース
- 外部データソース:作成した外部データソース名
- 外部システム定義:ログインしているSalesforceユーザ
- ユーザ名:CData API Serverで追加したユーザ名
- パスワード:CData API Serverで追加したユーザのトークン
「保存」したら再度、カスタムタブにアクセスして「すべて選択」で「Go!」ボタンをクリックします。今度は、データが表示されるようになりましたが、IDとURLだけのようです。
新たにビューを作成して表示したい項目(最大15個)を選択します。
もう一度作成したビューにアクセスしてみるとRDBMS内のデータ(本例だと、SQLDabase内の製品マスタ)の一覧が表示されるようになりました。
まとめ
Salesforceの画面にアクセス時にRDBMS内のデータを表示することが出来ました。本方式を応用すると、SalesforceにRDBMSだけでなくCData API Serverがサポートする90を超えるクラウトサービスやNoSQLデータベースをOData形式で取り込むことが出来るので、マルチクラウド、オンプレ×クラウド環境に散らばっているデータをSalesforceの画面から透過的に参照できるようになります。CData API Serverは30日間ご利用頂ける評価版がございますのでダウンロードして是非お試しください。
参考にした情報
- CData KnowleadBase : MySQL 外部オブジェクトをSalesforce に設定して利用
- Trailhead : Salesforce Connect の概要、[Salesforce Connect の設定]
(https://trailhead.salesforce.com/ja/modules/lightning_connect/units/lightning_connect_setup)