SpringBootのアプリをAmazon ECSで動作させる
本章では、Amazon Elastic Container Service(Amazon ECS)を利用して、Spring Bootのアプリをコンテナ上にデプロイする方法について共有します。
Amazonにはコンテナのマネージドサービスが用意されています。Dockerコンテナのイメージを登録しておくAmazon ECRと、コンテナを実行し簡単にスケールできるAmazon ECSです。
aws.amazon.com
aws.amazon.com
サービスの運用は、開発環境と違う点がいくつかあります。サーバーのOSによる違いやインストールされたソフトウェアによる違いです。それら開発環境と本番環境との違いを埋めるため、コンテナサービスを本番環境で利用できる、AWSのサービスを利用して確認してみます。
Amazon ECRとAmazon ECSの利用の流れ
認証情報の設定
まずは、AWSアカウントの設定、共通鍵の登録を行います。
# AWSアカウントとデフォルトリージョンの設定 $ aws configure # キーペアーの生成 $ ssh-keygen -t rsa -f 【ファイル名】.pem # EC2にキーペアーを登録 $ aws ec2 import-key-pair --key-name 【キーペアー名】 --public-key-material file://./【ファイル名】.pem.pub --region 【リージョン名】
ひとつ注意として、キーペアーのファイル名を指定する際に、「file://」を忘れずに指定する必要があります。
ECRへのコンテナイメージの登録
次に、Amazon ECRを利用して、Spring Bootのコンテナイメージを登録します。ここでSpringBootのアプリやMySQLを登録します。MySQLのイメージは、スキーマを構築するために利用します。
# ECRへのログイン $ $(aws --region 【リージョン名】 ecr get-login --no-include-email) # イメージを格納するリポジトリを作成 $ aws --region 【リージョン名】 ecr create-repository --repository-name 【リポジトリ名】 # プッシュするイメージのタグ打ち $ docker tag 【ローカル上のイメージ名】:【タグ】 xxxxxxxxxxxx.dkr.ecr.xx-xxxx-x.amazonaws.com/【ECRのリポジトリ名】:【タグ】 # イメージのプッシュ $ docker push xxxxxxxxxxxx.dkr.ecr.xx-xxxx-x.amazonaws.com/【ECRのリポジトリ名】
ECSでの起動
最後に、Amazon ECSでコンテナを起動させます。Docker-composeのECS向けyamlファイルと起動オプションを指定したyamlファイルを用意します。
【ecs.yml】
version: "3" services: redis: image: redis:latest ports: - 6379:6379 mysql: image: xxxxxxxxxxxx.dkr.ecr.xx-xxxx-x.amazonaws.com/mysql:yymmdd environment: MYSQL_ALLOW_EMPTY_PASSWORD: "yes" MYSQL_DATABASE: "Hoge" MYSQL_USER: "Foo" MYSQL_PASSWORD: "Piyo" ports: - 3306:3306 nginx: image: xxxxxxxxxxxx.dkr.ecr.xx-xxxx-x.amazonaws.com/nginx:yymmdd links: - app ports: - 8081:81 # ポートはサービスによって変わる app: image: xxxxxxxxxxxx.dkr.ecr.xx-xxxx-x.amazonaws.com/app:yymmdd links: - mysql - redis ports: - 8080:8080 # ポートはサービスによって変わる environment: CATALINA_OPTS: "-Xms512m -Xmx1024m" SPRING_PROFILES_ACTIVE: "local" SPRING_DATASOURCE_URL: "jdbc:mysql://mysql:3306/Hoge?useUnicode=true&characterEncoding=UTF-8" SPRING_REDIS_HOST: "redis"
【ecs-params.yml】
version: 1 task_definition: services: app: mem_reservation: "2g" # SpringBootの起動にはメモリを多く使用するためメモリを多く確保する
コンテナの構成ファイルを指定して、クラスタを立ち上げます。クラスタの立ち上げには少々時間がかかるため、コンテナの起動コマンドは少し遅らせてから実行するのがよいです。
# ecsコマンドのインストール $ brew install amazon-ecs-cli # リージョンとクラスタ名を設定 $ ecs-cli configure --region 【リージョン名】 --cluster 【クラスタ名】 # クラスタの立ち上げ $ ecs-cli up --keypair 【キーペアー名】 --capability-iam --size 【EC2の数】 --instance-type 【EC2のインスタンスサイズ】 --force # コンテナ起動 $ ecs-cli compose -f ecs.yml --ecs-params ecs-params.yml up # コンテナの実行状況を確認 $ ecs-cli compose -f ecs.yml ps # コンテナを停止 $ ecs-cli compose -f ecs.yml stop # コンテナをクラスタごと、すべて削除 $ ecs-cli down --force