CData Software Blog

クラウド連携のCData Software の技術ブログです。

SaaS BPM クエステトラのマスタデータをMySQLと同期:CData API Server連携

f:id:sugimomoto:20200921161929p:plain

こんにちは。CData Software Japanリードエンジニアの杉本です。

今回はクラウドベースのBPMエステトラとCData API Serverを組み合わせて、クエステトラの選択肢マスタを同期させる方法を紹介したいと思います。

エステトラ(Questetra BPM Suite)とは?

クラウドベースの業務プロセス管理システム (SaaS BPMS) です。

https://questetra.com/ja/

f:id:sugimomoto:20200921161854p:plain

以下のような業務フロー図を描くように様々な業務アプリをローコードで作成できるのが特徴です。

f:id:sugimomoto:20200921161902p:plain

また、外部連携用のAPIが公開されていたり

f:id:sugimomoto:20200921161907p:plain

ワークフローの中で外部APIを呼び出す機能が搭載されていたりと、外部のサービス・アプリケーションと連携を柔軟に実現できる仕組みが提供されています。

ja.workflow-sample.net

実現するシナリオ

今回はクエステトラに備わっている外部APIとの連携機能を使って、MySQL(ローカル)に格納されているマスタデータをクエステトラのマスタデータ(選択肢マスタ)と同期させる方法を紹介したいと思います。

f:id:sugimomoto:20200921161916p:plain

エステトラはアプリ内部で独自に選択肢や選択肢マスタを持つことができますが、おそらく皆さんの環境ではローカルのRDBCSVデータ、SalesforceやKintoneなどに最新の顧客マスタや商品マスタが管理されているのではないでしょうか。

そんな時にこのマスタ連携を実現することで、複数のマスタ管理の手間を削減することができます。

実現方法

まず前提として、クエステトラはWeb APIをリクエストする機能は存在するものの、RDBに直接接続できるわけではありません。

そのため、RDBのデータを扱うためには、まずRDBと接続されたWeb APIのインターフェースを開発・用意して、クエステトラがアクセスできるパブリックなネットワークにエンドポイントを公開する必要があります。

今回はそのボトルネックを CData API Serverを使って解消します。

https://www.cdata.com/jp/apiserver/

f:id:sugimomoto:20200921161923p:plain

CData API Server を使うことで、プログラミングの必要なく、RDBやNoSQLなどのインターフェースからAPIを自動生成することが可能です。

また、CData API Server はCloud Gatewayという機能を使って、クラウド上のSSHサーバーを土台にしてインターネット上にAPIを公開することができます。これにより、オンプレミス上でFirewall を調整したり、DMZに配置するといったことを気にする必要がありません。

f:id:sugimomoto:20200921161929p:plain

これらの機能でオンプレミスのMySQL からAPIを公開し、クエステトラのAPIリクエスト機能を使ってデータを取得、マスタデータを更新するアプリを実現します。

f:id:sugimomoto:20200921161936p:plain

手順

それでは実際の手順を紹介していきます。

必要なもの

API Server・クラウドゲートウェイの環境構築

まず、CData API Serverをダウンロードし、MySQLがインストールされているサーバーでセットアップします。

以下のURLからWindow版をインストールしてください。

https://www.cdata.com/jp/apiserver/download/

f:id:sugimomoto:20200921161955p:plain

また、クラウドゲートウェイも構成していきますが、詳しくは以下の記事を参照してみてください。

https://www.cdatablog.jp/entry/apiservercloudgateway

最終的にAWS EC2のURLから CData API Serverの画面にアクセスできればOKです。

f:id:sugimomoto:20200921162001p:plain

なお、対象のRDBやデータがクラウド上に存在する場合は、AWS EC2にそのままAPI Serverを構成するのもOKです。

MySQLの接続の追加

続いて、API Server でMySQLに接続されたAPIを構成していきます。

CData API Server にログインし「設定」→「接続」の画面に移動し、データソース一覧の中から「MySQL」を選択します。

f:id:sugimomoto:20200417223617p:plain

あらかじめ設定したLocalhost MySQLの接続情報を入力し、テスト接続で接続状況を確認した上で、設定を保存しましょう。

f:id:sugimomoto:20200417223655p:plain

次にリソースを追加するために「設定」→「リソース」へ移動し、「リソースを追加」をクリックします。

f:id:sugimomoto:20200417223724p:plain

接続先の一覧から先程登録したMySQL接続を選択すると

f:id:sugimomoto:20200417223753p:plain

対象のテーブル一覧が出てきます。ここから任意のテーブルを選択してリソースとして定義します。

f:id:sugimomoto:20200417223817p:plain

ここでポイントです。今回は選択肢マスタとして扱う関係上、予め対象項目を絞り込んでおきます。

f:id:sugimomoto:20200921161916p:plain

選択肢IDになるカラムを「Id」、表示ラベルになるカラムを「Label」としてエイリアスを定義しておきます。

また、利用できる操作はデータの取得のみのため、「GET」だけ指定しました。

f:id:sugimomoto:20200921162010p:plain

APIページに移動すると、テーブルリソースが追加され、API Reference を確認できます。

f:id:sugimomoto:20200921162017p:plain

実際にエンドポイントにアクセスしてみると、GETリクエストが実行されて、データを取得できました。

f:id:sugimomoto:20200921162059p:plain

最後にAPIアクセス用のユーザーを作成し、準備は完了です。

f:id:sugimomoto:20200921162105p:plain

エステトラでアプリを作る

API Server 側の準備が整ったので、クエステトラ側でマスタデータを同期するアプリを作成していきましょう。

最終的には以下のようなワークフローのアプリを作成します。

f:id:sugimomoto:20200921162112p:plain

アプリの作成にあたっては、以下のクエステトラさんのBlogを参考にしました。

support.questetra.com

また、私が作成したアプリのテンプレートは以下のURLで公開しています。

CData API Server MySQLマスタ連携_ver_editing.qar

まずアプリ管理画面に移動して「アプリ新規作成」をクリックし

f:id:sugimomoto:20200921162135p:plain

任意の名称でアプリを作成します。

f:id:sugimomoto:20200921162141p:plain

続いてAPIから取得したデータや最終的にマスタデータとして登録するための箱となるデータ項目を以下のように作成します。

項目名 フィールド名 データタイプ フォームタイプ
正常応答 q_string0 文字 複数行
エラー q_string1 文字 複数行
ID一覧 q_string2 文字 複数行
ラベル一覧 q_string3 文字 複数行
選択肢マスタデータ q_select4 選択 ラジオボタン

f:id:sugimomoto:20200921162148p:plain

ポイントは選択肢マスタデータの元になる項目です。

データタイプ「選択」で作成し、選択肢種別を「文字列データ項目」にした後、IDとラベルを別途作成しておいた項目と紐付けます。

これがマスタデータとして登録する際の元の項目として利用できます。

f:id:sugimomoto:20200921162226p:plain

次にフローを作成していきましょう。

フローは以下のように構成します。ポイントは赤枠で示している3点です。

f:id:sugimomoto:20200921162242p:plain

10. メッセージ送信中間イベント (HTTP):APIに接続

一番最初にAPI Serverからデータを取得するための「10. メッセージ送信中間イベント (HTTP)」を構成します。

f:id:sugimomoto:20200921162250p:plain

アクセスURLにはEC2で公開したAPI ServerのURLをベースとしたMySQLのマスタデータを取得するリソースを指定します。

GETリクエストで、正常レスポンスとエラーレスポンスをそれぞれ予め作成しておいたデータ項目に紐付けましょう。

f:id:sugimomoto:20200921162257p:plain

ヘッダには認証方法としてBasic認証を指定します。こちらもAPI Serverであらかじめ作成したユーザーのID・PWを指定します。

f:id:sugimomoto:20200921162306p:plain

16: スクリプトタスク:応答の解析

次にスクリプトタスクを使って、取得したJSONデータをアプリのデータ項目に格納する処理を記述します。

f:id:sugimomoto:20200921162311p:plain

以下のようなJavaScriptベースのコードを利用できます。ここでは予め定義しておいた「ID一覧」と「ラベル一覧」の項目それぞれに改行区切り(\n)で値を格納していくという処理になっています。

今回はAPIのレスポンス構造をAPI Server側で定義してしまっているので、そのままコピーアンドペーストで使用できます。

f:id:sugimomoto:20200921162317p:plain

var text = engine.findDataByNumber("0");
var result = JSON.parse(text); // JSON 解析

var ids = "";
var labels = "";
for (var i = 0; i < result.value.length; i++) {
  var record = result.value[i];
  ids += record.Id + "\n"; // ID 取得
  labels += record.Label + "\n"; // Label 取得
}

engine.setDataByNumber("2", ids);
engine.setDataByNumber("3", labels);

もしラベルなどを調整したい場合は、スクリプトを調整してください。

2: サービスタスク (選択肢マスタ更新):マスタ更新

最後に選択肢マスタを更新するイベントを配置します。選択肢マスタの更新は「2: サービスタスク (選択肢マスタ更新)」で実行できます。

f:id:sugimomoto:20200921162324p:plain

元データとなる項目は予め定義しておいた「選択肢マスタデータ」の項目です。この項目は先程のスクリプトでデータを格納した「ID一覧」と「ラベル一覧」を参照する形で構成されています。

あとは作成する選択肢マスタの名前を指定すればOKです。

f:id:sugimomoto:20200921162329p:plain

実行してみる

それでは、実際にアプリを動かしてみましょう。

アプリの管理画面から「プロセスのデバック実行」をクリックすることで、実際に動かしてみることができます。

f:id:sugimomoto:20200921162359p:plain

一番最初は確認プロセスなので、そのまま処理を進めます。

f:id:sugimomoto:20200921162405p:plain

処理を進めて、状態が取得結果確認のプロセスになったら、取得結果を確認してみましょう。

f:id:sugimomoto:20200921162415p:plain

以下のように値が格納できていることが確認できます。

f:id:sugimomoto:20200921163510p:plain

最後まで正常に完了したら、アプリ共有アドオンの選択肢マスタが作成されているか確認します。

f:id:sugimomoto:20200921162425p:plain

データを見てみると、正常にMySQLからデータが取り込めていることが確認できました!

f:id:sugimomoto:20200921162432p:plain

f:id:sugimomoto:20200921162437p:plain

おわりに

このようにAPI ServerでAPIを公開することで、クラウドサービスから既存のRDBなどがとても使いやすくなります。

今回はMySQLを対象にしましたが、PostgreSQLSQL ServerOracleといったデータソースにも対応できます。

https://www.cdata.com/jp/apiserver/#databases

f:id:sugimomoto:20200429135116p:plain

また、SalesforceSharePointなどのクラウドサービスも、部分的にAPI Server経由でAPI公開することができ、通常は複雑なAPIリクエストが必要なクラウドサービスにも手軽にAPIアクセスできるようになります。

f:id:sugimomoto:20200429135126p:plain

ぜひ、いろんなシチュエーションで試してみてください。