kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

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

筆休め

Amazonのコンテナサービスを利用して、アプリを動作させる流れを確認してきました。コンテナサービスを利用すると、開発環境と本番環境でミドルウェアでの違いによる、挙動の差異は生まれません。コンテナによるサービスの運用は、障害発生時にも原因の切り分けに強くなるので、積極的に試みたいですね。

以上、「SpringBootのアプリをAmazon ECSで動作させる」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.