HSQLDBを利用する wagbyapp を ECS 上で実行する
最終更新日: 2020年6月12日
R8 | R9
作業用フォルダをWagbyのインストールフォルダ(文中では C:\Wagby-8.1.2 )とします。ローカル(自マシン、すなわち開発機)で Docker イメージを作成し、起動するために次の2つのファイルを用意します。
docker-compose.yml ではデータベース環境変数にて "hsqldb" を指定しています。INIT_DB に "true" を指定することでビルド後の初期データインポートを行います。またビルドしたアプリケーションのイメージ名 (image) を "wagbyapp" としています。
docker-compose.yml 内の "environment" で指定する環境変数で、application.properties の値を書き換えることができます。キー名を大文字とし、区切り文字を "." から "_" に変えます。また、"-" や "_" は除きます。(*1)
例えば application.properties に含まれる spring.redis.host の値を書き換える場合は次のようにします。
Docker コンテナを作成するための手順を設定します。各パラメータは適切に変更してご利用ください。(例えば maintainer には作業者のメールアドレスを指定します。WAGBY_MX や WAGBY_MS で指定するメモリの大きさも環境にあわせて変更するとよいでしょう。)
HSQLDB を利用した Wagby アプリケーション (wagbyapp) のビルドを行います。
ログ出力はファイルへは行わず、標準出力にするように変更します。このためビルド前に下記2つのカスタマイズファイルを追加します。
なお、この修正により "管理処理 > システムログ閲覧"、"管理処理 > 統計情報"、ログを監視するジョブ(AlterMailFromLog)機能は利用できなくなります。
詳細は "環境 > オートスケール環境で運用する > システムログ閲覧" をご覧下さい。
ビルド後、docker-compose コマンドを使って (wagbyapp を起動するための) Docker イメージを作成します。
コンソールに次のように表示されます。
次のコマンドで Docker コンテナを起動します。wagbyapp (Tomcat) まで起動されます。
Web ブラウザの URL に http://localhost:8080/wagby/ と入力し、アプリケーションにログオンできることを確認します。
次のコマンドで Docker コンテナを停止します。wagbyapp (Tomcat) も停止します。
コンソールに次のように表示されます。
IAMユーザにて実行している場合、EC2 にコンテナを登録するため、Permissions policiesにAmazonEC2ContainerRegistryFullAccessを追加する必要があります。aws コマンドで次のように入力します。
それではコンテナを EC2 に登録してみましょう。ecs-cli push コマンドを使います。
コンソールにメッセージが表示され、Docker イメージが(ネットワーク経由で)EC2 に転送されます。ログ出力中に登録したリポジトリ名が出力されるので記録します。
Docker イメージを転送後、起動用のクラスタを作成します。
コマンドを実行すると次のようなメッセージが表示されます。
ECS のための設定ファイルをサブフォルダ ecs に置きます。ecs\docker-compose.ymlを下記のように作成します。image の指定は、ECS で割り当てられた名前を使います。ecs-cli pushを実行した際に出力されたリポジトリ名を指定します。
ecs-params.yml は Docker Compose ファイルに対応しない、Amazon ECS用の設定を行います。詳細はAmazon ECS パラメータの使用をご覧ください。
ここでは ecs-params.ymlを下記のように作成します。mem_limitの指定を行わない場合の標準値は512mですが、メモリが少ないためwagbyappの起動に失敗します。この対策を行なっています。(ここでは1000mとしていますが、アプリケーションの規模にあわせて大きめの数値を指定するようにしてください。)
次のコマンドで EC2 に転送された Docker コンテナを起動します。サービスとして起動するため ecs-cli compose service up となります。
コンソールに次のように表示されます。
ecs-cli ps コマンドで状態を確認します。
状態が表示されます。State が "RUNNING" であれば起動しています。
この例ではアドレス 18.179.43.112 で起動していますので、Web ブラウザの URL に http://18.179.43.112 を入力してアプリケーションに接続できます。
次のコマンドでコンテナを停止させることができます。サービスを停止するため ecs-cli compose service down となります。
コンソールにコンテナを停止するメッセージが表示されます。
この状態はまだ課金されています。課金を止めて完全に停止させるためには ecs-cli down コマンドを使ってクラスタの削除まで行う必要があります。
次に AWS のロードバランサを設定してみます。次のページを参考にします。
subnets, security-groups はVPCのサブネット、セキュリティグループからECSに対応するものを見つけて設定します。
はじめに新しいロードバランサを作成します。
次のようなメッセージが表示されます。
次にターゲットグループを作成します。ターゲットグループはロードバランサがリクエストをルーティングするために必要です。詳しくはApplication Load Balancer のターゲットグループをご覧ください。
次のようなメッセージが表示されます。
続いてリスナを作成します。リスナとは、設定したプロトコルとポートを使用して接続リクエストをチェックするプロセスです。詳しくはApplication Load Balancer のリスナーをご覧ください。
次のようなメッセージが表示されます。
ここまでの手順でロードバランサの準備ができました。サービスを起動します。
次のようなメッセージが表示されます。
状態を確認します。
最後に削除の方法を説明します。クラスタを削除する場合、その前にロードバランサを削除してください。
ロードバランサとターゲットグループの削除は次のコマンドで行います。
最後にクラスタを削除します。
このページで説明した設定ファイルをダウンロードできます。
開発機の設定ファイル
docker-compose.yml
version: '3'
services:
wagbyapp:
build: .
image: "wagbyapp"
ports:
- "8080:8080"
environment:
DB: "hsqldb"
INIT_DB: "true"
volumes:
- wagbyapp-upload_dir:/usr/local/upload_dir
- wagbyapp-export:/usr/local/export
volumes:
wagbyapp-upload_dir:
wagbyapp-export:
application.propertiesの値を書き換える
...
environment:
SPRING_REDIS_HOST: "redis"
...
Dockerfile
#
# VERSION 0.0.1
#
FROM tomcat:8.5
LABEL maintainer="YOURMAILADDRESS"
ARG WAGBY_MX="512m"
ARG WAGBY_MS="64m"
ARG WAGBY_WEBAPPS_DIR="wagby"
# Tomcat configuration file
RUN rm -r $CATALINA_HOME/webapps/∗
ADD ./wagbyapp/conf/web.xml $CATALINA_HOME/conf/web.xml
ADD ./wagbyapp/conf/context.xml $CATALINA_HOME/conf/context.xml
ADD ./wagbyapp/conf/app_jaas.config $CATALINA_HOME/conf/app_jaas.config
ADD ./wagbyapp/conf/logging.properties $CATALINA_HOME/conf/logging.properties
ADD ./wagbyapp/lib/j_conint.jar $CATALINA_HOME/lib/j_conint.jar
ADD ./wagbyapp/lib/spring-instrument-tomcat.jar $CATALINA_HOME/lib/spring-instrument-tomcat.jar
ENV CATALINA_OPTS "-server -Xmx$WAGBY_MX -Xms$WAGBY_MS -Djava.security.auth.login.config=$CATALINA_HOME/conf/app_jaas.config -Dsun.nio.cs.map=x-windows-iso2022jp/ISO-2022-JP -Duser.timezone=Asia/Tokyo -XX:+IgnoreUnrecognizedVMOptions --add-modules=java.xml.bind,java.activation,java.xml.ws.annotation"
# Database JDBC Driver
ADD ./customize/tomcat/lib $CATALINA_HOME/lib
ADD ./wagbyapp/lib/hsqldb.jar $CATALINA_HOME/lib/hsqldb.jar
# Web application
ADD ./wagbyapp/webapps/$WAGBY_WEBAPPS_DIR $CATALINA_HOME/webapps/$WAGBY_WEBAPPS_DIR
WORKDIR $CATALINA_HOME/bin
VOLUME /usr/local/export
VOLUME /usr/local/upload_dir
ビルド
C:\Wagby-8.1.2>docker-compose build
Building wagbyapp
Step 1/29 : FROM tomcat:8.5
...
Step 29/29 : VOLUME /usr/local/upload_dir
---> Running in 61f95749dc11
Removing intermediate container 61f95749dc11
---> 4ab97284d8c5
Successfully built 4ab97284d8c5
Successfully tagged wagbyapp:latest
動作の確認
C:\Wagby-8.1.2>docker-compose up
停止
C:\Wagby-8.1.2>docker-compose down
Stopping wagby-812_wagbyapp_1 ... done
wagby-812_wagbyapp_1 exited with code 137
Removing wagby-812_wagbyapp_1 ... done
Removing network wagby-812_default
EC2 に Docker イメージを登録する
C:\Wagby-8.1.2>aws --profile admin iam attach-user-policy --user-name ecswagby --policy-arn "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess"
C:\Wagby-8.1.2\ecs>ecs-cli push wagbyapp
INFO[0000] Getting AWS account ID...
INFO[0001] Tagging image image=wagbyapp repository=234318443261.dkr.ecr.ap-northeast-1.amazonaws.com/wagbyapp tag=
INFO[0002] Image tagged
INFO[0002] Creating repository repository=wagbyapp
INFO[0002] Repository created
INFO[0002] Pushing image repository=234318443261.dkr.ecr.ap-northeast-1.amazonaws.com/wagbyapp tag=
INFO[0046] Image pushed
クラスタの作成
C:\Wagby-8.1.2\ecs>ecs-cli up --keypair REGISTERED_PUBLIC_KEY --capability-iam --size 1 --instance-type t2.medium --cluster-config ecswagbycluster --azs ap-northeast-1b,ap-northeast-1c
INFO[0001] Using recommended Amazon Linux 2 AMI with ECS Agent 1.22.0 and Docker version 18.06.1-ce
INFO[0001] Created cluster cluster=ecswagbycluster region=ap-northeast-1
INFO[0002] Waiting for your cluster resources to be created...
INFO[0002] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
INFO[0063] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
INFO[0124] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
VPC created: vpc-05c77efe41a5f4355
Security Group created: sg-0e06742f54bf08e0d
Subnet created: subnet-0874079a4c144eb47
Subnet created: subnet-0c9bec06013886666
Cluster creation succeeded.
EC2 で Docker イメージを起動する
ecs\docker-compose.yml
version: '3'
services:
tomcat:
image: 234318443261.dkr.ecr.ap-northeast-1.amazonaws.com/wagbyapp
ports:
- "80:8080"
environment:
DB: "hsqldb"
INIT_DB: "true"
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: tomcat
ecs\ecs-params.yml
version: 1
task_definition:
services:
tomcat:
mem_limit: 1000m
コンテナを起動する
C:\Wagby-8.1.2\ecs>ecs-cli compose service up --cluster-config ecswagbycluster
INFO[0000] Using ECS task definition TaskDefinition="ecs:6"
INFO[0000] Created an ECS service service=ecs taskDefinition="ecs:6"
INFO[0001] Updated ECS service successfully desiredCount=1 serviceName=ecs
INFO[0016] Service status desiredCount=1 runningCount=1 serviceName=ecs
INFO[0016] (service ecs) has started 1 tasks: (task e7fd761c-ba39-4e70-818d-c3393780e4c7). timestamp="2018-12-11 09:28:25 +0000 UTC"
INFO[0016] (service ecs) has reached a steady state. timestamp="2018-12-11 09:28:34 +0000 UTC"
INFO[0016] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=ecs
動作を確認する
C:\Wagby-8.1.2\ecs>ecs-cli ps
Name State Ports TaskDefinition Health
e7fd761c-ba39-4e70-818d-c3393780e4c7/tomcat RUNNING 18.179.43.112:80->8080/tcp ecs:6 UNKNOWN
コンテナを停止する
C:\Wagby-8.1.2\ecs>ecs-cli compose service down --cluster-config ecswagbycluster
INFO[0000] Updated ECS service successfully desiredCount=0 serviceName=ecs
INFO[0000] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=ecs
INFO[0000] Deleted ECS service service=ecs
INFO[0000] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=ecs
注意
ロードバランサの作成
ロードバランサの作成
C:\Wagby-8.1.2\ecs>aws elbv2 create-load-balancer --name ecswagbylb --subnets subnet-0874079a4c144eb47 subnet-0c9bec06013886666 --security-groups sg-0e06742f54bf08e0d
{
"LoadBalancers": [
{
"LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/85f099afcbe40d97",
"DNSName": "ecswagbylb-1734893221.ap-northeast-1.elb.amazonaws.com",
"CanonicalHostedZoneId": "Z14GRHDCWA56QT",
"CreatedTime": "2018-12-11T11:18:33.930Z",
"LoadBalancerName": "ecswagbylb",
"Scheme": "internet-facing",
"VpcId": "vpc-05c77efe41a5f4355",
"State": {
"Code": "provisioning"
},
"Type": "application",
"AvailabilityZones": [
{
"ZoneName": "ap-northeast-1b",
"SubnetId": "subnet-0874079a4c144eb47"
},
{
"ZoneName": "ap-northeast-1c",
"SubnetId": "subnet-0c9bec06013886666"
}
],
"SecurityGroups": [
"sg-0e06742f54bf08e0d"
],
"IpAddressType": "ipv4"
}
]
}
ターゲットグループの作成
C:\Wagby-8.1.2\ecs>aws elbv2 create-target-group --name ecswagby-targets --protocol HTTP --port 80 --health-check-path /wagby/logonPage.do --vpc-id vpc-05c77efe41a5f4355
{
"TargetGroups": [
{
"TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/366752e8267dc3ea",
"TargetGroupName": "ecswagby-targets",
"Protocol": "HTTP",
"Port": 80,
"VpcId": "vpc-05c77efe41a5f4355",
"HealthCheckProtocol": "HTTP",
"HealthCheckPort": "traffic-port",
"HealthCheckEnabled": true,
"HealthCheckIntervalSeconds": 30,
"HealthCheckTimeoutSeconds": 5,
"HealthyThresholdCount": 5,
"UnhealthyThresholdCount": 2,
"HealthCheckPath": "/wagby/logonPage.do",
"Matcher": {
"HttpCode": "200"
},
"TargetType": "instance"
}
]
}
リスナの作成
C:\Wagby-8.1.2\ecs>aws elbv2 create-listener --load-balancer-arn "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/85f099afcbe40d97" --protocol HTTP --port 80 --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/366752e8267dc3ea
{
"Listeners": [
{
"ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:listener/app/ecswagbylb/85f099afcbe40d97/0c08eed6e55aeb89",
"LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/85f099afcbe40d97",
"Port": 80,
"Protocol": "HTTP",
"DefaultActions": [
{
"Type": "forward",
"TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/366752e8267dc3ea"
}
]
}
]
}
サービスの起動
C:\Wagby-8.1.2\ecs>ecs-cli compose service up --cluster-config ecswagbycluster --target-group-arn "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/366752e8267dc3ea" --container-name tomcat --container-port 8080
INFO[0000] Using ECS task definition TaskDefinition="ecs:9"
INFO[0000] Created an ECS service service=ecs taskDefinition="ecs:9"
INFO[0001] Updated ECS service successfully desiredCount=1 serviceName=ecs
INFO[0016] Service status desiredCount=1 runningCount=1 serviceName=ecs
INFO[0016] (service ecs) has started 1 tasks: (task 84dc443a-ace9-4299-af96-9655152c2275). timestamp="2018-12-11 11:37:23 +0000 UTC"
INFO[0016] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=ecs
C:\Wagby-8.1.2\ecs>ecs-cli ps
Name State Ports TaskDefinition Health
84dc443a-ace9-4299-af96-9655152c2275/tomcat RUNNING 18.179.43.112:80->8080/tcp ecs:9 UNKNOWN
クラスタの削除
C:\Wagby-8.1.2\ecs>aws elbv2 delete-load-balancer --load-balancer-arn "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/85f099afcbe40d97"
C:\Wagby-8.1.2\ecs>aws elbv2 delete-target-group --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/366752e8267dc3ea
C:\Wagby-8.1.2\ecs>ecs-cli down --cluster ecswagbycluster
ダウンロード