サポート > Wagby Developer Network(R8) > サーバの運用 > MySQL,RabbitMQ,Redisを用いたアプリケーションの実行

ECS環境で外部データベースにMySQLを指定し、かつRabbiMQによる非同期処理と、Redisを用いたマルチセッション環境を構築する方法を説明します。(ここで説明する環境は、1つのEC2インスタンスにDockerが起動しており、Dockerのコンテナとして MySQL, RabbitMQ, Redis, wagbyapp(Tomcat) を起動するというものです。)

ビルド時の環境設定

WagbyDesignerの環境設定を下記のようにし、フルビルドを行います。

データベースの接続先URLなどは、環境にあわせて適切に読み替えてください。

データベース

データベースを "MySQL 8" とし、接続URLを "jdbc:mysql://db/wagbydb?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=JST" とする。ユーザ名とパスワードを "wagby" とする。

サーバ > HTTPセッション

格納方式を "Spring Session Redis" とする。Redisサーバの設定 > Redisホスト名を "redis" とする。

アプリケーション > メッセ—ジキュー

メッセージジョブ機能を使用するをチェックする。RabbitMQホスト名を "rabbitmq" とする。

設定ファイル

作業用フォルダに、次のファイルを用意します。

  • docker-compose.yml
  • Dockerfile
  • run_tomcat.sh

「HSQLDBを利用する wagbyapp を ECS 上で実行する」と比較すると、変更しているのは docker-compose.yml のみです。ここでは同ファイルの内容を掲載します。(Dockerfileとrun_tomcat.shは説明を省略します。)

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:
"image: mysql:5" は、MySQL Server 5系の最新のDockerイメージを用いて起動する、としたものです。今回説明するページでは JDBC ドライバに MySQL 8 系を使っていますが、MySQL JDBCドライバの8系は、MySQL Server 5.5以降に接続できるため問題ありません。

環境構築

docker-compose コマンドを使ってビルドします。

C:\Wagby-8.1.2>docker-compose build

コンソールに次のように表示されます。

mysql uses an image, skipping
redis uses an image, skipping
rabbitmq uses an image, skipping
Building wagbyapp
...
Successfully built 8dcdeedd0f11
Successfully tagged wagbyapp:latest

次のコマンドで Docker コンテナを起動します。wagbyapp (Tomcat) まで起動されます。

C:\Wagby-8.1.2>docker-compose up
Creating network "wagby-812_default" with the default driver
...

起動後、Web ブラウザの URL に http://localhost:8080/wagby/ と入力し、アプリケーションにログオンできることを確認します。

停止は次のコマンドで行います。

C:\Wagby-8.1.2>docker-compose down
docker-compose down -v でボリュームも削除することができます。

Amazon の Docker レジストリ (Amazon EC2 Container Registry) に Docker イメージを登録します。

現在のイメージを確認するには ecs-cli images コマンドを使います。

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

作成した Docker イメージを登録します。

C:\Wagby-8.1.2\ecs>ecs-cli push wagbyapp

コンソールにメッセージが表示され、Docker イメージが(ネットワーク経由で)EC2 に転送されます。ログ出力中に登録したリポジトリ名が出力されるので記録します。

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                          sha256:254b771d83d6cb275f25fd08575ccebc28bb5914fa5dfc2c551374359ecdb96c   28 hours ago        346 MB
wagbyapp            latest              sha256:49f47663e429f32166aaf73b2515a91a05bbf69ab9b414827113017b635e9586   55 seconds ago      348 MB

ecs/docker-compose.ymlに db,rabbitmq,redis コンテナの設定を追加します。

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

ecs\ecs-params.yml

ecs-params.yml は Docker Compose ファイルに対応しない、Amazon ECS用の設定を行います。

version: 1
task_definition:
    services:
        tomcat:
            mem_limit: 1000m

コンテナを起動する

次のコマンドで EC2 に転送された Docker コンテナを起動します。サービスとして起動するため ecs-cli compose service up となります。

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

動作を確認する

ロードバランサのホスト名に対応するURLにアクセスします。ブラウザに画面が表示されることを確認します。

http://ecswagbylb-1355833343.ap-northeast-1.elb.amazonaws.com/wagby/

このページで説明した設定ファイルをダウンロードできます。

このページの最後に、AWS の課金を抑えるための停止方法を整理します。今回紹介する方針は次の通りです。

  • VPCやサブネット、セキュリティグループ、ターゲットグループは課金されないのでそのままにしておく。
  • ECR,EFSはストレージの使用量と転送量に応じて課金されるが、今回はECRはそのままにしておく。
  • ロードバランサは今回は削除している。しかし作り直すとドメイン名が変わってしまうので、一時的な削除であれば消さないほうが良い。
  • EFSは永続化するファイルが格納されるので、同じデータで再度起動することがあるのであれば、消さないほうが良い。

参考:

削除

クラスタの削除

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インスタンスでマウントする

EC2インスタンスが一つしかない場合、一つだけ表示されます。

C:\Wagby-8.1.2\ecs>aws ec2 describe-instances  --query "Reservations[].Instances[].PublicIpAddress"
[
    "13.231.154.88"
]

今回は次に示すスクリプトを用意しました。

mount_efs.sh

#!/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 コマンドを使っています。

$ 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
Windows OS は標準で scp コマンドがありません。cygwin を別途インストールするか、別途 Linux OS を用意するといった方法があります。

コピーしたスクリプトをサーバで実行します。ここでは ssh コマンドを使って実行させた例を示します。

$ 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)
Windows OS は標準で ssh コマンドがありません。cygwin を別途インストールするか、別途 Linux OS を用意するといった方法があります。

サービスの作成と起動

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

動作の確認

ロードバランサのホスト名に対応するURLにアクセスし、表示されることを確認します。

http://ecswagbylb-1348081331.ap-northeast-1.elb.amazonaws.com/wagby/