[Azure] TERASOLUNAのサンプルアプリをPaaSで動かす

[TERASOLUNA](http://www.terasoluna.jp/index.html) というNTTデータが提供するフレームワーク [^1] があります。

TERASOLUNA Server Framework for Javaの動作環境は [こちら](https://ja.osdn.net/projects/terasoluna/wiki/Server_Framework_for_Java_Web) にありますが、Java, Tomcat, PostgreSQLであればAzure PaaS ( WebApp + Azure Database for PostgreSQL ) 環境で普通に動きそうです。
実際に [Githubで公開されているサンプルアプリ](https://github.com/terasolunaorg/terasoluna-tourreservation) が動作することを試してみたので、以下に手順をまとめておきます。

簡単ですが構成図：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/c9a2bed4-bc6a-a3c0-370d-dbeb34d81475.png)

ここでVMがあるのは、作業用端末(手順中で実行しているDB初期化、ビルドとデプロイの作業用)で、同じAzure環境にある必要はありません。アプリケーション自体はPaaSだけで動作するようになります。

# 1) Azureリソース(WebApp + PostgreSQL)作成

注：WebApp は無料プランで試せますが、PostgreSQLの方は無料プランが無いため、<font color="red">￥4,381／月 (2018.08.15 の東日本リージョンの定価)</font> がかかります。

Azureポータルで リソースの作成 → "Web App + PostgreSQL" を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/c789bee2-8d76-0198-b518-2d2102955199.png)

- WebAppは無料プランを指定
- PostgreSQLの価格レベルは最低(Basic 1コア)を指定
- PostgreSQLのバージョンは 9.6を指定

その他の名称などは任意の名前で構いません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/cc12543f-6a6d-60cb-233e-7fa51abec947.png)

作成時に指定した <font color="blue"><b>サーバ名、管理者ログイン名とパスワード</b></font> を控えておきます。

作成後、WebAppの「アプリケーション設定」を変更します。

- Javaバージョンで「Java 8」を選択
- Javaマイナーバージョンで「1.8.0_172」を選択
- Java Webコンテナーで「新しい順 Tomcat 9.0」（＝Tomcat 9.0の最新バージョン）を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/eb26758c-59d7-c053-13e2-d3c5739aea9b.png)

最後に、PostgreSQLのアクセス許可設定を変更します。
「接続のセキュリティ」メニューにて AllowAllを削除し、「Azureサービスへのアクセスを許可」（＝Azureサービスからのアクセスを許可）をオンに変更します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/5fe275e5-fa27-22e6-2c8b-980d8042f243.png)

今回は作業用の端末がAzure VMなのでこれで設定完了です。別の環境から接続する場合は、その接続元IPを追加で設定して下さい。

設定後の状態：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/3bb0186c-6dbb-b5a3-a6fb-78e103ede8a4.png)

Azureリソースの作成と設定は以上で完了です。

# 2) サンプルアプリのダウンロードと設定

ここからは上に書いたVM(CentOS)で作業しています。作業用の端末に必要な実行環境(java, Maven, PostgreSQLクライアント)がインストールされていない場合は

```shell-session
$ yum install java-1.8.0-openjdk-devel maven postgresql
```

で追加して下さい。(Ubuntuの場合はaptコマンドになります。)

```shell-session
$ apt install openjdk-8-jdk maven postgresql-client-common postgresql-client-9.6
```

サンプルアプリをダウンロードして解凍します。

```shell-session
$ wget https://github.com/terasolunaorg/terasoluna-tourreservation-mybatis3/archive/5.4.1.RELEASE.tar.gz
$ tar -xvf 5.4.1.RELEASE.tar.gz
```

サンプルアプリは、SQLサーバに"tourreserve" DBがあることを前提にしているので、これを手動で作成します。
途中指定するユーザ名は、<font color="red"><b>ユーザ名＠サーバ名 の形式</b> (例：postgresusr@postgresqldbserver)</font>です。

```shell
$ psql -h ＜1で作成したサーバ名＞.postgres.database.azure.com -U ＜1で作成したユーザ名＞ -d postgres
Password for user postgresusr@postgresqldbserver: ＜1で指定したパスワード＞
psql (9.6.9)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> create database tourreserve;
CREATE DATABASE
postgres=> \q
```

サンプルアプリ内にDB初期化スクリプトがあるので、接続情報を変更して実行します。

```shell-session
$ cd ~/terasoluna-tourreservation-mybatis3-5.4.1.RELEASE/terasoluna-tourreservation-initdb/
$ vi pom.xml
```

ファイル中に

```xml
<db.url>jdbc:postgresql://localhost/tourreserve</db.url>
<db.username>postgres</db.username>
<db.password>P0stgres</db.password>
```

という行があるので変更します。ユーザ名は、<font color="red"><b>ユーザ名＠サーバ名 の形式</b> (例：postgresusr@postgresqldbserver)</font>です。

```xml
<db.url>jdbc:postgresql://＜1で作成したサーバ名＞.postgres.database.azure.com:5432/tourreserve</db.url>
<db.username>＜1で作成したユーザ名＞</db.username>
<db.password>＜1で指定したパスワード＞</db.password>
```

変更後、DB初期化スクリプトを実行します。

```shell-session
$ cd ~/terasoluna-tourreservation-mybatis3-5.4.1.RELEASE/
$ mvn -f terasoluna-tourreservation-initdb/pom.xml sql:execute
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - DB Init 5.4.1.RELEASE
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- sql-maven-plugin:1.5:execute (default-cli) @ terasoluna-tourreservation-initdb ---
※中略※
[INFO] 28 of 28 SQL statements executed successfully
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.169s
[INFO] Finished at: Mon Aug 06 05:27:27 UTC 2018
[INFO] Final Memory: 7M/133M
[INFO] ------------------------------------------------------------------------
```

BUILD SUCCESSとなれば成功です。

# 3) ビルド

アプリケーションのDB接続情報は 2) のDB初期化設定とは別にあるので、修正してビルドします。

```shell-session
$ cd ~/terasoluna-tourreservation-mybatis3-5.4.1.RELEASE/terasoluna-tourreservation-env/src/main/resources/META-INF/spring/
$ vi terasoluna-tourreservation-infra.properties
```

ファイル中に

```xml
database.url=jdbc:postgresql://localhost/tourreserve
database.username=postgres
database.password=P0stgres
```

という行があるので、2) と同様に修正します。

```xml
database.url=jdbc:postgresql://＜1で作成したサーバ名＞:5432/tourreserve
database.username=＜1で作成したユーザ名＞
database.password=＜1で指定したパスワード＞
```

変更後、ビルド実行します。

```shell-session
$ cd ~/terasoluna-tourreservation-mybatis3-5.4.1.RELEASE/
$ mvn clean install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Parent
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Environment Layer
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Domain Layer
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Web Layer
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Parent 5.4.1.RELEASE
[INFO] ------------------------------------------------------------------------
※中略※
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Parent SUCCESS [  0.742 s]
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Environment Layer SUCCESS [  5.308 s]
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Domain Layer SUCCESS [ 31.058 s]
[INFO] TERASOLUNA Server Framework for Java (5.x) - Tour Reservation Application - Web Layer SUCCESS [ 30.660 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:08 min
[INFO] Finished at: 2018-08-23T18:18:23+09:00
[INFO] Final Memory: 45M/331M
[INFO] ------------------------------------------------------------------------
```

BUILD SUCCESSとなれば成功です。

```shell-session
$ ls ~/terasoluna-tourreservation-mybatis3-5.4.1.RELEASE/terasoluna-tourreservation-web/target/terasoluna-tourreservation-web.war
-rw-r--r-- 1 azureuser azureuser 29272310 Aug 23 18:18 /home/azureuser/terasoluna-tourreservation-mybatis3-5.4.1.RELEASE/terasoluna-tourreservation-web/target/terasoluna-tourreservation-web.war
```

このwarをWebAppsにデプロイします。

# 4) デプロイ

まず、AzureコンソールでWebAppsのデプロイ設定をします。対象のWebAppsのメニュー「デプロイ資格情報」から、デプロイ用のユーザ名、パスワードを設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/4fdda99f-56b6-109d-ebe5-925104bdef6b.png)

次に、デプロイオプションとして、ローカルGitリポジトリを設定します。「デプロイオプション」→「ソースの選択」からローカルGitリポジトリを選択して変更を保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/b2ea6520-528c-1c2a-cafd-87b0f26fbefb.png)

変更後、WebAppsの概要に戻ると「GitクローンURL」が表示されているのでコピーしておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/baa5f65b-3322-879b-d9dc-fb6e584966d6.png)

作業用の端末に戻り、WebAppsにwarファイルをデプロイします。

```shell-session
$ git clone ＜上でコピーしたGitクローンURL＞
Password for 'https://xxxxx.scm.azurewebsites.net:443': ＜上で設定したパスワード＞
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
Unpacking objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0)
```

warファイルを追加して、pushします。

```shell-session
$ cd ＜上で作成されたWebAppsディレクトリ＞
$ cp ~/terasoluna-tourreservation-mybatis3-5.4.1.RELEASE/terasoluna-tourreservation-web/target/terasoluna-tourreservation-web.war ./webapps/
$ git add ./webapps/terasoluna-tourreservation-web.war
$ git commit
＜コメントを何か記入して保存＞
$ git push origin master
Password for 'https://xxxxx.scm.azurewebsites.net:443': ＜上で設定したパスワード＞
```

作業後、デプロイオプションに履歴が表示されれば作業は完了です(チェックが入れば、正常終了)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/312d62f5-6a28-0481-badd-2d9f52584f6c.png)

# 5) 動作確認

WebAppsにアクセスして、参照できることを確認します。

```shell-session
https://＜1で作成したWebApp名＞.azurewebsites.net/terasoluna-tourreservation-web/
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/dfc14059-f840-51b4-c4f4-6b36be304cec.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/2e39679c-0346-4511-5e3e-4868ccd46ec3.png)

以上で、サンプルアプリがPaaS環境で動作することが確認できました。

# 参考資料
- [TERASOLUNA](http://www.terasoluna.jp/index.html)
- [サンプルアプリ](https://github.com/terasolunaorg/terasoluna-tourreservation)

[^1]: [リンク先](http://www.terasoluna.jp/index.html) に説明がありますが、正確にはフレームワークではなく「フレームワークを含む総合ソリューション」の名称です。