Help us understand the problem. What is going on with this article?

Salesforce Connectを使って外部のRDBMSからデータを取得して外部オブジェクトとして表示する方法

More than 1 year has passed since last update.

はじめに

概要

Salesforceには、Salesforce ConnectというSalesforce 外に保存されているデータの表示、検索、変更を可能にするフレームワークがあります。今回は、このSalesforce Connectの機能を使ってMySQLやSQL Databaseといった外部データソースおよび外部オブジェクトとして定義することでRDBMS内のデータにリアルタイムにデータアクセスする方法をご紹介します。これにより、Salesforce外で管理されているRDBMSに格納されている最新の在庫データなどにSalesforceの画面からシームレスに取得することが出来るようになります。

前提として必要なアプリ- サービス

実現イメージ

Salesforce Connectは、REST APIのOData規格のデータを読み込むことが出来ます。ただし、RDBMS標準ではODataフォーマットのデータを出力できないため、RDBMSをREST APIとしてアクセス出来るようにするCData API Serverを中継することでODataフォーマットでのレスポンスを受け取ることができるようになります。
image.png

実際にやってみよう

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 アカウントで管理コンソールにログインします。
image.png
※adminのパスワードについて:Windows版の場合はインストール時に設定、マルチプラットフォーム版(Java版)の場合は、Java ApplicationServer毎に異なるのでこちらの製品マニュアルをご参照ください。

「設定」タブからRDBMSに接続するコネクションを作成します。
image.png
※RDBMSとの接続は、内部的には、ADO.NET Providerもしくは、JDBCのインタフェースで接続しているので、DBのポート(Postgresだとデフォルト5432、SQLDatabaseだと1433)で接続する必要がありますので必要に応じてポートの設定をおこなってください。

「リソース」タブを開き、コネクションを選択して、Salesforceの外部オブジェクトとして設定したいデータベースのテーブルを選択します。
image.png
「ユーザ」タブに移り、公開するREST APIへのアクセスを許可するユーザを作成します。作成するとパスワードに相当するトークンが発行されます。
image.png

「サーバー」タブを開き、「信頼されたIPアドレス」にて、APIServerにアクセス可能なIPアドレスを指定します。「クロスオリジンリソースシェアリング(CORS)を有効にする」をチェックします。
image.png
※本例では「信頼されたIPアドレス」に「*」すべてのIPアドレスとしていますが、Salesofrceの外部IPアドレスのみに絞ることが出来ます
「サーバー」タブの下のほうに移動して、ODataのデフォルトフォーマット、および、バージョンを「XML(Atom) 4.0」に設定します。設定したら「変更内容を保存」してください。
image.png

以上でCData API Server側の設定は完了です。「API」タブを開くと、左側の「リソース」一覧に追加したリソース名(DBのテーブル名)が追加されます。本リソース名をクリックすると、右側のペインに各HTTPメソッドでのアクセス方法が記載されたAPIリファレンスを見ることができます。
image.png

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です。
image.png

PostmanなどのツールからAPIアクセスする場合には、HTTPヘッダーにx-cdata-authtokenにトークンの値をセットしてください。
image.png

Salesforce Connectを使った外部データソースおよび外部オブジェクトの作成

Salsforce にログインし、[設定]→[開発]→[外部システムへの接続を管理する]をクリックします。「外部データソース」画面で「新規外部データソース」ボタンをクリックします。
「外部データソースの編集」画面にて、以下の項目を設定します。
image.png

  • 外部データソース: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のテーブル名)が表示されれば成功です。該当テーブルを選択して「同期」します。
image.png

[設定]→[開発]→[外部オブジェクトを管理する]を開くと、外部オブジェクトが追加されていることを確認します。
image.png

外部オブジェクトの「編集」ボタンをクリックするとプロパティ値を確認します。
image.png
外部オブジェクト名のリンクを開くと外部オブジェクトのメタデータ定義を確認できます。
image.png
特に問題なければ、次は、本カスタムオブジェクトにSalesforceのタブからアクセスできるようにカスタムタブを作成します。
[設定]→[作成]→[タブ]を選択して「カスタムオブジェクトタブ」の「新規」ボタンをクリックします。
image.png
作成が完了すると
「新規カスタムタブ」画面にて、オブジェクトには、作成したカスタムオブジェクトを選択して、適当なタブスタイルを選択して後はウィザード形式でデフォルト値にてカスタムタブを作成します。
image.png
カスタムタブが追加されたことを確認します。
image.png
ビューで、「すべてを選択」して「Go!」ボタンをクリックすると下記のような「外部オブジェクト認証エラー 外部システムの認証設定 にある個人設定に外部データソースエントリを追加またはすべて入力します。サポートが必要な場合は、システム管理者にお問い合わせください。」エラーが表示されます。これは、使用しているSalesofrceのアカウントが外部データアクセスする権限がないため表示されます。
image.png
(ご参考)Salesforce Connect の設定より
各ユーザの認証設定を行います。ユーザに、自分の個人設定で外部システムの認証を設定、管理する方法を伝えます。または、各ユーザに対してこのタスクを実行することもできます。

[私の設定]→[個人用]→[外部システムの認証設定]から「新規」で認証設定を作成します。
image.png

  • 外部システム定義:外部データソース
  • 外部データソース:作成した外部データソース名
  • 外部システム定義:ログインしているSalesforceユーザ
  • ユーザ名:CData API Serverで追加したユーザ名
  • パスワード:CData API Serverで追加したユーザのトークン

「保存」したら再度、カスタムタブにアクセスして「すべて選択」で「Go!」ボタンをクリックします。今度は、データが表示されるようになりましたが、IDとURLだけのようです。
image.png

新たにビューを作成して表示したい項目(最大15個)を選択します。
image.png
もう一度作成したビューにアクセスしてみるとRDBMS内のデータ(本例だと、SQLDabase内の製品マスタ)の一覧が表示されるようになりました。
image.png

まとめ

Salesforceの画面にアクセス時にRDBMS内のデータを表示することが出来ました。本方式を応用すると、SalesforceにRDBMSだけでなくCData API Serverがサポートする90を超えるクラウトサービスやNoSQLデータベースをOData形式で取り込むことが出来るので、マルチクラウド、オンプレ×クラウド環境に散らばっているデータをSalesforceの画面から透過的に参照できるようになります。CData API Serverは30日間ご利用頂ける評価版がございますのでダウンロードして是非お試しください。

参考にした情報

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away