ElasticBeanstalk(MultiContainer)の利用方法


概要

Dockerを利用した本番運用をしたくなり、ElasticBeanstalkについて調べたのでまとめる。

ElasticBeanstalkとは

定義ファイルを準備する事で、AWS上のリソース(EC2,ECS,ELB...etc)を利用した環境を構築してくれるサービスであり、MultiContainerパターンではCloudFormation + ECSと同等の環境を設定ファイルのみで構築できる。

マルチコンテナパターン概要

  • Dockerrun.aws.jsonにコンテナの関係を定義して、ElasticBeanstalkのコマンドを叩けばデプロイされる。
  • 冗長化構成やスケール設定をしたい場合は.ebextensions内に追加設定を書いていくことで実現できる。

サンプルの構成図

サンプルのリソース関係図・構成図は下記のようになる

AWSリソース関係図

EC2内のContainer構成図

Dockerrun.aws.jsonのサンプル

ECRを利用したサンプルを下記に示す(書き方はdocker-composeのjson版?)

Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "nginx",
      "image": "xxxxx.amazonaws.com/xxxxx/nginx:latest",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "links": [
        "rails-app"
      ],
      // Log設定(今回はCloudWatchLogsを利用する)
      "logConfiguration" : {
        "logDriver": "awslogs",
        "options": {
          "awslogs-region": "ap-northeast-1",
          "awslogs-group": "/xxxxx/develop/nginx"
        }
      }
    },
    {
      "name": "rails-app",
      "image": "xxxxx.amazonaws.com/xxxxx/rails-app:latest",
      "essential": true,
      "memory": 256,
      "portMappings": [
        {
          "containerPort": 3000
        }
      ],
      "logConfiguration" : {
        "logDriver": "awslogs",
        "options": {
          "awslogs-region": "ap-northeast-1",
          "awslogs-group": "/xxxxx/develop/rails-app"
        }
      }
    }
  ]
}

ログの運用について

デフォルトでは各コンテナの標準出力がS3に保存されるが、それだと見づらいためCloudWatchLogsを利用する。
設定方法はこちらを参照
※ ElasticBeanstalkを利用する場合はLoggingDriverとしてFluentdを指定できない(カスタムAMIでなんとかいけるがオススメできない)

Deployまでの流れ

  1. AWS-CLIとEB-CLIの準備
  2. DockerImageの作成(説明省略)
  3. ImageをECRにPush(こちらを参照)
  4. EB-CLIでcreate or deploy

AWS-CLIとEB-CLIの準備

AWS-CLIのインストール

$ brew install awscli

EB-CLIのインストール

$ brew install awsebcli

EB-CLIでDeploy

初期設定

$ eb init
9) ap-northeast-1 : Asia Pacific (Tokyo) 
2) [ Create new Application ]
8) Multi-container Docker

残りはお好きなように設定

新規作成

$ eb create rails-app-develop

デプロイ

$ eb deploy rails-app-develop

オートスケールなどの細かい設定について

  • Docker.run.jsonと同階層に.ebextensionsを作成し、そこに追加設定ファイルを置く
  • 「ファイル名.config」としないと認識しないため注意
  • 拡張設定値はこちらを参照

階層サンプル

.
├── .ebextensions
│   ├── 00-vpc.config
│   └── 01-autoscaling.config
├── .elasticbeanstalk 
│   └── config.yml
└── Dockerrun.aws.json