概要
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までの流れ
- AWS-CLIとEB-CLIの準備
- DockerImageの作成(説明省略)
- ImageをECRにPush(こちらを参照)
- 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