Salesforce Connectの外部オブジェクトからCData API Serverを利用して自社データベースに接続

by 桑島義行 | 2023年07月28日

2

はじめに

Salesforceには外部ソースのデータをSalesforceにデータをコピーすることなく、Salesforce アプリケーションや外部オブジェクトにリアルタイム統合するSalesforce Connectという機能があります。本記事ではSalesforce Connectの外部オブジェクトからCData API Serverを利用することで自社データベース内のデータに接続する方法をご紹介します。

本記事で実現する内容

本記事では、Salesforceの外部オブジェクトとしてSalesforceの画面からAWSのデータベースサービスRDS(MySQL)内のデータにアクセスする方法をご説明します。

Salesforce Connectは外部データソースの種類としてODataが選択できますので、AWSのEC2上に設置したCData API ServerにてMySQLのデータをODataアクセス可能とすることで、Salesforceの外部オブジェクトからCData API Server経由でMySQLのデータにアクセスできるようになります。

1

なお、弊社ではフルマネージドサービスで提供するCData Connect Cloudも提供しております。CData Connect Cloudを利用した同様の手順についてはこちらの記事をご参照ください。

前提となる製品・サービス

  • Salesforce(Salesforce Connectの契約、もしくは、開発者アカウント)
  • CData API Server(30日の無償評価版あり)
  • Amazon RDS for MySQL(以下、MySQL)
  • Amazon EC2(Amazon Linuxを利用。java11以上が必要)
  • Amazon Route 53(ドメイン取得に利用)
  • Let's Encrypt(証明書取得に利用)

手順

 CData API Serverの入手

こちらのページよりCData API Serverをダウンロードします。今回はAmazon Linux上に構築するためCross-Platform版を選択しました。ダウンロードするとCDataAPIServer.zipファイルを入手することができます。

Amazon Linux上でのCData API Serverの構築

以下のステップでAmazon Linux上にCData API Serverを配置してサービスを起動します。

  • EC2上のAmazon LinuxにSSH接続
  • /opt配下にcdataというディレクトリを作成
  • 作成したcdataディレクトリに上記ダウンロードしたCDataAPIServer.zipファイルをwgetコマンドなどで配置
  • 「unzip CDataAPIServer.zip」コマンドでファイルを解凍
  • 「java -jar apiserver.jar」コマンドでCData API Serverを起動

CData API Serverの管理コンソールへのアクセス

上記Amazon LinuxがインストールされているEC2のセキュリティグループでインバウンド8080ポートをブラウザでアクセスするマシンからのアクセスを許可します。

ブラウザでアクセスするマシンから「http:[EC2の外部IPアドレス]:8080」にアクセスして以下のようなCData API Serverのログイン画面が表示されれば成功です。

一度、「java -jar apiserver.jar -stop」コマンドでCData API Serverのマシンを停止します。

CData API ServerのSSL/TLS化

Salesforce Connectを利用したOData接続ではHTTPS(SSL/TLS)が必須となります。そのため、CData API Serverの生成するODataエンドポイントに対してHTTPSでアクセス可能とするためにSSL/TLS化の設定を行います。

本手順で使用するドメインはAWSのRoute53、サーバー証明書についてはLet's Encryptを使用して作成しました。本手順ではドメイン、および、サーバ証明書の取得については割愛します。

Route53のHosted ZoneにRecordを追加

AWS管理コンソール上でドメインを取得したAWS Route 53のHosted ZoneにRecordを追加します。
  • Record name : 例 connect.cdatajp.net
  • Record type : A
  • Value : EC2の外部IPアドレス

IAMロールの作成

AWS管理コンソール上で任意の名称のIAMロールを作成してPolicyを追加します。リソースのHosted Zone(xxxxxxx部分)については特定のホストゾーンIDをセットします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "route53:GetChange",
                "route53:ChangeResourceRecordSets",
                "route53:ListResourceRecordSets"
            ],
            "Resource": [
                "arn:aws:route53:::hostedzone/xxxxxxx",
                "arn:aws:route53:::change/*"
            ]
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "route53:ListHostedZonesByName",
            "Resource": "*"
        }
    ]
}

作成したIAMロールはCData API ServerのEC2マシンに紐つけます。

CData API Serverの設定ファイルの変更

Let's Encyptで作成されたcrtファイル、およびkeyファイルを使用してOpenSSLの「openssl pkcs12 -export -out cdataconnect.pfx -inkey private.key -in certificate.crt」コマンドでpfxファイルを作成してAmazon LinuxのEC2マシンの任意の場所にセットします。次にCData API Serverで上記サーバー証明書を読み込むための設定を行います。CData API Serverを配置したパス(本例では /opt/cdata/webapp)に移動してapiserver.xmlを開きます。

以下エレメントを探します。

<New id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">

上記Newエレメント配下に以下エレメントを追加します。

<Arg name="sslContextFactory">
  <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
    <Set name="KeyStorePath"><SystemProperty name="apiserver.home" default="."/>mycertificate.pfx</Set>
    <Set name="KeyStorePassword">mypassword</Set>
    <Set name="KeyStoreType">PKCS12</Set>
  </New>
</Arg>
以下のラインを変更します。
  • mycertificate.pfx: "/opt/cdata/cdataconnect.pfx"
  • mypassword: "pfxファイルのパスワード"

SSL/TLS の有効化の詳細はこちらの製品ヘルプをご参照ください。
なお、CData API Serverの管理者ユーザ、および、パスワードは初期値がadmin/adminに設定されています。変更方法は製品ヘルプのこちらの章をご参照ください。

apiserver.xmlファイルを保存したら、再度、「java -jar apiserver.jar」コマンドでCData API Serverを起動します。

上記Amazon LinuxがインストールされているEC2のセキュリティグループでインバウンド443ポートをブラウザでアクセスするマシンからのアクセスを許可します。

ブラウザでアクセスするマシンから「https:ドメイン名」にアクセスして以下のようなCData API Serverのログイン画面が表示されれば成功です。

ブラウザの証明書ビューア(Edgeの場合)でLet's Encryptで発行した証明書であることを確認します。

これでCData API ServerのSSL/TLS化は完了です。

CData API Serverを利用したAPIエンドポイントの作成

管理コンソールへのログイン、および、ライセンスアクティベーション

ログイン画面でユーザ(admin)/ パスワード(初期値:admin)でサインインします。

ステータス画面が開き、ライセンスエラーの赤いメッセージボックスが表示されるので情報タブに移動します。既に製品ライセンスをお持ちの場合は「新しいライセンスをインストール」、評価版でのご利用の場合は「30日の評価版ライセンスをアクティベート」ボタンをクリックしてライセンスの認証を行ってください。

プロキシサーバの設置などでCDataのライセンスサーバーにアクセスできない場合はオフラインでのアクティベーションも可能です。 その場合はこちらよりお問い合わせください。

プロダクトキーの欄にキー値、もしくは、評価版の残り日数が表示されれば成功です。

MySQLへの接続設定

設定 > 接続タブを開き、「+接続を追加...」ボタンをクリックします。

Databaseカテゴリー内のMySQLを選択します。

MySQLへの接続に必要な以下の情報をセットして接続テストを行います。

  • Name : 任意(本例ではデフォルトのMySQL1)
  • Server : MySQLのサーバ名、もしくはIPアドレス(RDSの場合はEndpoint)
  • Port:MySQLへの接続ポート(デフォルト:3306)
  • User: MySQLへの接続ユーザ
  • Password : MySQLへの接続ユーザのパスワード
  • Database : 接続するMySQLのDatabas

「接続に成功しました。」メッセージが表示されればCData API ServerからMySQLへの接続は成功です。「変更を保存」ボタンをクリックして設定を保存してください。

APIエンドポイントの作成

Salesforceの外部オブジェクトとして参照したいMySQL内のテーブルを選択してAPIエンドポイントとして公開します。

設定 > リソース タブを開き「リソースを追加...」ボタンをクリックします。

リソースを追加のダイアログが開くのでMySQLへのデータ接続を選択して次に進みます。

MySQL内のテーブル一覧が表示されます。Salesforceの外部オブジェクトとしてアクセスするMySQL内のテーブルを選択します。本例ではMySQLのサンプルデータベースsakila内のcustomerテーブルを選択しました。

選択したテーブル内のフィールドリストが表示されます。公開するAPIエンドポイント毎にOperations(GET/POST/PUT/DELETE)の範囲とフィールドを指定することが可能です。本手順ではOperationsをGET(参照のみ)のみに指定して全フィールド公開する設定で保存します。

Tablesに上記手順で追加したMySQLのテーブルが追加されたことを確認します。

API タブを開くとAPIリファレンスの画面が表示されます。左側のTables内のリンク(例:/api.rsc/sakila_customer)をクリックします。

 MySQL内のテーブル(本例ではcustomer)にアクセス可能なAPIエンドポイントのドキュメントが開きます。GETメソッドでのAPIへのリクエストの方法などが記載されています。GETメソッドの場合はブラウザでもAPIリクエスト可能ですのでURLリンク(本例では api.rsc/sakila_customer/)をクリックしてみましょう。

別タブでMySQLの指定したテーブルのデータがJSON形式のレスポンスで取得できることを確認できれば成功です。

次に本APIにアクセスするための認証情報を作成します。設定 > ユーザー タブを開き、「+追加」ボタンをクリックします。

Userに任意の名称(本例ではSalesforceConnect)をセットします。

作成したユーザが追加されたことを確認します。

作成したユーザを開きます。認証トークンが表示されるので後の手順で利用するので手元に控えております。

上記手順でCData API Serverを利用したAPIエンドポイントの作成は完了です。

Salesforceの外部オブジェクトの作成

画面をCData API Serverの管理コンソールからSalesforceに切り替えます。設定を開き、クイック検索から「外部」と入力して「外部データソース」を選択します。新規外部データソースボタンをクリックします。

外部データソース画面が開くので以下のプロパティ値をセットします。

  • 外部データソース:任意(本例では MySQL_Customer)
  • 名前:任意(本例では MySQL_Customer)
  • 種別:Salesforce Connect:OData 4.0
  • URL: https://[ドメイン名]/api.rsc
  • ID種別:ユーザ
  • 認証プロトコル:パスワード認証
  • 管理者ユーザ名:CData API Server側で作成したユーザ
  • 管理者パスワード:CData API Server側で作成したユーザの認証トークン

設定値の確認画面が表示されるので「検証して同期」ボタンをクリックします。

外部オブジェクトとして定義するCData API Serverが生成したAPIエンドポイントのリストが表示されるので選択にチェックを入れて同期ボタンをクリックします。

外部データソースの画面に戻り、下の方にスクロールして外部オブジェクトが追加されていることを確認します。

外部オブジェクトのデータをリスト表示するためのタブを作成します。設定のクイック検索で「タブ」と入力して「タブ」を開きカスタムオブジェクトタブの「新規」ボタンをクリックします。

新規カスタムタブの画面が開きます。オブジェクトには上記手順で作成した外部オブジェクト(本例では、MySQL1_customer)を選択、タブスタイルは任意のものを選択して次へ進みます。

ステップ2. プロファイルに追加、ステップ3. カスタムアプリケーションに追加についてはデフォルトのままで保存します。カスタムオブジェクトタブが追加されたことを確認します。

Salesforceの任意のアプリケーション(本例ではサービス)を開きます。タブに先の手順で追加したカスタムオブジェクトタブ(本例ではMySQL_customer)が追加されていることを確認して開きます。

リストビューの表示を「最近参照したデータ」から「すべて選択」に切り替えます。

以下のエラーメッセージが表示されます。

EXTERNAL_OBJECT_AUTHENTICATION_EXCEPTION: このレコードを表示するには、ここで個人設定内の外部データソースのログイン情報を入力してください: https://cdatajapantest-dev-ed.my.salesforce.com/lightning/settings/personal/ExternalObjectUserSettings/home。または、Salesforce システム管理者にお問い合わせください。

上記エラーメッセージ内のリンクをクリックすると「私の個人情報 > 外部システムの認証設定」画面が開きます。新規ボタンをクリックします。

以下のプロパティ値をセットして保存します。

  • 外部システム定義:外部データソース
  • 外部データソース:作成済みの外部データソース(本例ではMySQL _Customer)
  • ユーザ:Salesforceのログイン
  • 認証プロトコル:パスワード認証
  • ユーザ名:CData API Server側で作成したユーザ
  • パスワード:CData API Server側で作成したユーザのパスワード

外部システムの認証設定が追加されたことを確認します。

再度、カスタムオブジェクトタブ(本例ではMySQL_customer)を開き、リストビューの表示を「最近参照したデータ」から「すべて選択」に切り替えます。レコードデータが表示されれば成功です。

デフォルトでは外部IDと表示URLがフィールドとして表示されますので表示項目を変更するためリストビューコントロールから「表示する項目を選択」をクリックします。

表示する項目を参照可能項目にセットして保存します。

タブ内にMySQLのテーブルデータが表示されれば成功です。これでSalesforceの画面からMySQLデータへの接続ができるようになりました。

まとめ

本手順では、Salesforce Connectの外部オブジェクトからCData API Serverを利用してMySQLのデータに接続する手順をご紹介しました。CData API ServerはMySQLだけではなく、RDBMSは勿論、NoSQLやアプリケーションなど200種類を超えるデータソースに対応しています。CData API Serverは30日の無償トライアルがございますので是非、実機にてお

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。