MySQL,MQ,Redisを用いたアプリケーションの実行
最終更新日: 2020年6月12日
R8 | R9
WagbyDesignerの環境設定を下記のようにし、フルビルドを行います。
データベースを "MySQL 8" とし、接続URLを "jdbc:mysql://db/wagbydb?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=JST" とする。ユーザ名とパスワードを "wagby" とする。
格納方式を "Spring Session Redis" とする。Redisサーバの設定 > Redisホスト名を "redis" とする。
"メッセージジョブ機能を使用する" にて "ActiveMQ" をチェックする。デフォルトの接続先を ActiveMQ とする。アクティブMQ ブローカーURLを "failover:(tcp://localhost:61616)?timeout=10000" とする。
作業用フォルダに、次のファイルを用意します。
Dockerfileは init_db 実行に必要な設定を追加しています。具体的には環境変数の設定、mysql-client のインストール、ファイルのコピー、init_db を実行する起動スクリプト run_tomcat.sh の指定が含まれます。
run_tomcat.sh では、環境変数 INIT_DB に true が指定されており、初回起動の場合にinit_db.shを実行します。init_db.shを実行することで、データベースに初期テーブルを作成します。
次に docker-compose.yml ファイルの内容を掲載します。
docker-compose コマンドを使ってビルドします。
コンソールに次のように表示されます。
次のコマンドで Docker コンテナを起動します。wagbyapp (Tomcat) まで起動されます。
起動後、Web ブラウザの URL に http://localhost:8080/wagby/ と入力し、アプリケーションにログオンできることを確認します。
停止は次のコマンドで行います。
Amazon の Docker レジストリ (Amazon EC2 Container Registry) に Docker イメージを登録します。
現在のイメージを確認するには ecs-cli images コマンドを使います。
作成した Docker イメージを登録します。
コンソールにメッセージが表示され、Docker イメージが(ネットワーク経由で)EC2 に転送されます。ログ出力中に登録したリポジトリ名が出力されるので記録します。
イメージが追加されたことを確認します。
ecs/docker-compose.ymlに db,artemis,redis コンテナの設定を追加します。
ecs-params.yml は Docker Compose ファイルに対応しない、Amazon ECS用の設定を行います。
次のコマンドで EC2 に転送された Docker コンテナを起動します。サービスとして起動するため ecs-cli compose service up となります。
コンソールに次のように表示されます。
ロードバランサのホスト名に対応するURLにアクセスします。ブラウザに画面が表示されることを確認します。
http://ecswagbylb-1355833343.ap-northeast-1.elb.amazonaws.com/wagby/
メッセージングミドルウェアに RabbitMQ を利用した場合の設定ファイルを示します。
このページで説明した設定ファイルをダウンロードできます。
このページの最後に、AWS の課金を抑えるための停止方法を整理します。今回紹介する方針は次の通りです。
参考:
削除したサービスを再起動する方法を説明します。
EC2インスタンスが一つしかない場合、一つだけ表示されます。
今回は次に示すスクリプトを用意しました。
mount_efs.sh
サーバにこのスクリプトファイルをコピーします。ここでは scp コマンドを使っています。
コピーしたスクリプトをサーバで実行します。ここでは ssh コマンドを使って実行させた例を示します。
ロードバランサのホスト名に対応するURLにアクセスし、表示されることを確認します。
http://ecswagbylb-1348081331.ap-northeast-1.elb.amazonaws.com/wagby/
Designerの設定
ビルド時の環境設定
データベース
サーバ > HTTPセッション
アプリケーション > メッセ—ジキュー
開発機での動作確認
設定ファイル
docker-compose.yml
version: '3'
services:
wagbyapp:
build: .
image: "wagbyapp"
ports:
- "8080:8080"
depends_on:
- db
- redis
- rabbitmq
links:
- db:db
- redis:redis
- rabbitmq:rabbitmq
environment:
DB: "mysql8"
INIT_DB: "true"
MYSQL_HOST: "db"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
volumes:
- wagbyapp-upload_dir:/usr/local/upload_dir
- wagbyapp-export:/usr/local/export
db:
image: mysql:5
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
MYSQL_DATABASE: "wagbydb"
volumes:
- mysql-db:/var/lib/mysql
redis:
image: redis
volumes:
- redis-data:/data
artemis:
image: vromero/activemq-artemis
ports:
# - "61616:61616"
- "8161:8161"
environment:
ARTEMIS_USERNAME: "admin"
ARTEMIS_PASSWORD: "admin"
volumes:
wagbyapp-upload_dir:
wagbyapp-export:
mysql-db:
redis-data:
rabbitmq-data:
環境構築
C:\Wagby-8.1.2>docker-compose build
mysql uses an image, skipping
redis uses an image, skipping
artemis uses an image, skipping
Building wagbyapp
...
Successfully built 8dcdeedd0f11
Successfully tagged wagbyapp:latest
C:\Wagby-8.1.2>docker-compose up
Creating network "wagby-812_default" with the default driver
...
C:\Wagby-8.1.2>docker-compose down
EC2 に Docker イメージを登録する
C:\Wagby-8.1.2\ecs>ecs-cli images
REPOSITORY NAME TAG IMAGE DIGEST PUSHED AT SIZE
wagbyapp latest sha256:254b771d83d6cb275f25fd08575ccebc28bb5914fa5dfc2c551374359ecdb96c 28 hours ago 346 MB
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] Pushing image repository=234318443261.dkr.ecr.ap-northeast-1.amazonaws.com/wagbyapp tag=
INFO[0032] Image pushed
C:\Wagby-8.1.2\ecs>ecs-cli images
REPOSITORY NAME TAG IMAGE DIGEST PUSHED AT SIZE
wagbyapp
EC2 で Docker イメージを起動する
ecs/docker-compose.yml
version: '3'
services:
tomcat:
image: 234318443261.dkr.ecr.ap-northeast-1.amazonaws.com/wagbyapp
ports:
- "80:8080"
links:
- db:db
- redis:redis
- rabbitmq:rabbitmq
environment:
DB: "mysql8"
INIT_DB: "true"
MYSQL_HOST: "db"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
volumes:
- /efs/upload_dir:/usr/local/upload_dir
- /efs/export:/usr/local/export
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: tomcat
db:
image: mysql:5
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
MYSQL_DATABASE: "wagbydb"
volumes:
- /efs/mysql:/var/lib/mysql
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: mysql
redis:
image: redis
volumes:
- /efs/redis:/data
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: redis
artemis:
image: vromero/activemq-artemis
volumes:
- /efs/artemis:/var/lib/artemis
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: artemis
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:14"
INFO[0001] Updated the ECS service with a new task definition. Old containers will be stopped automatically, and replaced with new ones desiredCount=1 serviceName=ecs taskDefinition="ecs:14"
INFO[0046] (service ecs) has started 1 tasks: (task bcc7c296-ef5b-4b13-8dd1-3d91c687037d). timestamp="2018-12-12 11:23:36 +0000 UTC"
INFO[0065] Service status desiredCount=1 runningCount=1 serviceName=ecs
INFO[0065] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=ecs
動作を確認する
RabbitMQを利用する場合
docker-compose.yml
version: '3'
services:
wagbyapp:
build: .
image: "wagbyapp"
ports:
- "8080:8080"
depends_on:
- db
- redis
- rabbitmq
links:
- db:db
- redis:redis
- rabbitmq:rabbitmq
environment:
DB: "mysql8"
INIT_DB: "true"
MYSQL_HOST: "db"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
volumes:
- wagbyapp-upload_dir:/usr/local/upload_dir
- wagbyapp-export:/usr/local/export
db:
image: mysql:5
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
MYSQL_DATABASE: "wagbydb"
volumes:
- mysql-db:/var/lib/mysql
redis:
image: redis
volumes:
- redis-data:/data
rabbitmq:
image: rabbitmq
volumes:
- rabbitmq-data:/var/lib/rabbitmq
volumes:
wagbyapp-upload_dir:
wagbyapp-export:
mysql-db:
redis-data:
rabbitmq-data:
ecs/docker-compose.yml
version: '3'
services:
tomcat:
image: 234318443261.dkr.ecr.ap-northeast-1.amazonaws.com/wagbyapp
ports:
- "80:8080"
links:
- db:db
- redis:redis
- rabbitmq:rabbitmq
environment:
DB: "mysql8"
INIT_DB: "true"
MYSQL_HOST: "db"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
volumes:
- /efs/upload_dir:/usr/local/upload_dir
- /efs/export:/usr/local/export
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: tomcat
db:
image: mysql:5
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_USER: "wagby"
MYSQL_PASSWORD: "wagby"
MYSQL_DATABASE: "wagbydb"
volumes:
- /efs/mysql:/var/lib/mysql
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: mysql
redis:
image: redis
volumes:
- /efs/redis:/data
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: redis
rabbitmq:
image: rabbitmq
volumes:
- /efs/rabbitmq:/var/lib/rabbitmq
logging:
driver: awslogs
options:
awslogs-group: ecswagby
awslogs-region: ap-northeast-1
awslogs-stream-prefix: rabbitmq
ダウンロード
[参考] 課金の停止について
https://aws.amazon.com/jp/ecs/pricing/
https://aws.amazon.com/jp/ec2/pricing/
削除
クラスタの削除
C:\Wagby-8.1.2\ecs>ecs-cli compose service down --cluster-config ecswagbycluster
...
C:\Wagby-8.1.2\ecs>ecs-cli down --cluster-config ecswagbycluster
...
ロードバランサの削除
C:\Wagby-8.1.2\ecs>aws elbv2 delete-load-balancer --load-balancer-arn "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/fab7fdfdf1fe36f6"
EFSの削除
C:\Wagby-8.1.2\ecs>aws efs delete-mount-target --mount-target-id fsmt-0a56a02b
C:\Wagby-8.1.2\ecs>aws efs delete-mount-target --mount-target-id fsmt-1356a032
C:\Wagby-8.1.2\ecs>aws efs delete-file-system --file-system-id fs-e971adc8
再起動
ロードバランサの作成
C:\Wagby-8.1.2\ecs>aws elbv2 create-load-balancer --name ecswagbylb --subnets subnet-0c4d1541a528c63ba subnet-030085de17d83f973 --security-groups sg-0d6b4b276edf7d47c
{
"LoadBalancers": [
{
"LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/fcd0eafb08077e79",
"DNSName": "ecswagbylb-1348081331.ap-northeast-1.elb.amazonaws.com",
"CanonicalHostedZoneId": "Z14GRHDCWA56QT",
"CreatedTime": "2018-12-13T02:29:54.890Z",
"LoadBalancerName": "ecswagbylb",
"Scheme": "internet-facing",
"VpcId": "vpc-0208b3ab6a7cf8978",
"State": {
"Code": "provisioning"
},
"Type": "application",
"AvailabilityZones": [
{
"ZoneName": "ap-northeast-1c",
"SubnetId": "subnet-030085de17d83f973"
},
{
"ZoneName": "ap-northeast-1b",
"SubnetId": "subnet-0c4d1541a528c63ba"
}
],
"SecurityGroups": [
"sg-0d6b4b276edf7d47c"
],
"IpAddressType": "ipv4"
}
]
}
C:\Wagby-8.1.2\ecs>aws elbv2 create-listener --load-balancer-arn "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/fcd0eafb08077e79" --protocol HTTP --port 80 --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/a78a33bfd2d3de6b
{
"Listeners": [
{
"ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:listener/app/ecswagbylb/fcd0eafb08077e79/f0cd5223a61737a6",
"LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/ecswagbylb/fcd0eafb08077e79",
"Port": 80,
"Protocol": "HTTP",
"DefaultActions": [
{
"Type": "forward",
"TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/a78a33bfd2d3de6b"
}
]
}
]
}
EFSの作成
C:\Wagby-8.1.2\ecs>aws efs create-file-system --creation-token ecswagby-tomcat-fs
{
"OwnerId": "234318443261",
"CreationToken": "ecswagby-tomcat-fs",
"FileSystemId": "fs-a3a17e82",
"CreationTime": 1544668368.0,
"LifeCycleState": "creating",
"NumberOfMountTargets": 0,
"SizeInBytes": {
"Value": 0
},
"PerformanceMode": "generalPurpose",
"Encrypted": false,
"ThroughputMode": "bursting"
}
C:\Wagby-8.1.2\ecs>aws efs create-mount-target --file-system-id fs-a3a17e82 --subnet-id subnet-0c4d1541a528c63ba --security-groups sg-0f8deea37c13e8c2f
{
"OwnerId": "234318443261",
"MountTargetId": "fsmt-524abc73",
"FileSystemId": "fs-a3a17e82",
"SubnetId": "subnet-0c4d1541a528c63ba",
"LifeCycleState": "creating",
"IpAddress": "10.0.1.133",
"NetworkInterfaceId": "eni-0081d87e9cc688d18"
}
C:\Wagby-8.1.2\ecs>aws efs create-mount-target --file-system-id fs-a3a17e82 --subnet-id subnet-030085de17d83f973 --security-groups sg-0f8deea37c13e8c2f
{
"OwnerId": "234318443261",
"MountTargetId": "fsmt-594abc78",
"FileSystemId": "fs-a3a17e82",
"SubnetId": "subnet-030085de17d83f973",
"LifeCycleState": "creating",
"IpAddress": "10.0.0.115",
"NetworkInterfaceId": "eni-046dfdd0a968007c1"
}
クラスタの作成
C:\Wagby-8.1.2\ecs>ecs-cli up --keypair YOURkey1 --capability-iam --size 1 --instance-type t2.medium --cluster-config ecswagbycluster --security-group sg-0d6b4b276edf7d47c --subnets subnet-0c4d1541a528c63ba,subnet-030085de17d83f973 --vpc vpc-0208b3ab6a7cf8978
INFO[0000] 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[0001] Waiting for your cluster resources to be created...
INFO[0002] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
INFO[0062] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
INFO[0123] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
Cluster creation succeeded.
EFSをEC2インスタンスでマウントする
C:\Wagby-8.1.2\ecs>aws ec2 describe-instances --query "Reservations[].Instances[].PublicIpAddress"
[
"13.231.154.88"
]
#!/bin/sh
mkdir /efs
yum install -y nfs-utils
cp /etc/fstab /etc/fstab.bak
echo 'fs-a3a17e82.efs.ap-northeast-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' | tee -a /etc/fstab
mount -a
service ecs stop
service docker restart
service ecs start
mount | grep efs
$ scp -i .ssh/YOURkey1 mount_efs.sh ec2-user@13.231.154.88:
The authenticity of host '13.231.154.88 (13.231.154.88)' can't be established.
ECDSA key fingerprint is SHA256:ic6GTlvVrq76IsJcMnYMpczPEQrpMQbAu5UmLP2lzvg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '13.231.154.88' (ECDSA) to the list of known hosts.
Enter passphrase for key '.ssh/YOURkey1':
mount_efs.sh 100% 316 5.1KB/s 00:00
$ ssh -i .ssh/YOURkey1 ec2-user@13.231.154.88 sudo ./mount_efs.sh
Enter passphrase for key '.ssh/YOURkey1':
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
...
Complete!
fs-a3a17e82.efs.ap-northeast-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0
Redirecting to /bin/systemctl stop ecs.service
Redirecting to /bin/systemctl restart docker.service
Redirecting to /bin/systemctl start ecs.service
fs-a3a17e82.efs.ap-northeast-1.amazonaws.com:/ on /efs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.1.63,local_lock=none,addr=10.0.1.133)
サービスの作成と起動
C:\Wagby-8.1.2\ecs>ecs-cli compose service create --cluster-config ecswagbycluster --target-group-arn "arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/ecswagby-targets/a78a33bfd2d3de6b" --container-name tomcat --container-port 8080
INFO[0000] Using ECS task definition TaskDefinition="ecs:17"
INFO[0000] Created an ECS service service=ecs taskDefinition="ecs:17"
C:\Wagby-8.1.2\ecs>ecs-cli compose service up --cluster-config ecswagbycluster
INFO[0000] Using ECS task definition TaskDefinition="ecs:18"
INFO[0000] Updated the ECS service with a new task definition. Old containers will be stopped automatically, and replaced with new ones desiredCount=1 serviceName=ecs taskDefinition="ecs:18"
INFO[0031] (service ecs) has started 1 tasks: (task 00465caf-c094-4eb5-a650-fc87c169dc67). timestamp="2018-12-14 07:06:36 +0000 UTC"
INFO[0061] Service status desiredCount=1 runningCount=1 serviceName=ecs
INFO[0061] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=ecs
動作の確認