ACMS Apexの検証環境を高速で用意する

ACMS Apex 実験室 ～ 実験その０「実験環境」
# はじめに
本記事の内容は、前半はほとんど他所でたくさん書かれた内容になっています。
このあと、いろいろ投稿するつもりなので、共通の環境を定義する意味で記事を書きました。
慣れるとだいたい1時間くらいで、ACMS Apexのマスターノードが使える環境が立ち上がります。

## 対象読者
AIやIoTのシステム構築に携わる方に読んでもらえる記事にしたいと思っています。
次のような技術者を対象にしています。

* Linuxが普通に扱える<BR>
どのレベルを普通というかは賛否両論あると思いますが…<BR>
コマンドラインで操作ができて、この記事に書いてあることが理解できる程度、と考えてください。
* 仮想環境やネットワークなど、環境構築に関する知識がある
* ACMS Apexが操作できる<BR>
エンタープライズ・データ連携基盤 シルバーコース受講者相当の知識があるとよいです。<BR>
本筋から外れるところは説明を端折りますので、各自補完していただけることを期待します。

## 環境
次のような環境を構築します。

* Windows10 Pro（Anniversary Update以降）
* Hyper-V<BR>
他の仮想環境でも構いません。各自、自分の環境に合わせて読み替えてください。
* CentOS7(CentOS-7-x86_64-Minimal-1810)
* OpenJDK(1.8.0_191-b12)
* MySQL community 5.7
* MySQL connector for java
* ACMS Apex 1.3

## 前提条件

* Hyper-Vの環境設定(ネットワーク等)ができていること
* 仮想マシンが外部ネットワークに接続できること[^1]
* Windows10がNTPサーバになっていること[^2]

[^1]: 次のURLを参考にするとNAT機能を設定できます。<br>[Tech TIPS：Windows 10／Windows Server 2016のHyper-VでNAT（ネットワークアドレス変換）機能を利用する](http://www.atmarkit.co.jp/ait/articles/1612/16/news039.html)
[^2]: 必須ではありませんが、次のURLのような設定がなされていることを前提に、NTPクライアントで母艦と時刻を同期する設定手順を入れてます。<br>[Windows 10 をNTPサーバにする手順](https://www.eaton-daitron.jp/techblog/5751.html)

## ネットワーク構成
次のようなネットワーク環境を想定して記事を書いています。

|アドレス|機器|
|:---|:---|
|192.168.249.1|母艦 仮想NIC側|
|192.168.249.20|仮想マシン(ACMS Apex マスターノード)|
|10.20.30.10|母艦 LAN側|
|10.20.30.200|DNS1|
|10.20.30.201|DNS2|
|proxy.aaa.bbb:8080|プロキシサーバ|

## 注意事項
いわゆる「やってみた」系の記事ですので、無保証、無サポートです。

* ここで構築する環境は動作が保証されたものではありません。<BR>
あくまでお試し程度に「使ってみる」ことを目的とした環境を構築します。
* フリーソフトや評価版を使うので、メーカーサポートはありません。<BR>
自己解決できない場合は、本記事のコメント欄でご相談ください。<BR>
解決できるかどうかはわかりませんが…

# インストールの準備
まずはメディアをご用意ください。

* CentOS インストールメディアのダウンロード<BR>
  minimalがインストールできればよいです。
* ACMS Apexインストールメディアのダウンロード<BR>
  DAL社サイトのお問い合わせページから、評価版をご希望の旨、お伝えください。<BR>
  また、その際ノード数を4(またはそれ以上の必要な数)とご指定ください。<BR>
  折り返し、ダウンロードサイトのURLをお知らせします。<BR>
  (お問い合わせ内容欄に、本記事を見たとご記入いただけると非常に助かります。)

# 構築手順
淡々と手順を説明していきます。
## 仮想マシンを作成
私が作った仮想マシンの設定は次の通りです。

|項目|設定値|
|:---|:---|
|メモリ|2048MB(動的メモリ有効 最小512MB 最大1048576MB メモリバッファー20%)|
|プロセッサ|1個の仮想プロセッサ|
|ハードドライブ|120GB(で作りましたが今のところ5GB弱くらいしか使っていません)|
|ネットワークアダプター|WinNAT|

## OSインストール
仮想マシンにCentOS7をインストールします。
詳細な手順はいろんなところで説明されているので、そちらを参照してください。
ポイントは次の通り。

* minimal(最小限のインストール)でインストール
* 日本語を選ぶところ以外はデフォルトの設定<br>
インストール先は自動構成<br>
あまり影響はないと思いますが、kdumpは無効にした
* ルートパスワードは"acms"を設定(した前提で説明する)
* ユーザは"acms"/"acms"(で作った前提で説明する)<br>
「このユーザーを管理者にする」にチェックを入れること

再起動後、最低限の初期設定をします。
Hyper-V マネージャーから仮想マシンに接続してacmsユーザでログインして、nmtuiコマンドを使って次の項目を設定。

```bash
sudo nmtui
```

|項目|設定値|
|:---|:---|
|ホスト名|apex-01-mst|
|IPv4設定|<手作業>|
|アドレス|192.168.249.20/24|
|ゲートウェイ|192.168.249.1|
|DNSサーバー|10.20.30.200<P>10.20.30.201|
|IPv6 設定|<無視する>|
|この接続にはIPv4アドレス設定が有効になります|[X]|
|自動的に接続する|[X]|
|全ユーザーに使用可能|[X]|

念のため、「接続をアクティベートする」で有効になっていることを確認します。
設定が反映されていること、SSHが動いていることを確認します。

```bash
ip a
ss -na | grep 22
```

コンソールからいったん抜けて、teratermを使ってacmsユーザでログインしなおします。

```bash
exit
```
hostsを編集。

```bash
sudo vi /etc/hosts
```

```conf:/etc/hosts
<最後に追加>
192.168.249.20 apex-01-mst
192.168.249.21 apex-01-alt
192.168.249.22 apex-01-s01
192.168.249.23 apex-01-s02
```

proxyサーバを設定

```bash
vi ~/.bash_profile
```

```conf:~/.bash_profile
<最後に追加>
export http_proxy=proxy.aaa.bbb:8080
export https_proxy=proxy.aaa.bbb:8080
export HTTP_PROXY=proxy.aaa.bbb:8080
export HTTPS_PROXY=proxy.aaa.bbb:8080
```

yumのproxyサーバも設定。

```bash
sudo vi /etc/yum.conf
```

```conf:/etc/yum.conf
<最後に追加>
proxy=http://proxy.aaa.bbb:8080
```

NTPはCentOS7標準のchronyを使います。
デフォルトのNTPサーバを全部無効にして母艦に合わせるように設定します。

```bash
rpm -qa | grep chrony
systemctl status chronyd
sudo cp -p /etc/chrony.conf /etc/chrony.conf.org
sudo vi /etc/chrony.conf
```

```conf:/etc/chrony.conf
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
server 192.168.249.1 iburst
```

```bash
sudo systemctl restart chronyd
chronyc sources
date
```

これから使う予定のポートに対して、ファイヤーウォールに穴をあけておきます。

```bash
sudo firewall-cmd --zone=public --add-port=2011/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2013/tcp --permanent
sudo firewall-cmd --zone=public --add-port=9999/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
```

ここらで一度再起動しておきます。

```bash
sudo shutdown -r now
```

改めてteratermを使ってacmsユーザでログインします。
コンポーネントのアップデートと追加パッケージのインストールをします。

```bash
sudo yum -y update
sudo yum -y install unzip
sudo yum -y install open-vm-tools
```

念のためもう一度再起動しておきます。

```bash
sudo shutdown -r now
```
teratermを使ってacmsユーザでログインします。

## MySQLをインストール
標準でインストールされているmariadbを削除し、mysqlのリポジトリからインストールします。

```bash
sudo yum -y remove mariadb-libs
su -
export http_proxy=proxy.aaa.bbb:8080
export https_proxy=proxy.aaa.bbb:8080
export HTTP_PROXY=proxy.aaa.bbb:8080
export HTTPS_PROXY=proxy.aaa.bbb:8080
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
exit
sudo yum -y install --enablerepo=mysql57-community mysql-community-server mysql-connector-java
sudo systemctl start mysqld.service
sudo systemctl status mysqld.service
sudo grep 'temporary password' /var/log/mysqld.log
sudo mysql_secure_installation
```
rootのパスワードはお好きにどうぞ。(ここではaA1!bB2cC3#dD4を指定しました。)
また、mysql_secure_installationの設定もご自由に。

```bash
sudo vi /etc/my.cnf
```

```conf:/etc/my.cnf
<最後に追加>
default-storage-engine=InnoDB
character-set-server=utf8
transaction-isolation=READ-COMMITTED
default_password_lifetime = 0

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8
```

```bash
sudo systemctl restart mysqld.service
```

## ACMS Apexをインストール

ACMSデータベースを作成します。

```bash
mysql -u root -p
```

```sql
CREATE DATABASE apex_db CHARACTER SET utf8;
USE apex_db;
GRANT ALL PRIVILEGES ON apex_db.* To acms@"%" IDENTIFIED BY "aA1!bB2cC3#dD4";
GRANT ALL PRIVILEGES ON apex_db.* To acms@localhost IDENTIFIED BY "aA1!bB2cC3#dD4";
FLUSH PRIVILEGES;
exit
```

ACMSのメディアからapex.zipを探し出して、teratermのSCP等でを~acmsにコピーしておきます。
モジュールを展開します。

```bash
mkdir apex
cd apex
unzip ../apex.zip
```

JDBCドライバを所定の場所にコピーします。

```bash
cp /usr/share/java/mysql-connector-java.jar bin/Common
```

設定ファイルをコピーし、編集します。

```bash
cp system.properties.org system.properties
cp local.properties.org local.properties
cp holidays.properties.org holidays.properties
cp apex.sh.org apex.sh
vi system.properties
```
```properties:system.properties
masterNodeName=apex-01-mst
dispatcher.master.pingTargetName=192.168.249.1

pse.storage_type=MYSQL
pse.storage_url=jdbc:mysql://localhost:3306/apex_db?useSSL=false

pse.storage_user=acms
pse.storage_password=aA1!bB2cC3#dD4

pse.encrypt_id=1234567890
```

DB自動構築と合わせて画面がつながることを確認しておきましょう。

```bash
./apex.sh Boot -construct
正常終了しました。
```

母艦のブラウザで下記のURLを開く
http://192.168.249.20:8080/login.html
※接続できるようになるまで数分かかるかもしれません。

次の値を入力して[ログイン]をクリック

|項目|値|
|:---|:---|
|テナント|(入力しない)|
|オペレーターID|administrator|
|パスワード|admin123|

ログインできることが確認できたらブラウザを閉じ、いったん止めます。

```bash
./apex.sh Shutdown -oi administrator -pwd admin123
正常終了しました。
```

# 初期設定と動作確認
この後、次のような操作でテスト用の設定と動作確認を行います。
手順と設定値のみ掲載します。それぞれの設定内容はマニュアル等で調べてください。

### Apexを起動

```bash
cd ~/apex
./apex.sh Boot
正常終了しました。
```

### 管理画面にログイン
母艦のブラウザで下記のURLを開く
http://192.168.249.20:8080/login.html

|項目|値|
|:---|:---|
|テナント|(入力しない)|
|オペレーターID|administrator|
|パスワード|admin123|

### マスターノードを登録する

[▼マスター] - [▼システム] - [ノード]
[新規作成]

|項目|値|
|:---|:---|
|ノード名|apex-01-mst|
|注釈|マスターノード|
|    |□ 指定しない|


[保存]
[OK]

### データストアを作る

```bash
cd ~
mkdir -p datastore/default
```
[▼マスター] - [▼システム] - [データストア]
[新規作成]

|項目|値|
|:---|:---|
|データストア名|DFS_DEFAULT|
|ノード名|apex-01-mst|
|ディレクトリ|/home/acms/datastore/default|
|デフォルトストア|■ デフォルトストアとする|
|暗号化|■ 暗号化する|
|注釈|■ 指定しない|


[保存]
[OK]

### 業務グループを作成する

[▼マスター] - [▼システム] - [業務グループ]
[新規作成]

|項目|値|
|:---|:---|
|業務グループ|WG_TEST|
|アプリケーションポートグループ|<font color=gray>(デフォルト値なし)</font>|
|データストア名|DFS_DEFAULT|
|運用日切り替え|<font color=gray>(00:00)</font>|
|完了保存日数|<font color=gray>(7)</font>|
|未完了保存日数|<font color=gray>(7)</font>|
|注釈|■ 指定しない|


[保存]
[OK]
[アクション▼] - [開始]

### オペレーターグループを作成する

[▼マスター] - [▼システム] - [オペレーターグループ]
[新規作成]

|項目|値|
|:---|:---|
|オペレーターグループ|OPG_TEST|
|注釈|■ 指定しない|
|システム運用権限|アドミニストレーター<br>マスク内容閲覧 ■<br>データダウンロード ■<br>セキュリティ情報閲覧 ■|

[▼業務グループ運用権限]
[新規作成]

|項目|値|
|:---|:---|
|業務グループ|WG_TEST|
|業務グループ運用権限|アドミニストレーター<br>マスク内容閲覧 ■<br>データダウンロード ■|

[OK]

[▼パスワードセキュリティポリシー]

|項目|値|
|:---|:---|
|パスワード有効期間（日）|■指定しない|
|パスワード変更通知期間（日）|■指定しない|

[保存]
[OK]

### オペレーターを作成する

[▼マスター] - [▼システム] - [オペレーター]
[新規作成]

|項目|値|
|:---|:---|
|オペレーターグループ|OPG_TEST|
|オペレーターID|OP_TEST|
|オペレーター名称|■ 指定しない|
|注釈|■ 指定しない|
|オペレーター／テンプレート管理|権限なし|
|権限|オペレーター自身に設定|
|システム運用権限|アドミニストレーター<br>マスク内容閲覧 ■<br>データダウンロード ■<br>セキュリティ情報閲覧 ■|

[▼業務グループ運用権限]
WG_TEST [詳細]

|項目|値|
|:---|:---|
|業務グループ運用権限|アドミニストレーター<br>マスク内容閲覧 ■<br>データダウンロード ■|

[OK]
[保存]
[OK]

### 新しく作ったオペレータでログインしなおす

[▼マスター] - [▼システム] - [オペレーター]
OPG_TESTの行の右にある「アクション▼」から「仮パスワード発行」を選択
[OK]
発行された仮パスワードをメモする
[OK]

[ログアウト]

|項目|値|
|:---|:---|
|テナント|(入力しない)|
|オペレーターID|OP_TEST|
|パスワード|<仮パスワード>|

<新しいパスワード>には好きな文字列を設定してください。

|項目|値|
|:---|:---|
|テナント|(入力しない)|
|オペレーターID|OP_TEST|
|現在のパスワード|<仮パスワード>|
|新しいパスワード|<新しいパスワード>|
|新しいパスワード（確認）|<新しいパスワード>|

[パスワード変更]

### アプリケーションポートグループを作成する

[▼マスター] - [▼アプリケーション] - [アプリケーションポートグループ]
[新規作成]

|項目|値|
|:---|:---|
|業務グループ|WG_TEST|
|アプリケーションポートグループ|APG_TEST|
|貸出|しない|
|注釈|■ 指定しない|
|デフォルトポートグループ|□デフォルトポートグループにする|

[保存]
[OK]

### アプリケーションポートを作成する
[▼マスター] - [▼アプリケーション] - [アプリケーションポート]
[新規作成]

|項目|値|
|:---|:---|
|アプリケーションポートグループ|APG_TEST|
|アプリケーションポート名|1|
|ノード名|apex-01-mst|

[保存]
[OK]
[アクション▼] - [開始]

### ファイル配布を作成する

```bash
mkdir -p ~/sample_ap/bin
```
[▼マスター] - [▼システム] - [ファイル配布]
[新規作成]

|項目|値|
|:---|:---|
|ファイル配布名|FD_SAMPLE|
|配布元のノード名|apex-01-mst|
|配布元のディレクトリ|/home/acms/sample_ap/bin|

[保存]
[OK]

### サンプルスクリプトを作成する
```bash
vi ~/sample_ap/bin/sample.sh
chmod +x ~/sample_ap/bin/sample.sh
```
```shell:sample.sh
#!/bin/sh
# $1:入力ファイルのパス
# $2:結果ファイルのパス

# 出力ファイル(相対パス)
outfile=`mktemp -p .`

# 入力ファイルの行数を数える
lines=`wc -l $1 | cut -d " " -f 1`

# 出力ファイルを作る(入力ファイルから変更なし)
cat $1 > $outfile

# 結果ファイルを作成する
echo lines=$lines > $2
echo output_file=$outfile >> $2
echo section=end >> $2

# 終了
exit 0
```
### スクリプトを配信する
[▼マスター] - [▼システム] - [ファイル配布]
FD_SAMPLEの行の右にある「アクション▼」から「同期」を選択
[実行中]ウィンドウが消えるのを待つ

### アプリケーション(外部アプリ)を作成する

[▼マスター] - [▼アプリケーション] - [アプリケーション]
[新規作成]

|項目|値|
|:---|:---|
|業務グループ|WG_TEST|
|アプリケーション名|サンプルアプリ|
|アプリケーションタイプ|外部アプリ実行|
|貸出|しない|
|アプリケーションポートグループ|APG_TEST|
|実行モジュールパス|//FD_SAMPLE/sample.sh|

外部アプリ入力パラメーター
[新規作成] ×2

|パラメーター名|必須区分|パラメーター値|デフォルト値|オプション文字列|オプション文字列の出力条件|オプション文字列の連結|
|:--|:--|:--|:--|:--|:--|:--|
|infile|必須|%input_file%||値があったらオプション文字列と値を出力|しない|
|resultfile|必須|%result_file%||値があったらオプション文字列と値を出力|しない|

[保存]
[OK]
[アクション▼] - [開始]

### 外部アプリ実行フローを作成する
[▼マスター] - [▼アプリケーション] - [フロー]
[新規作成]

|項目|値|
|:---|:---|
|業務グループ|WG_TEST|
|フロー名|サンプルフロー|
|貸出|しない|
|アプリケーションポートグループ|APG_TEST|

フロー入力パラメーターには何も設定しない
[フローエディター]をクリック
画面右のパレットのドロップダウンリストで[アプリケーションジョブ]を選択
[外部アプリ実行]の上でマウスの左ボタンを押し、そのまま[START]の横のマスまで移動して離す
画面右のパレットのドロップダウンリストで[コントロールジョブ]を選択
[正常終了]の上でマウスの左ボタンを押し、そのまま[EXTERNAL_APL_E...]の横のマスまで移動して離す
[START]の右側の丸でマウスの左ボタンを押し、そのまま[EXTERNAL_APL_E...]の左側の丸まで移動して離す
[EXTERNAL_APL_E...]の右側の丸でマウスの左ボタンを押し、そのまま[NORMAL_END]の左側の丸まで移動して離す
[EXTERNAL_APL_E...]の文字をクリック

|項目|値|
|:---|:---|
|フロー名|サンプルフロー|
|ジョブ名|サンプルジョブ|
|アプリケーション名|サンプルアプリ|

(操作後のフロー図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344679/27349b67-e862-2e4d-0f76-e0dc4ad469a1.png)

[OK]
[保存]
[OK]
[アクション▼] - [開始]

### アプリケーションを実行する
母艦側でテスト用のファイルを用意する

```text:sampledata.txt
1行目
2行目
3行目
```

[▼データ操作] - [ロード（フロー）]

|項目|値|
|:---|:---|
|業務グループ|WG_TEST|
|フロー名|サンプルフロー|
|データファイル|[ファイル選択]をクリックしてsampledata.txt|
|パラメーター|(空白)|
|予約登録|□する(チェックしない)|
|処理予定日時|(空白)|
|強制登録|□する(チェックしない)|

[実行]

### 実行結果を確認する
[▼状況] - [トップフロー]

|登録日時|簡易遷移状況|トップフロータスク状態|
|:---|:---|:---|
|(時刻)|:load=>:サンプルフロー|完了|

[▼状況] - [タスク]

|登録日時|業務グループ|ターゲットのID|ターゲットのID|ターゲットのID|ターゲットのID|
|:---|:---|:---|:---|:---|:---|
|(時刻)|WG_TEST|サンプルアプリ||完了||
|(時刻)|WG_TEST|サンプルフロー||完了||
|(時刻)|WG_TEST|load||完了||

サンプルアプリの右の[詳細]をクリック
[▶実行結果]をクリック
出力パラメータを確認

|キー|値|
|:---|:---|
|lines|3|

### Apexを停止
[ログアウト]

```bash
./apex.sh Shutdown -oi administrator -pwd admin123
正常終了しました。
```


お疲れさまでした。以上で環境構築と動作確認は終了です。
最後まで読んでいただき、ありがとうございました。