DreamFactoryとは
公式サイト: https://www.dreamfactory.com/ DreamFactoryとは bitnami が提供するAPIを簡単に生成、管理できるオープンソースのソフトウェアです。 データソースには各種リレーショナル・データベースのほか、ローカルファイルやWebDAVなどを使うことができます。 無料のApacheライセンス版と有料の商用ライセンス版がありますが、今回はApacheライセンス版を使っていきます。Docker環境を構築する
dockerhub の bitnami のページに docker-compose.yml を使った構築方法があるのでこれを使っていきます。 まずは手順に従って docker-compose.yml を取得します。
1 |
curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-dreamfactory/master/docker-compose.yml > docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
version: '2' services: mariadb: image: docker.io/bitnami/mariadb:10.6 volumes: - 'mariadb_data:/bitnami/mariadb' environment: - ALLOW_EMPTY_PASSWORD=yes - MARIADB_USER=bn_dreamfactory - MARIADB_DATABASE=bitnami_dreamfactory redis: image: docker.io/bitnami/redis:6.0 volumes: - 'redis_data:/bitnami/redis' environment: # ALLOW_EMPTY_PASSWORD is recommended only for development. - ALLOW_EMPTY_PASSWORD=yes dreamfactory: image: docker.io/bitnami/dreamfactory:4 ports: - '80:8080' - '443:8443' volumes: - 'dreamfactory_data:/bitnami/dreamfactory' depends_on: - mariadb - redis environment: - ALLOW_EMPTY_PASSWORD=yes - DREAMFACTORY_DATABASE_TYPE=mariadb - DREAMFACTORY_DATABASE_HOST=mariadb - DREAMFACTORY_DATABASE_PORT_NUMBER=3306 - DREAMFACTORY_REDIS_HOST=redis - DREAMFACTORY_REDIS_PORT_NUMBER=6379 # Enable MariaDB service for DreamFactory - DREAMFACTORY_ENABLE_MARIADB_SERVICE=yes - DREAMFACTORY_MARIADB_SERVICE_DATABASE_NAME=df - DREAMFACTORY_MARIADB_SERVICE_DATABASE_USER=df # Create MariaDB database for extra service - MYSQL_CLIENT_DATABASE_HOST=mariadb - MYSQL_CLIENT_DATABASE_PORT_NUMBER=3306 - MYSQL_CLIENT_CREATE_DATABASE_NAME=df - MYSQL_CLIENT_CREATE_DATABASE_USER=df volumes: mariadb_data: driver: local redis_data: driver: local dreamfactory_data: driver: local |
PostgreSQLのコンテナを2つ追加する。
今回、複数のDBにまたがるREST APIを構築するということで、PostgreSQLのコンテナを2つ用意します。DreamFactoryが参照する先のデータベースについては、顧客情報を管理するデータベースと顧客の利用料金を管理するデータベースで別々になっていることを想定しています。 前者を customerdb、後者を billdb とし、先程の docker-compose.yml に以下を追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
customerdb: container_name: postgresql_customerdb image: 'postgres:14' environment: - POSTGRES_USER=admin - POSTGRES_PASSWORD=customer_password - POSTGRES_DB=customerdb ports: - '5433:5432' volumes: - ./initdb.d.customerdb:/docker-entrypoint-initdb.d billdb: container_name: postgresql_billdb image: 'postgres:14' environment: - POSTGRES_USER=admin - POSTGRES_PASSWORD=bill_password - POSTGRES_DB=billdb ports: - '5434:5432' volumes: - ./initdb.d.billdb:/docker-entrypoint-initdb.d |
1 |
mkdir ./initdb.d.{customerdb,billdb} |
customerdb 初期セットアップ用スクリプト
init.db.customerdb/init_customerdb.sh として以下を配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
set -e psql -U admin customerdb << EOSQL -- 顧客テーブル作成 create table customer ( customer_id varchar(12) primary key, -- 顧客ID name varchar(32) not null, -- 顧客氏名 registered_date date default current_date -- 登録日 ); -- 顧客テーブルのデータ作成 insert into customer ( customer_id, name ) values ( 'A0001', 'ニフティ 太郎'); insert into customer ( customer_id, name ) values ( 'A0002', 'ニフティ 次郎'); insert into customer ( customer_id, name ) values ( 'A0003', 'ニフティ 三郎'); insert into customer ( customer_id, name ) values ( 'A0004', 'ニフティ 四郎'); insert into customer ( customer_id, name ) values ( 'A0005', 'ニフティ 五郎'); EOSQL |
billdb 初期セットアップ用スクリプト
同じようにinitdb.d.billdb/init_billdb.sh を配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
set -e psql -U admin billdb << EOSQL -- 月額料金管理テーブル作成 create table monthly_billing ( customer_id varchar(32), month_of_use date, amount int ); -- 月額料金管理テーブルにレコードを作成 -- 2022-02分 insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0001', '2022-02-01', 3000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0002', '2022-02-01', 4000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0003', '2022-02-01', 2000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0004', '2022-02-01', 2000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0005', '2022-02-01', 2000); -- 2022-03分 insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0001', '2022-03-01', 3000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0002', '2022-03-01', 5000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0003', '2022-03-01', 1000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0004', '2022-03-01', 0); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0005', '2022-03-01', 1000); -- 2022-04分 insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0001', '2022-04-01', 3000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0002', '2022-04-01', 0); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0003', '2022-04-01', 2000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0004', '2022-04-01', 1000); insert into monthly_billing ( customer_id, month_of_use, amount) values ( 'A0005', '2022-04-01', 0); EOSQL |
1 |
docker-compose up -d |
./
を付けてあげることでうまくいきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
version: '2' services: mariadb: : volumes: - './mariadb_data:/bitnami/mariadb' redis: : volumes: - './redis_data:/bitnami/redis' : dreamfactory: : volumes: - './dreamfactory_data:/bitnami/dreamfactory' : : |
DreamFactoryのアカウントをセットアップする
http://localhost にアクセスして以下の画面が表示されればOKです。(コンテナ立ち上げてから画面が表示できるようになるまで1分程度時間がかかるみたいです。) それぞれの項目に適当な値を入れてログイン用のアカウントを作成します。 入力されたEmail Address はログイン用のアカウントになります。 すべての項目を埋めたら CREATE を押してアカウントを作成します。なお、ここで作成したアカウントはローカル環境に作成されるものです。customerdb をつないでみる。
PostgreSQLのコンテナの一つであるcutomerdbと繋いでみます。 ログイン用アカウントのセットアップが完了したら上部メニューのServices
にいきます。
左メニューから Create
を選択します。
Service Type
から Database
の PostgreSQL
を選択し
必要な項目をそれぞれ入力します。それぞれの値は以下のとおりです
項目 | 値 |
---|---|
Namespace | 適当な値(ここでは customerdb としています) |
Label | 適当な値(ここでは customerdb としています) |
Description | 適当な値(ここでは customerdb としています) |
Host | curomerdb_postgresql |
Port | 5432 |
Database | customerdb |
Username | admin |
Password | customer_password |
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 の中身が出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
{ "resource": [ { "customer_id": "A0001", "name": "ニフティ 太郎", "registered_date": "2022-05-12" }, { "customer_id": "A0002", "name": "ニフティ 次郎", "registered_date": "2022-05-12" }, { "customer_id": "A0003", "name": "ニフティ 三郎", "registered_date": "2022-05-12" }, { "customer_id": "A0004", "name": "ニフティ 四郎", "registered_date": "2022-05-12" }, { "customer_id": "A0005", "name": "ニフティ 五郎", "registered_date": "2022-05-12" } ] } |
1 |
customer_id=A0001 |
Execute
を押すと結果は以下になります。
出力するJSONが cutomer の customer_id=A0001 のレコードのみになりました。
billdb をつないでみる。
同じ手順で上部メニューのServices
からもうひとつのPostgreSQLのコンテナである billdb を設定します。設定項目は以下です。
項目 | 値 |
---|---|
Namespace | 適当な値(ここでは billdb としています) |
Label | 適当な値(ここでは billdb としています) |
Description | 適当な値(ここでは billdbとしています) |
Host | billdb_postgresql |
Port | 5432 |
Database | billdb |
Username | admin |
Password | bill_password |
Save
を押せばOKです。
customerdb を参照する時に billdb も参照する。
ここからが本題です。 いま、- DreamFactory
- PostgreSQL(customerdb)
- PostgreSQL(billdb)
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
を押します。
出力された結果が以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
{ "resource": [ { "customer_id": "A0001", "name": "ニフティ 太郎", "registered_date": "2022-05-12", "billdb.monthly_billing_by_customer_id": { "customer_id": "A0001", "month_of_use": "2022-02-01", "amount": 3000 } }, { "customer_id": "A0002", "name": "ニフティ 次郎", "registered_date": "2022-05-12", "billdb.monthly_billing_by_customer_id": { "customer_id": "A0002", "month_of_use": "2022-02-01", "amount": 4000 } }, { "customer_id": "A0003", "name": "ニフティ 三郎", "registered_date": "2022-05-12", "billdb.monthly_billing_by_customer_id": { "customer_id": "A0003", "month_of_use": "2022-02-01", "amount": 2000 } }, { "customer_id": "A0004", "name": "ニフティ 四郎", "registered_date": "2022-05-12", "billdb.monthly_billing_by_customer_id": { "customer_id": "A0004", "month_of_use": "2022-02-01", "amount": 2000 } }, { "customer_id": "A0005", "name": "ニフティ 五郎", "registered_date": "2022-05-12", "billdb.monthly_billing_by_customer_id": { "customer_id": "A0005", "month_of_use": "2022-02-01", "amount": 2000 } } ] } |
billdb.monthly_billing_by_customer_id
という項目が追加され、billdb の monthly_billing のレコードの情報が出力されていることがわかります。