
CData API Serverを使用してPEPからMySQLデータを検索するシナリオを作成
この記事では、PEPのパートナーであるCData Software Japan 合同会社のリードエンジニア杉本和也氏(@sugimomoto)による、CData社のAPI Serverを使用してPEPからMySQLデータを検索する連携事例についてご紹介させていただきます。
【以下杉本氏による解説です。】
こんにちは。CData Software Japanリードエンジニアの杉本です。
今回はPEPというAIアシスタント型iPaaSとCData API Serverを組み合わせたAPI連携方法を紹介したいと思います。
PEPでのAPIノードを活用した連携について
PEPでは以下のような作成画面でAIアシスタント、いわゆるチャットボットを構成することができ、
また、APIノード(コネクタ機能)によって、各種クラウドサービスと連携させることができます。
今回やってみたこと
CData では、各種RDBやNoSQLから自動的にREST Ful API を生成することができる、CData API Server という製品を提供しています。
https://www.cdata.com/jp/apiserver/
通常、RDBをクラウドサービスからコールしたい場合は、インターフェースとなるAPIをフルスクラッチで作成する必要がありますが、API Serverを利用することで簡単にRDBに接続できるAPIを生成することが可能です。
これにより、既存のRDBや基幹システムのバックエンドとPEPを手軽に組み合わせてAIアシスタントを構成することができます。
今回はMySQL のサンプルデータベースとして有名なsakila(レンタルビデオの管理DB)のFilmテーブルを題材として、タイトルや主演での検索および在庫店舗の特定を行うためのAIアシスタント作成をPEPを通じて構成してみました。
手順
それでは実際の手順を紹介します。
API Server の環境構成
今回は AWS EC2にAPI Server を構成しました。内部でMySQL(MariaDB)を構成し、接続しています。
構成手順は以下を参考にしてみてください。
PEPがクラウドサービスのため、API ServerはクラウドホスティングもしくはオンプレミスのDMZなどに配置して、PEPがアクセスできるように構成する必要があります。
API Server にはデフォルトでCloud Gatewayの機能も提供されているので、もしオンプレミスに配置する場合はこちらを使ってみてください。
対象のエンドポイントを追加する
API Server 構成後、今回利用するエンドポイントを新しく追加します。
「設定」→「リソース」タブに移動し「新しいリソースを追加」をクリックします。
予め作成しておいた「MySQL」のコネクションを選択して、次へ移動し、
「film_list」「inventory」「store」等を追加します。
下記のようにリソースが追加されていればOKです。
あとは接続の時に利用するユーザーも登録しておきます。生成されたトークンを後で利用するので、控えておきましょう。
構成されたAPIエンドポイントを確認してみます。「API」タブに移動すると、追加したリソースが表示されています。ここでリクエスト方法などを確認できます。
試しにURLをクリックしてみると、以下のようなJSONを取得できました。
PEPでシナリオを作成
次にPEP側を構成していきます。
PEP側では予めSlack用のアプリケーションを構成しておきました。ここにAPI Server をコールするAIアシスタントのシナリオを追加していきます。
「会話編集」→「シナリオ」に移動し、新しいシナリオを作成します。
シナリオ名は「フィルム検索シナリオ」としました。条件はSlack Homeを選択しています。
「新規作成」ボタンをクリックすると、以下のようなシナリオエディタ画面に移動します。これでシナリオを作成する準備ができました。
API 接続箇所の設定方法
それでは、具体的にAPI連携を含めたシナリオを作っていきます。
まず最初に検索したい文字列を受け取るための対話ノードを配置して、以下のように構成します。
ポイントは分岐条件で「以下のすべての会話」、発言内容の記憶で「film_name」として、会話した内容を変数に保存することです。
対話ノードを配置したら、APIノードを追加して、対話ノードから接続していきます。
APIノードでは、以下のように CData API Serverへのリクエストを構成します。
ポイントは2つです。CData API Server は Filter機能によって、取得するデータを絞り込むことができます。その指定が「$filter=contains(title,'{{ state.scenario_4.form.film_name }}')」の部分です。
「{{ state.scenario_4.form.film_name }}」は直前の対話ノードで設定した変数をパラメータとしてワタシています。「scenario_4」はPEPのシナリオIDですので、作成したシナリオに合わせて変更してください。
また、HTTPヘッダーにAPI Serverのユーザートークンを指定します。
- API名:film_search
- URL:http://apiserverurl/api.rsc/film_list?$filter=contains(title,'{{ state.scenario_4.form.film_name }}')
- HTTPメソッド:GET
- Content-Type:JSON
- HTTPヘッダー:キー「x-cdata-authtoken」、値「予め取得したAPI Serverのトークンを指定」
これで保存すると、APIノードが使えるようになります。
取得したレスポンスの表示方法
最後に後続の対話ノードを構成し、取得した検索結果を表示します。
対話ノードの応答文には、以下のような文章を埋め込みます。
ここでポイントになるのは、API Serverから受け取るJSONのレスポンスの分解方法です。
API Server のレスポンスはオブジェクト直下にvalueという配列要素があり、このレスポンスは「{{state.scenario_4.api_response.film_search.value}}」の形でアクセスできます。
設定イメージ:state.シナリオID.api_response.APIノード名.value
これを「FOR」での繰り返し処理で取得して、文章として表示する仕組みになっています。
動作イメージ
実際にできあがったものをSlackから動かしてみました。
シンプルですが、MySQL→API Server →PEP経由でデータを取得して表示していることがわかるかと思います。
これにInventoryやStoreを加えることで、在庫店舗の確認や貸出中ステータスのような確認もPEPで実現できそうです。
おわりに
このようにAPI ServerでAPIを公開することで、iPaaSから既存のRDBなどがとても使いやすくなります。
今回はMySQLを対象にしましたが、PostgreSQLやSQL Server、Oracleといったデータソースにも対応できます。
詳細はCDataの公式サイトをご確認ください。
また、SalesforceやSharePointなどのクラウドサービスも、部分的にAPI Server経由でAPI公開することができ、通常は複雑なAPIリクエストが必要なクラウドサービスにも手軽にAPIアクセスできるようになります。
ぜひ、いろんなシチュエーションで試してみてください。