サポート > Wagby Developer Network(R8) > サーバの運用 > HSQLDBを利用する wagbyapp を ECS 上で実行する

内蔵データベース HSQLDB を利用する wagbyapp を Amazon Elastic Container Service (ECS) で実行する方法を説明します。

作業用フォルダをWagbyのインストールフォルダ(文中では C:\Wagby-8.1.2 )とします。ローカル(自マシン、すなわち開発機)で Docker イメージを作成し、起動するために次の2つのファイルを用意します。

  • docker-compose.yml
  • Dockerfile

docker-compose.yml

docker-compose.yml ではデータベース環境変数にて "hsqldb" を指定しています。INIT_DB に "true" を指定することでビルド後の初期データインポートを行います。またビルドしたアプリケーションのイメージ名 (image) を "wagbyapp" としています。

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:
この docker-compose.yml は開発機用です。upload_dir や export フォルダは、作業用マシンのフォルダを割り当てています。 ECS用のdocker-compose.ymlとは別となります。ECS用の設定は後述します。

Dockerfile

Docker コンテナを作成するための手順を設定します。各パラメータは適切に変更してご利用ください。(例えば maintainer には作業者のメールアドレスを指定します。WAGBY_MX や WAGBY_MS で指定するメモリの大きさも環境にあわせて変更するとよいでしょう。)

#
# 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

HSQLDB を利用した Wagby アプリケーション (wagbyapp) がビルド済みとします。docker-compose コマンドを使って (wagbyapp を起動するための) Docker イメージを作成します。

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

動作の確認

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

C:\Wagby-8.1.2>docker-compose up

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

停止

次のコマンドで Docker コンテナを停止します。wagbyapp (Tomcat) も停止します。

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
docker-compose down -v でボリュームも削除することができます。

IAMユーザにて実行している場合、EC2 にコンテナを登録するため、Permissions policiesにAmazonEC2ContainerRegistryFullAccessを追加する必要があります。aws コマンドで次のように入力します。

C:\Wagby-8.1.2>aws --profile admin iam attach-user-policy --user-name ecswagby --policy-arn "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess"

それではコンテナを EC2 に登録してみましょう。ecs-cli push コマンドを使います。

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] 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

クラスタの作成

Docker イメージを転送後、起動用のクラスタを作成します。

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
  • --keypair オプションは事前に登録した ssh の公開鍵を指定します。上のコマンドの "REGISTERED_PUBLIC_KEY" 部分を適切に読み替えてください。具体的には "EC2 > ネットワーク&セキュリティ > キーペア" に登録されているものです。詳細はAmazon EC2 のキーペアをお読みください。
  • --azs オプションはアベイラビリティゾーンを指定するものです。

コマンドを実行すると次のようなメッセージが表示されます。

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.

ECS のための設定ファイルをサブフォルダ ecs に置きます。ecs\docker-compose.ymlを下記のように作成します。image の指定は、ECS で割り当てられた名前を使います。ecs-cli pushを実行した際に出力されたリポジトリ名を指定します。

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

ecs-params.yml は Docker Compose ファイルに対応しない、Amazon ECS用の設定を行います。詳細はAmazon ECS パラメータの使用をご覧ください。

ここでは ecs-params.ymlを下記のように作成します。mem_limitの指定を行わない場合の標準値は512mですが、メモリが少ないためwagbyappの起動に失敗します。この対策を行なっています。(ここでは1000mとしていますが、アプリケーションの規模にあわせて大きめの数値を指定するようにしてください。)

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: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

動作を確認する

ecs-cli ps コマンドで状態を確認します。

C:\Wagby-8.1.2\ecs>ecs-cli ps

状態が表示されます。State が "RUNNING" であれば起動しています。

Name                                         State    Ports                       TaskDefinition  Health
e7fd761c-ba39-4e70-818d-c3393780e4c7/tomcat  RUNNING  18.179.43.112:80->8080/tcp  ecs:6           UNKNOWN

この例ではアドレス 18.179.43.112 で起動していますので、Web ブラウザの URL に http://18.179.43.112 を入力してアプリケーションに接続できます。

コンテナを停止する

次のコマンドでコンテナを停止させることができます。サービスを停止するため ecs-cli compose service down となります。

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
この状態はまだ課金されています。課金を止めて完全に停止させるためには ecs-cli down コマンドを使ってクラスタの削除まで行う必要があります。

次に AWS のロードバランサを設定してみます。次のページを参考にします。

subnets, security-groups はVPCのサブネット、セキュリティグループからECSに対応するものを見つけて設定します。

ここでは ecs-cli up で作成されたVPC、サブネット、セキュリティグループを用います。これらを事前に作る方法は、次ページで説明します。

ロードバランサの作成

はじめに新しいロードバランサを作成します。

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"
        }
    ]
}

ターゲットグループの作成

次にターゲットグループを作成します。ターゲットグループはロードバランサがリクエストをルーティングするために必要です。詳しくはApplication Load Balancer のターゲットグループをご覧ください。

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"
        }
    ]
}

リスナの作成

続いてリスナを作成します。リスナとは、設定したプロトコルとポートを使用して接続リクエストをチェックするプロセスです。詳しくはApplication Load Balancer のリスナーをご覧ください。

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

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