LightsailでのiPLAss環境構築

本記事では、Amazon Lightsail上で「iPLAss」の動作環境を構築する手順を解説します！

今回紹介する手順は、小規模な社内システムなどでのiPLAssを用いた開発・運用を想定しています。構築内容は、DockerによるiPLAssコンテナの起動に加えて、サーバー外部へのデータ保存や独自ドメインでのアクセスも含んでいます。

とりあえずiPLAssを動かしてみたい！という方は、[Dockerでサクッと試すローコード開発 -「iPLAss」](https://qiita.com/yuma_ishida_iPLAss/items/0c14b62457983b1c6ab0)を参考にしてみてください。

# iPLAssとは？
iPLAssとは、業務システムを効率的に開発できるローコード開発プラットフォームです。


https://github.com/dentsusoken/iPLAss

iPLAssでは、ノーコードでのデータ定義から認証、ワークフロー、集計まで多様な機能を提供しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799220/b26580ca-c384-adaf-7dee-fb54d1b80dfe.png)

**ノーコード開発**
- Webブラウザ上からデータ定義や設定することでアプリケーションの構築が可能です
- データのCRUD（登録/参照/更新/削除）機能は、データ定義から自動的に構成されます

**ローコード開発**
- Java／Groovy、JSP／GroovyTemplateによるカスタマイズが可能です

**汎用機能の提供**
- 認証、ワークフロー、集計など、アプリケーション開発でよく利用される汎用的な機能を提供します

iPLAssでは無償版（AGPLライセンス）と、高度なセキュリティ機能などを搭載した有償版のEnterprise Editionを提供しています。今回の環境構築では無償版を使用します。

:::note info
- 無償版では若干の機能制限がありますが、無償版でも十分に開発を行うことが可能です。
- 無償版はAGPLライセンスであり、ソフトウェアの改変や再配布の際に、改変後のソースコードを公開する必要があります。しかし利用が社内に限定される場合は、その義務はありません。
:::

さらに詳しい機能、導入事例などについては、iPLAssのEnterprise Editionのホームページからご確認ください！

https://itsol.dentsusoken.com/iplass/

# Amazon Lightsailとは？
Amazon Lightsailとは、AWS（Amazon Web Services）が提供する手軽に利用できるクラウドリソースです。

Lightsailでは、インスタンス、コンテナ、データベース、ロードバランサー、DNS管理などの必要最低限のサービスが提供されています。
Lightsailの専用コンソールを通じてこれらのサービスを組み合わせて利用することで、Lightsailだけでクラウド上にアプリケーションの動作環境を簡単に構築できます。提供されるサービスは簡素化されていて利用しやすく、数回のクリックだけでリソースを簡単に作成できます。

分かりやすい価格体系も魅力的です。Lightsailのリソースは月額固定料金となっており、リソース作成時に価格を把握できます。
リソースによっては最初の3か月は無料で使用でき、最低月額3.5ドルからインスタンスを起動できるなど価格設定も手ごろです。

https://aws.amazon.com/jp/lightsail/

# 環境構築
次の手順で環境構築を行います。
[1. データベースの準備](#1-データベースの準備)
[2. Lightsailインスタンスの準備](#2-lightsailインスタンスの準備)
[3. 追加ディスクの作成&マウント](#3-追加ディスクの作成マウント)
[4. DockerによるiPLAssコンテナの起動](#4-dockerによるiplassコンテナの起動)
[5. ロードバランサーの設定](#5-ロードバランサーの設定)
[6. 独自ドメインの設定](#6-独自ドメインの設定)
[7. TLSでの接続](#7-tlsでの接続)
[8. iPLAssの設定&起動](#8-iplassの設定起動)

:::note info
Lightsailではインスタンスだけではなく、Dockerイメージを直接起動できるLightsailコンテナも提供されています。しかしLightsailコンテナでは、コンテナ外のストレージにデータを保存できません。そこで今回の環境構築では、インスタンスにDockerをインストールして起動する方法を紹介します。

- iPLAssでは画像などのバイナリデータをRDB外に保存することを推奨しています。コンテナ停止後のデータ永続化のためには、コンテナ外にデータを保存する必要がありますが、Lightsailコンテナでは実現できません。
- iPLAssのEnterprise Editionでは外部ストレージとしてS3の利用が可能ですが、無償版では利用できません。
:::

## 1. データベースの準備

### 1.1. データベースの作成
左端のメニューにて「データベース」を選択し、「データベースの作成」をクリック。次のように各項目を設定してデータベースを作成します。

| 項目 | 設定値 |
| ---- | ---- |
| データベースの場所 | 任意（今回は、ap-northeast-1a）|
| データベースを選んでください | MySQL 8.0.36 |
| データベースプランを選択します | 任意 |
| データベースを確認 | 任意の名前（Database-iplassなど） |

### 1.2. DBのパラメータ変更
iPLAssでデータベースを利用する場合、`transaction-isolation`の変更が必要になります。画面左下の「CloudShell」をクリックして起動し、Lightsailデータベースのパラメータを変更してください。

https://docs.aws.amazon.com/ja_jp/lightsail/latest/userguide/amazon-lightsail-updating-database-parameters.html

#### transaction-isolationの変更
transaction-isolationをREAD-COMMITTEDに設定します。
```
aws lightsail update-relational-database-parameters \
    --relational-database-name Database-iplass \
    --parameters "parameterName=transaction_isolation,parameterValue=READ-COMMITTED,applyMethod=immediate”
```

#### 変更したtransaction-isolationの値を確認
```
aws lightsail get-relational-database-parameters \
    --relational-database-name Database-iplass | grep -C 10 "transaction_isolation”
```

## 2. Lightsailインスタンスの準備

### 2.1. Lightsailインスタンスの作成
左端のメニューにて「インスタンス」を選択し、「インスタンスの作成」をクリック。次のように各項目を設定してインスタンスの作成を実行します。

| 項目 | 設定値 |
| ---- | ---- |
| インスタンスロケーション | DBと同様（今回は、ap-northeast-1a） |
| プラットフォームの選択 | Linux/Unix |
| 設計図の選択 | オペレーティングシステム（OS）のみ <br> Amazon Linux 2023 |
| ネットワークタイプを選択 | デュアルスタック |
| サイズを選択 | 任意（2GBメモリ 2vCPUなど） |
| インスタンスを確認 | 任意の名前（Amazon_Linux_2023-iplassなど） |


### 2.2. ファイアウォールの設定
:::note info
インスタンスへのアクセスを社内ユーザーなどのみに限定するための手順です。
:::

インスタンスの「ネットワーキング」タブにて、以下のようにIPアドレスの範囲を指定してアクセス元を制限します。

| アプリケーション | プロトコル | ポートまたは範囲/コード | 制限（例） |
| ---- | ---- | ---- | ---- |
| SSH | TCP | 22 | 192.0.2.0/24 |
| HTTP | TCP | 80 | 192.0.2.0/24 |

さらに、IPv6ネットワーキングを「無効」に設定します。

## 3. 追加ディスクの作成&マウント

### 3.1. 追加ディスクの作成
左端のメニューにて「ストレージ」を選択し、「ディスクの作成」をクリック。
次のように各項目を設定して追加のディスクを作成します。

| 項目 | 設定値 |
| ---- | ---- |
| 新しいディスクの場所 | DBと同様（今回は、ap-northeast-1a） |
| ディスクサイズの選択 | 任意 |
| ディスクを確認 | 任意の名前（Disk-iplassなど） |

:::note info
ここで作成したディスク内に、iPLAssの設定ファイルや画像などのバイナリデータが格納されます。
:::

### 3.2. 追加ディスクのアタッチ
ディスクの「詳細」タブの「インスタンスへのアタッチ」にて、iPLAss用のインスタンスを選択し、「アタッチ」をクリックしてください。

### 3.3. 追加ディスクのマウント
ファイルシステムを作成し、作成した追加ディスクをマウントします。

左端のメニューにて「インスタンス」を選択し、iPLAss用のインスタンスをクリック。「接続」タブ内の「SSHを使用して接続」からインスタンスに接続します。

#### ファイルシステムの作成
```
sudo mkfs.xfs /dev/xvdf
```

#### マウントポイント（iPLAssのホームディレクトリ）の作成
```
mkdir -m 777 /home/ec2-user/iplass-home/
```

#### マウント
```
sudo mount /dev/xvdf /home/ec2-user/iplass-home/
```

#### 再起動時の設定
再起動時にマウントが外れないようにする設定です。

```
# 次のコマンドで取得できるUUIDをメモ
sudo blkid /dev/xvdf

# /etc/fstabをエディタで開く
sudo vi /etc/fstab

# メモしたUUIDをXXXXに指定し、/etc/fstabに次の行を追記
UUID=xxxx /home/ec2-user/iplass-home/ xfs defaults 1 2
```

## 4. DockerによるiPLAssコンテナの起動

### 4.1 コンテナ起動

#### Dockerのインストール
```
sudo dnf install -y docker
```

#### Dockerの起動
```
sudo service docker start
```

#### iPLAssのDockerイメージをダウンロード
```
sudo docker pull iplass/iplass
```
iPLAssのDockerイメージに関する詳細は次のリンクを参照してください。

https://hub.docker.com/r/iplass/iplass

#### コンテナのバックグラウンド起動
```
sudo docker run -d -p 80:8080 -v /home/ec2-user/iplass-home:/var/lib/iplass \
    -e "TOMCAT_CONNECTOR_HTTP_PROXY_NAME=lightsail.iplass.org" \
    -e "TOMCAT_CONNECTOR_HTTP_PROXY_PORT=443" \
    -e "TOMCAT_CONNECTOR_HTTP_SCHEME=https" \
    -e "TOMCAT_CONNECTOR_HTTP_SECURE=true" iplass/iplass
```

コンテナ起動時の環境変数として、`TOMCAT_CONNECTOR_HTTP_PROXY_NAME`、`TOMCAT_CONNECTOR_HTTP_PROXY_PORT`、`TOMCAT_CONNECTOR_HTTP_SCHEME`、`TOMCAT_CONNECTOR_HTTP_SECURE`を指定します。

`TOMCAT_CONNECTOR_HTTP_PROXY_NAME`には、[6. 独自ドメインの設定](#6-独自ドメインの設定)にて設定（もしくは取得）する予定のドメインと同一の値を指定してください。Route53で管理しているドメイン（iplass.orgなど）をお持ちの場合は、使用可能な新しいサブドメイン（lightsail.iplass.orgなど）を指定します。

::: note
iPLAssの設定ファイルを独自に用意してコンテナを起動することも可能です。
iPLAssのホームディレクトリ（ここでは`/home/ec2-user/iplass-home/`）内に、iPLAssの設定ファイル`iplass-service-config.xml`を配置し、同様のコマンドでコンテナを起動します。service-configに関する詳細は[iPLAssの公式ドキュメント](https://iplass.org/docs/serviceconfig/index.html)を参照ください。
::: 

### 4.2. 接続確認
コンテナ起動後に、`http://パブリックIPv4アドレス/iplass`にアクセスしてください。
iPLAssの設定ページが表示されれば無事コンテナの起動が完了しています！

## 5. ロードバランサーの設定
::: note warn
Lightsailのロードバランサーでは、IPアドレスによるアクセス制限ができません。IP制限をしたい場合は、[ALBのアタッチ](https://repost.aws/ja/knowledge-center/lightsail-add-application-load-balancer)をしてセキュリティグループを設定することを検討してください。
:::

### 5.1. ロードバランサーの作成
左端のメニューにて「ネットワーキング」を選択し、「ロードバランサーの作成」をクリックします。次のように各項目を設定してロードバランサーを用意してください。
| 項目 | 設定値 |
| ---- | ---- |
| ロードバランサーの場所 | DBと同様（今回は、ap-northeast-1a）|
| ロードバランサーを確認 | 任意の名前（LoadBalancer-iplassなど） |

### 5.2. ロードバランサーのアタッチ
ロードバランサーの「ターゲットインスタンス」タブに移動し、次の項目を設定します。

| 項目 | 設定値 |
| ---- | ---- |
| ターゲットインスタンス | iPLAss用のインスタンスを選択してアタッチ |
| ヘルスチェックのカスタマイズ | パスとして、iplass/app/gem/ を指定 |

:::note
`iplass/app/gem/`の`app`はテナント名であり、後ほど[8. iPLAssの設定&起動](#8-iplassの設定起動)にて設定します。iPLAssの設定&起動でテナント作成が完了すると、`iplass/app/gem/`へのアクセスが可能になりヘルスチェックが成功します。
:::

### 5.3. 接続確認
`http://DNS名/iplass`にアクセスし、iPLAssの設定ページが表示されることを確認してください。

## 6. 独自ドメインの設定
ここでは、すでにドメインをRoute 53で管理しており、そのサブドメインをLightsailに登録する場合の手順を解説します。
ドメインを持っていない場合は、次の記事を参考にしてドメインを取得してください。

https://docs.aws.amazon.com/ja_jp/lightsail/latest/userguide/amazon-lightsail-register-new-domain.html#register-new-domain-using-lightsail

:::note
取得済みである会社名などのドメインをRoute53で管理しており、そのサブドメインをロードバランサーに割り当てることを想定しています。またサブドメインはLightsail内で管理し、LightsailのネームサーバーをRoute53のDNSレコードに登録します。これにより、別のLightsailリソースをサブドメインと紐づける場合に、Lightsail内でドメインを一元管理できます。

:::

### 6.1. DNS ゾーンの作成
左端のメニューにて「ドメインとDNS」を選択し、「DNSゾーンの作成」をクリックします。次のように項目を設定し、DNSゾーンを作成してください。

ドメイン名には、先ほどの[コンテナのバックグラウンド起動](#コンテナのバックグラウンド起動)でコンテナ起動時に指定したドメインを設定します。

| 項目 | 設定値 |
| ---- | ---- |
| ドメインのソース | 別のレジストラからドメインを使用 |
| ドメイン名 | 既存ドメイン（iplass.orgなど）のサブドメイン（lightsail.iplass.orgなど） |

### 6.2. ドメインの割り当て
作成したDNSゾーンの「割り当て」タブにて、「割り当てを追加」をクリック。
使用するドメイン名と用意したロードバランサーを選択し、「割り当てる」をクリックします。

### 6.3. Route 53の設定
Lightsailにて、作成したDNSゾーンの「ドメイン」タブに表示されている**ネームサーバーをすべてコピー**します。

Route 53のサイドメニューにて「ホストゾーン」を選び、管理しているドメイン（iplass.orgなど）を選択してください。

ホストゾーンにて、「レコードを作成」をクリック。
次の内容でレコードを作成します。
| 項目 | 設定値 |
| ---- | ---- |
| レコード名 | 既存ドメインのサブドメイン（lightsail.iplass.orgなど） |
| レコードタイプ | NS-ホストゾーンのネームサーバー|
| 値 | 先ほどコピーした、LightsailのDNSゾーンに表示されていたすべてのネームサーバー |

### 6.4. 接続確認
`http://設定したサブドメイン/iplass`にアクセスし、iPLAssの設定画面が表示されることを確認してください。

## 7. TLSでの接続
### 7.1 証明書の作成とアタッチ
左端のメニューにて「ネットワーキング」を選択し、iPLAss用のロードバランサーを選びます。「カスタムドメイン」タブにて、「証明書を作成」をクリックしてください。次の内容で証明書を作成します。

| 項目 | 設定値 |
| ---- | ---- |
| 証明書の名前 | 任意の名前（LoadBalancerTlsCertificate-iplassなど）  |
| ドメインまたはサブドメインを指定 | 既存のサブドメイン（lightsail.iplass.orgなど） |

証明書の作成が完了したら、作成した証明書にて「アタッチ」をクリックしてロードバランサーに証明書を割り当てます。

### 7.2. HTTPSへのリダイレクト有効化
ロードバランサーの「ネットワーキング」タブに移動します。プロトコルにて「HTTP から HTTPS へのリダイレクトは非アクティブです」をクリックし、HTTPからHTTPSへのリダイレクトを有効化してください。

### 7.3. HTTPSでの接続確認
`https://設定したサブドメイン/iplass`にアクセスし、https通信でもiPLAssの設定画面が表示されることを確認します。

### 7.4 IPアドレスでのアクセスを無効化
左端のメニューにて「インスタンス」を選択し、作成したインスタンスを選択します。
「ネットワーキング」タブ内のIPv4ファイアウォールにて、アプリケーションがHTTPとなっている行を「ゴミ箱ボタン」をクリックして削除してください。

`http://パブリックIPv4アドレス/iplass`にアクセスし、接続ができないことを確認します。

## 8. iPLAssの設定&起動

### 8.1. iPLAssの設定
`https://設定したサブドメイン/iplass`にアクセスし、iPLAssのセットアップを実施します。

次のように各項目を設定します。各項目の詳細は[iPLAssの公式ドキュメント](https://iplass.org/docs/gettingstarted/gettingstarted/index.html#:~:text=iPLAss%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E5%AE%9F%E8%A1%8C)をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799220/163694f6-0c16-084f-aad4-4f6142d81eae.png)

| 項目 | 設定値 |
| ---- | ---- |
| Database | MySQL |
| DBA User Name | DBのRootユーザー名 |
| DBA Password | DBのRootユーザーPW |
| Binary data file store location | バインドマウント対象のディレクトリ内の任意のディレクトリ（ここでは、/var/lib/iplass/binary-store） |
| Automatic table creation | チェック |
| JDBC URL | ※自動で入力されます |
| Host Name | DBのエンドポイント（ls-xxxx.ap-northeast-1.rds.amazonaws.comなど） |
| Port Number | 3306 |
| Schema Name | mtdb |
| User Name | 新規で作成するMySQLのユーザー名（mysqluserなど） |
| Password | 新規で作成するMySQLのユーザーのPW（任意のPW） |
| Tenant Name | app |
| Administrator User ID | テナント管理者のユーザーID（任意のID） |
| Administrator Password | テナント管理者のPW（任意のPW） |

### 8.2. iPLAssの起動
#### コンテナの再起動
左上に「Please restart your application server」と表示されたらコンテナを再起動します。
```
# 起動しているコンテナのCONTAINER ID取得してメモ
sudo docker ps

# メモしたCONTAINER IDを指定してコンテナを再起動
sudo docker restart xxxx
```

#### iPLAssの起動 
`https://設定したサブドメイン/iplass/`にアクセスし、セットアップを待ちます。
セットアップ完了後、`https://設定したサブドメイン/iplass/app/gem/`にアクセスし、設定したAdministrator User IDとAdministrator Passwordでログインしてください。
※セットアップ完了後、アクセスできるようになるまでに若干の時間がかかる場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799220/73c643ca-da20-79a2-f556-fb7ff10cd35e.png)


ログインするとiPLAssのトップページが表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799220/4e976323-fe49-8a9f-5eac-f1c483de6d30.png)

# 最後に
今回の記事では、Lightsailを用いてiPLAssの環境構築を行う手順を解説しました。

iPLAssについての理解を深める[チュートリアル](https://iplass.org/docs/gettingstarted/index.html#_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB)、[ECサイトのサンプルアプリケーション](https://iplass.org/docs/sample/index.html)も提供しているので、興味のある方は是非ご確認ください！

iPLAssに興味をお持ちの方は、[こちら](https://itsol.dentsusoken.com/iplass/download/)から資料をダウンロードできます。今後ともiPLAssをよろしくお願いいたします！