Blog

DreamFactoryを使って複数のデータベースにまたがるREST APIを超簡単に構築してみた

スティールパンというドラム缶を加工したトリニダード・トバゴの打楽器を趣味にしています、基幹システムグループの西原です。 DreamFactoryというオープンソースソフトウェアを使って複数のデータベースからデータを取得するREST APIをローカルのDocker環境に構築してみたいと思います。

DreamFactoryとは

公式サイト: https://www.dreamfactory.com/ DreamFactoryとは bitnami が提供するAPIを簡単に生成、管理できるオープンソースのソフトウェアです。 データソースには各種リレーショナル・データベースのほか、ローカルファイルやWebDAVなどを使うことができます。 無料のApacheライセンス版と有料の商用ライセンス版がありますが、今回はApacheライセンス版を使っていきます。

Docker環境を構築する

dockerhub の bitnami のページに docker-compose.yml を使った構築方法があるのでこれを使っていきます。 まずは手順に従って docker-compose.yml を取得します。 取得した docker-compose.yml の中身は以下のようになっています。

PostgreSQLのコンテナを2つ追加する。

今回、複数のDBにまたがるREST APIを構築するということで、PostgreSQLのコンテナを2つ用意します。DreamFactoryが参照する先のデータベースについては、顧客情報を管理するデータベースと顧客の利用料金を管理するデータベースで別々になっていることを想定しています。 前者を customerdb、後者を billdb とし、先程の docker-compose.yml に以下を追記します。 また、それぞれの PostgreSQL の初期セットアップ用スクリプトを配置します。

customerdb 初期セットアップ用スクリプト

init.db.customerdb/init_customerdb.sh として以下を配置します。

billdb 初期セットアップ用スクリプト

同じようにinitdb.d.billdb/init_billdb.sh を配置します。 この状態でコンテナを立ち上げます。 Windows環境だとコンテナがうまく立ち上がらなかったり、起動スクリプトが動かないケースがありました。 各サービスのvolumes で指定しているローカルディレクトリの前に ./ を付けてあげることでうまくいきました。

DreamFactoryのアカウントをセットアップする

http://localhost にアクセスして以下の画面が表示されればOKです。(コンテナ立ち上げてから画面が表示できるようになるまで1分程度時間がかかるみたいです。) それぞれの項目に適当な値を入れてログイン用のアカウントを作成します。
入力されたEmail Address はログイン用のアカウントになります。 すべての項目を埋めたら CREATE を押してアカウントを作成します。なお、ここで作成したアカウントはローカル環境に作成されるものです。

customerdb をつないでみる。

PostgreSQLのコンテナの一つであるcutomerdbと繋いでみます。 ログイン用アカウントのセットアップが完了したら上部メニューの Services にいきます。 左メニューから Create を選択します。
Service Type から DatabasePostgreSQL を選択し
必要な項目をそれぞれ入力します。それぞれの値は以下のとおりです
項目
Namespace適当な値(ここでは customerdb としています)
Label適当な値(ここでは customerdb としています)
Description適当な値(ここでは customerdb としています)
Hostcuromerdb_postgresql
Port5432
Databasecustomerdb
Usernameadmin
Passwordcustomer_password
docker-compose.yml の cutomerdb の欄を参照
その他の欄は空欄のままで大丈夫です。上記項目を入力し終わったら Save を押します。 Save したあとに左下に以下のメッセージがでればOKです。

customerdb の中身を参照する。

Service が出来たら実際に customerdb の中身を参照してみます。DreamFactory は Swagger を採用していています。上部メニューから API Docs に遷移すると customerdb が追加されていることがわかります。
customerdb を選択して下のほうにスクロールし、 GETメソッドの /_table/{table_name} を選択します。
Try it out を選択し、更に下のほうにスクロールすると table_name という欄があるので、ここに init_customerdb.sh で作成したテーブルである customer を入力し、Execute を押します。
こうすると以下のように customer の中身が出力されます。 また、上のほうに filter という項目があります。SQLのWHERE句に相当するものです。 たとえば、 を入力して、 Execute を押すと結果は以下になります。
出力するJSONが cutomer の customer_id=A0001 のレコードのみになりました。

billdb をつないでみる。

同じ手順で上部メニューの Services からもうひとつのPostgreSQLのコンテナである billdb を設定します。設定項目は以下です。
項目
Namespace適当な値(ここでは billdb としています)
Label適当な値(ここでは billdb としています)
Description適当な値(ここでは billdbとしています)
Hostbilldb_postgresql
Port5432
Databasebilldb
Usernameadmin
Passwordbill_password
docker-compose.yml の billdb の欄を参照
同じように Save を押せばOKです。

customerdb を参照する時に billdb も参照する。

ここからが本題です。 いま、
  • DreamFactory
  • PostgreSQL(customerdb)
  • PostgreSQL(billdb)
の3つのコンテナが立ち上がり、customerdb、billdb ともに DreamFactory から参照可能な状態です。 customerdb の customer というテーブルと billdb の monthly_billing というテーブルにはそれぞれ customerdb というカラムがあります。 cutomerdb の customer を参照したときに、同じ customer_id を持つ、 billdb の monthly_billing のレコードを参照してみます。

Relationship を作成する。

DreamFactory の機能に RelationShip というものがあるのでこれを作成します。 上部メニューの Schema を選択肢、Service で customerdb、Table で Customer を選択します。
下の方にスクロールすると Add Virtual Relationship というのがあるのでこれ選択します
今回はcustomer_idをキーに billdb の monthly_billing を参照したいので以下のように入力します。
項目
Type ( Virtual Relation Shipの種類 )Belongs To
Field ( customerテーブルのどのカラムをキーにするか)customer_id
Reference Service ( どのサービスを参照するか )billdb
Reference Table ( どのテーブルを参照するか )monthly_billing
Reference Field ( ReferenceTable のどのカラムを紐づけるか )customer_id
これで Save を押すと先程の Relationships の表のところに billdb.monthly_billing_by_customer_id が出来上がっています。
これで Relationship の作成が完了しました。

作成した Relationship を使って customerdb を参照してみる。

先程の手順同様、上のメニューから API Docs を選択し、 customerdb の GETメソッドの /_table/{table_name} を選択します。 Try it out を選択した後、Related のところに先程作った Relationship の名前を入れます。
先程同様に table_name に customer と入れ、 Execute を押します。
出力された結果が以下です。 レスポンスのリソースのところに、 billdb.monthly_billing_by_customer_id という項目が追加され、billdb の monthly_billing のレコードの情報が出力されていることがわかります。

終わりに

今回は DreamFactory を使って複数DBにまたがるREST APIを構築してみました。DreamFactoryはノーコードでAPIを構築することができます。 また、今回は PostgreSQL を使ってみましたが、その他のデータベースのほか、ローカルのファイルなどとも連携することが可能です。