国産IDaaS Exticを使ってみる 4. Database Provisioning

[前回](https://qiita.com/ahra_/items/5467c532c80fc4a0bd7b)の続きです。
## ExticにおけるDBプロビジョニング
「DBエージェント」と呼ばれるWebアプリケーションを通じて、Exticのユーザー情報をオンプレミスのデータベースへ連携します。
エージェントを複数稼働させることで、複数のデータベースへのプロビジョニングを行えます。
## 設定
[システム要件](https://www.exgen.co.jp/extic/specs.html)に合わせて以下の環境を用意しています。
Webサーバー: Windows Server 2022 + Eclipse Temurin JDK 17 + Apache Tomcat 10.1.33
DBサーバー: AlmaLinux 9.5 + PostgreSQL 15.10
### データベースの準備
任意の形式でテーブルを作成します。
必ずExticが管理するレコードであることを示す列が必要です。
```
$ sudo -i -u postgres psql
psql (15.10)

postgres=# create database extic;
CREATE DATABASE
postgres=# create role extic with login password 'extic';
CREATE ROLE
postgres=# grant all on database extic to extic;
GRANT
postgres=# \c extic
データベース"extic"にユーザー"postgres"として接続しました。
extic=# create schema extic authorization extic;
CREATE SCHEMA
extic=# create table extic.extic (
name char(24),
email char(50),
extic char(5),
id char(4),
adddate TIMESTAMP,
suffix char(30)
);
CREATE TABLE
extic=# alter table extic.extic owner to extic;
ALTER DATABASE
```
### Extic本体側の準備
Extic管理コンソール > アプリケーションから「Database (オンプレミス)」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/0e9424c9-aa85-4392-01ef-551dfd15f31c.png)
表示名を設定し、接続キーを「発行」して保存します。
![スクリーンショット 2024-12-26 113149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/da92b7cd-16c2-0a87-a59a-449df0196890.png)
対象ユーザーでアプリケーションを「使用する」設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/1b14fb10-c6cf-5579-4911-8be0093ccb6a.png)
### Webアプリケーションの設定
管理コンソール > リリース情報 > モジュール から`dbagent.war`をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/eaadfb79-7c8b-31f1-db3a-cbfdef112b9e.png)
Tomcatが起動している状態でダウンロードした`.war`ファイルを`<tomcat_home>\webapps`以下にコピーし、デプロイされることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/84e96060-597e-0951-9655-ade30b37e011.png)
`<tomcat_home>\webapps\dbagent\WEB-INF\classes\META-INF\application_setting.properties`を編集します。
`subdomain=`にExticテナントのサブドメイン（*xxx*.ex-tic.com の *xxx* の部分）を、`apiconnect=`に発行した接続キーを指定します。
`sqlite_directory=`には実在のパスを指定します。
その他の設定は今回は行いません。
![スクリーンショット 2024-12-26 140011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/dd0916e1-004b-2b49-f25a-cd95f893264f.png)
保存してTomcatを再起動します。
`http://(ホスト名):(ポート)/dbagent/`にアクセスします。
ここではExticの管理者ロールを持つユーザーでログインします。
次の画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/6c3f7995-047e-859e-14d6-27ca9f5b0deb.png)
画面右上のプルダウンメニューから「設定」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/c79c620f-cdc9-5302-92fa-ba0090de2608.png)
「DB接続設定」では、DBへの接続情報を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/11e8a6dc-0961-ad90-11d5-14c529f7a35e.png)
「ユーザーマッピング設定」では、連携先のテーブル名、レコード識別属性名と、Exticの属性とDBの列のマッピング設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/1531e54c-f878-647e-4264-df446f0d725b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/e12a4d2b-fd9b-647e-8d6b-fa86c0fbc54f.png)
マッピング関数が使用できます。
ここでは、`id`列に1からの連番を、`adddate`列に追加日時を、`suffix`列にメールアドレスの`@`より後ろの部分を切り取った値を追加しています。
Exticのマッピング関数では、If文の判定において"分岐しなかった側"の処理の評価もされるため、仮に下記のような使い方をすると、`メールアドレス`属性が空の場合に`"DoNothing"`で処理スキップとはならず、RIGHT関数が実行されてしまうためエラーになります。
```
=IF([メールアドレス] != "", (RIGHT([メールアドレス], LEN([メールアドレス]) - FIND([メールアドレス], "@"))), "DoNothing")
```
そのためこのように、`メールアドレス`属性に値が無い場合にエラーとならないようにする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/0be3c1ea-a4e7-fd12-7be1-57c9fdbdb5be.png)
```
=RIGHT([メールアドレス], IF(FIND([メールアドレス], "@") == 0, 1, LEN([メールアドレス]) - FIND([メールアドレス],"@")))
```
「ポーリング間隔」からはExticへのポーリングを行う間隔と、Tomcatの起動時にポーリング処理を開始するか選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/6acd584b-9963-ed52-b4dc-a4df559dea29.png)
## 確認
右上のドロップダウンリストから「実行」を選択すると、次の画面に遷移します。
「起動する」を選択するとポーリング処理が開始されます。
「即時実行する」とポーリング間隔に関わらず現在のExticのユーザー情報をDBに連携します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/cc16cb12-9dd4-34e6-eb3d-fec6b35bd6f5.png)
即時実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/692bd591-14eb-8e16-1980-cc153dd1e6b4.png)
DBにレコードが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/e9a33364-2320-3aa5-cf86-1b7f2fd06c7d.png)
```
extic=# select * from extic.extic;
           name           |                       email                        | extic |  id  |       adddate       |             suffix

--------------------------+----------------------------------------------------+-------+------+---------------------+-------------------------------
 testuser2024             | testuser2024@example.com                           | EXTIC | 1    | 2024-12-26 15:12:46 | example.com

(1 行)
```
`メールアドレス`属性のないユーザーを対象としてもこの通り処理が実行されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900965/ee9a5282-7d10-4591-93fe-e67027985827.png)
```
extic=# select * from extic.extic;
              name              |                       email                        | extic |  id  |       adddate       |             suffix
--------------------------------+----------------------------------------------------+-------+------+---------------------+--------------------------------
 通常ユーザー                   |                                                    | EXTIC | 2    | 2024-12-26 15:17:16 |
 testuser2024                   | testuser2024@example.com                           | EXTIC | 1    | 2024-12-26 15:12:46 | example.com
(2 行)
```
## 
ExticからオンプレミスDBへのプロビジョニングの検証は以上になります。
記事中の「マッピング関数」はExticの各モジュールで使用可能で、紹介したもの以外にも多くの関数が存在します。
[次回](https://qiita.com/ahra_/items/42ef8c93517278049212)は「コマンド(オンプレミス)実行」について検証します。