
外部システムで管理しているマスタデータを Questetra BPM Suite でも利用したいということが考えられます。今回は Amazon RDS(リレーショナルデータベースサービス)で管理しているデータを、Questetra BPM Suite の「検索セレクトボックス」の外部マスタとして使用します。
「検索セレクトボックス」とは?
「検索セレクトボックス」は、データ項目の種類の一つです。検索文字列を入力して検索ボタンを押すとマスタデータから検索文字列を含む選択肢が表示され、そこからデータを選択して入力できます。

RDS を外部マスタとして使用する利点
RDS を外部マスタとして使用すると、大量のデータを扱えるうえ、データの変更をリアルタイムに反映させることができます。マスタデータの管理方法とそれぞれのメリット、デメリットについては「Questetra でマスタデータを管理するいくつかの方法」をご参照ください(本記事で紹介する方法は「パターン1」に該当します)。
利用する AWS のサービス
本記事で紹介する方法では、AWS(Amazon Web Service)の以下のサービスを利用します。カッコ内に用途を示します。
- RDS(データベース)
- Lambda(アプリケーションの作成)
- API Gateway(API の作成)
仕組み
大枠の仕組みは下図の通りです。

「検索セレクトボックス」が API Gateway に GET リクエストを送信すると、Lambda にイベントが送られます。Lambda はイベントをもとに RDS にデータを問い合わせ、結果を返します。
Lambda から直接 RDS に接続すると、多数の接続が開始されてリソースを消費してしまうことがあります。RDS Proxy を経由することでこの問題を回避できますが、2020年7月現在において Terraform が RDS Proxy をサポートしていないため、本記事では RDS に直接接続する方法を取ります。
RDS Proxy を使用するには、「Amazon RDS を外部マスタとして使用する(AWS コンソール)」を参考に、AWS コンソールにて設定を行ってください。
手順概要
Terraform を用いてデータベースと API を作成します。データベースにテーブルを作成後、API のエンドポイントを「検索セレクトボックス」の「選択肢データの URL」として設定します。

大まかな流れを示します。
- Terraform のテンプレートを GitHub から取得する
- Terraform 実行のための AWS 認証情報を設定する
- Lambda 関数で使用するパッケージをインストールする
- テンプレートの変数を設定する
- AWS リソースを作成する
- データベースへ接続し、テーブルを作成する
- Questetra BPM Suite で「検索セレクトボックス」を用いたアプリを作成する
必要環境
本記事の手順を進めるには以下のものが必要です。
- Terraform
- AWS CLI
- MySQL クライアント(データベースの作成に使用)
- Node.js / npm コマンド(Lambda 関数コードの作成に使用)
手順
1. Terraform のテンプレートを GitHub から取得する
こちらの GitHub レポジトリから Terraform のテンプレートをダウンロードします。
2. Terraform 実行のための AWS 認証情報を設定する
AWS の IAM コンソールを開き、左メニューの「ユーザー」から Terraform の実行に使用するユーザーを選択します。
ルートユーザー以外の管理者ユーザーの使用が推奨されています。新しい管理者 IAM ユーザーの作成方法はこちら(公式ドキュメント)を参照してください。
「認証情報」タブの「アクセスキーの作成」をクリックし、表示されたアクセスキー ID とシークレットアクセスキーをメモしておきます。

次の aws コマンドを実行します。
aws configure
このコマンドを実行すると、次の4 つの情報の入力が求められます。
- アクセスキー ID
- シークレットアクセスキー
- AWS リージョン
- 出力形式
アクセスキー ID とシークレットアクセスキーは先ほどメモしたものを、AWS リージョンと出力形式はデフォルトとして使用したいものを入力します(参考)。
たとえば、次のように入力します。
AWS Access Key ID [None]: {アクセスキー ID}
AWS Secret Access Key [None]: {シークレットアクセスキー}
Default region name [None]: us-east-2
Default output format [None]: json
3. Lambda 関数で使用するパッケージをインストールする
手順 1. でダウンロードしたテンプレート内の lambda-src ディレクトリ内で
npm install
を実行し、必要なパッケージをインストールします(node_modules ディレクトリが作成されます)。
4. テンプレートの変数を設定する
手順 1. でダウンロードしたテンプレートの Choices-AWS-Lambda-RDS ディレクトリ直下に vars.tfvars ファイルを作成し、variables.tf で定義されている変数の値を指定します。(variables.tf 内で default 値が設定されている変数は vars.tfvars 内で値を指定する必要はありません。)
たとえば、vars.tfvars ファイルの内容は次のようになります(mysql コマンドでデータベースに接続できるように、my_ip に自分の PC の IP アドレスを CIDR 表記で設定します)。
aws_region = "us-east-2"
my_ip = "{自分の PC の IP アドレス(CIDR 表記)}"
db_password = "password1234"
5. AWS リソースを作成する
ディレクトリ内で
terraform init
を実行してワークスペースとして初期化し、
terraform plan -var-file=vars.tfvars
を実行して変更内容を確認します(このコマンドでは変更は適用されません)。ログや変更内容が表示されたあと、次のように21個のリソースを作成予定というメッセージが出るはずです。
Plan: 21 to add, 0 to change, 0 to destroy.
変更内容に問題がなければ、
terraform apply -var-file=vars.tfvars
で変更を実行します。
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
と表示されるので、
yes
と入力して実行を確定します。
次のように表示されると AWS リソースの作成は完了です。
Apply complete! Resources: 21 added, 0 changed, 0 destroyed.
Outputs:
api_url = {API のエンドポイント}
db_endpoint = {データベースのエンドポイント}
表示された API のエンドポイントとデータベースのエンドポイントをメモしておいてください。
指定したリージョンの AZ (Availability Zone) の空き容量が不足していて、次のようなエラーが出ることがあります。
Error: error creating RDS cluster: InsufficientStorageClusterCapacity: Couldn't create cluster: insufficient capacity in requested AZs
このエラーが出た場合は、しばらく時間を置いてから再度実行するか、「Amazon RDS を外部マスタとして使用する(トラブルシューティング)」を参考に別の AZ / リージョンを指定してみてください。
6. データベースへ接続し、テーブルを作成する
次のmysql コマンドでデータベースに接続します。コマンドの後、vars.tfvars ファイルで設定したマスターパスワードを入力します。
mysql -h {データベースのエンドポイント} -P 3306 -u admin -p
3306 はポート番号、admin はマスターユーザー名です。vars.tfvars ファイルでマスターユーザー名を設定した場合は、設定したユーザー名を使用します。
接続に成功すると次のように表示されます。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.10 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
データベースに接続できたら、データベーススキーマとテーブルを作成します。ここでは「sample_db」というデータベーススキーマを作成し、そこに「nations」というテーブルを作成します。
データベーススキーマの作成
mysql> に続けて次のSQL 文を実行し、「sample_db」という名前のデータベーススキーマを作成します。
create database sample_db;
データベーススキーマの切り替え
次の SQL 文を実行し、先ほど作成した「sample_db」に切り替えます。
use sample_db;
テーブルの作成
value と display の2つの列からなるテーブルを作成します。value は選択肢ID、display は表示ラベルです。
CREATE TABLE `nations` (
`value` VARCHAR(10) NOT NULL PRIMARY KEY,
`display` VARCHAR(100) NOT NULL
) DEFAULT CHARSET=utf8;
データの挿入
ここでは4行のデータを挿入します。
INSERT INTO nations (value, display)
VALUES
("JP", "日本"),
("US", "アメリカ"),
("UK", "イギリス"),
("AU", "オーストラリア");
データを挿入できたら、API のエンドポイントにブラウザでアクセスし、動作確認してみましょう。次のように XML が表示されれば成功です。

文字化けしたりエラーになる場合は「Amazon RDS を外部マスタとして使用する(トラブルシューティング)」を参考にしてみてください。
7. Questetra BPM Suite で「検索セレクトボックス」を用いたアプリを作成する
Questetra BPM Suite でアプリを作成し、データ項目に「検索セレクトボックス」を追加します(表示名は「検索セレクト」です)。「選択肢種別」で「HTTP 経由で取得した選択肢」を選択し、「選択肢データの URL」に API のエンドポイントを入力し、「適用して閉じる」をクリックします。

アプリをリリースし、フォームを確認してみましょう。検索文字列を入力して検索ボタンを押すと、条件に合致する選択肢が表示されます。

いかがでしたでしょうか。今回は Amazon RDS を使用しましたが、同様の方法で他のデータベースを外部マスタとして使用することもできます。マスタデータの性質、用途に合わせて外部サービスの利用も検討してみてください。
ピンバック: Terraform、マジやばくね(初めて) - とのやまのブログ