概要
dockerコンテナを管理するコマンドは複数あるが(docker, docker-composeなど)、デプロイ先に AWS ECS/ECR を考えた場合、ecs-cli ベースで管理すると便利そうだとわかった。
利用方法をメモしておく。
ecs-cli のよいところ
- 基本的には docker-compose と同じコマンド体系
- 基本的には docker-compose と同じ構成管理ファイル(docker-compose.yml)が使える
- ECS専用のパラメータは別ファイルとして切り出せる
- AWSの認証周りの面倒なところをうまいことラップしてくれる
手順
環境変数を設定する
アカウント情報を環境変数として設定する
direnv で自動読み込みされるようにしておく
.env
AWS_ACCESS_KEY_ID=1234xxxxx
AWS_SECRET_ACCESS_KEY=5678xxxxx
AWS_ACCOUNT_ID=08123xxxx
AWS_DEFAULT_REGION=us-east-1
AWS_REGION=us-east-1
AWS_ECR_REPOSITORY=08123xxxx.dkr.ecr.us-east-1.amazonaws.com
プロジェクトの設定を行う
認証情報をプロフィールとして保村する
$ ecs-cli configure profile --access-key $AWS_ACCESS_KEY_ID --secret-key $AWS_SECRET_ACCESS_KEY --profile-name hello-world
INFO[0000] Saved ECS CLI profile configuration hello-world.
~/.ecs/credentials にファイルが作成される
~/.ecs/credentials
$ cat ~/.ecs/credentials
version: v1
default: default
ecs_profiles:
default:
aws_access_key_id: 1234xxxxx
aws_secret_access_key: 5678xxxxx
hello-world:
aws_access_key_id: 1234xxxxx
aws_secret_access_key: 5678xxxxx
direnv で常に環境変数が設定されるならプロフィールの作成は必要ないかも
ECR にログインする
$ $(aws ecr get-login --no-include-email)
ECR にリポジトリを作成する
$ aws ecr create-repository --repository-name hello-world
ビルドの構成ファイルを作成する
FROM ruby:2.5-alpine
MAINTAINER cohakim "cohakim@gmail.com"
WORKDIR /app
ENV RAILS_ENV production
RUN \
apk upgrade --no-cache \
&& apk add --update --no-cache \
bash
COPY . /app
RUN chmod a+x entrypoint.sh
RUN ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
entrypoint.sh
#!/bin/bash
set -e
echo 'hello world'
exec $@
docker-compose.yml
version: '2'
services:
app:
build: .
image: 08123xxxx.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
docker-compose.yml で環境変数を使えたら最高だが、ecs-cli は環境変数を展開してくれないみたい
ECSにデプロイするときに困るのでここでは直接書いている
ビルドする
ecs-cli は build タスクに未対応っぽい
build は docker-compose で行う
$ docker-compose build
...
Successfully built e4879add2b3a
Successfully tagged 08123xxxx.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
ECR にPushする
ecs-cli push
が使える
$ ecs-cli push 08123xxxx.dkr.ecr.us-east-1.amazonaws.com/hello-world
INFO[0000] Getting AWS account ID...
INFO[0001] Tagging image image=hello-world repository=08123xxxx.dkr.ecr.us-east-1.amazonaws.com/hello-world tag=
INFO[0001] Image tagged
INFO[0002] Pushing image repository=08123xxxx.dkr.ecr.us-east-1.amazonaws.com/hello-world tag=
INFO[0006] Image pushed