CircleCI を使って,ECS に Docker コンテナをデプロイする方法を調べていたら,CircleCI が公開しているサンプルプロジェクト circleci/go-ecs-ecr の存在を知ったので,さっそく試してみた.
circleci/go-ecs-ecr を動かすと,Golang の API が動く Docker イメージを作成して,ECR にプッシュして,ECS にデプロイする,という流れを簡単に試すことができる.僕自身が ECS に入門したばかりなので,勉強のキッカケとしてもお手軽でとても良かった.
ザックリと構成図を書くと,こんな感じになる.
circleci/go-ecs-ecr を Fork する
まず最初に circleci/go-ecs-ecr を Fork する.このままだと circle.yml
と deploy.sh
に定義されたリージョンが全てバージニア (us-east-1
) になっているため,東京 (ap-northeast-1
) に変更する必要がある.例えば以下のように.
ECR にリポジトリを作成する
ECR に go-sample-webapp
という名前のリポジトリを作成しておく.また aws ecr get-login
コマンドで,ECR にログインできることを確認しておく.
$ $(aws ecr get-login --region ap-northeast-1)
ECS で仮のタスク定義を作成する
CircleCI で実行するデプロイで自動的に ECS のタスク定義を作成するため,ここでは ECS クラスタを起動するためだけに仮のタスク定義を作成する.名前は sample-webapp-task
にしておく.
ECS クラスタと ECS サービスを作成する
次に ECS クラスタと ECS サービスを作成する.名前は以下とする.
- クラスタ名 :
sample-webapp-cluster
- サービス名 :
sample-webapp-service
- タスク定義名 :
sample-webapp-task-family
(自動的にデプロイされる)- タスク定義名のことをファミリーと呼ぶ
今回は検証用途なので,コンテナインスタンスは t2.micro
を1台にした.ELB / ALB も使わないため,パブリックサブネットに配置して,限られた IP アドレスから 80 ポートを許可するようにした.
また Desired Count
も 1 にし,Minimum Healthy Percent
と Maximum Percent
はデフォルトのままにした.日本語コンソールの「最小ヘルス率」と「最大率」という訳が微妙すぎるでしょ…!
CircleCI の設定をする
Fork した go-ecs-ecr リポジトリで CircleCI を動くように設定したら,まずは CircleCI 専用の IAM User を作成する.名前は circleci-ecs
とした.ポリシーは以下をアタッチする.
AmazonEC2ContainerRegistryFullAccess
AmazonEC2ContainerServiceFullAccess
次に CircleCI の Environment Variables で,以下の環境変数を設定しておく.
AWS_ACCOUNT_ID
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
ビルドを実行する
あとは CircleCI でビルドを実行すると ECS に Docker コンテナがデプロイできる.デプロイ後にコンテナインスタンスにアクセスすると,ちゃんとレスポンスが返ってきた.
$ curl http://xxx.xxx.xxx.xxx/ Hello World!%
仕組みを学ぶ
circle.yml
docker build
を実行して$CIRCLE_SHA1
をタグとして Docker イメージを作成する- テスト時には
docker run
でコンテナを実行して,接続を確認する - master ブランチにプッシュされた場合は
deploy.sh
を実行する
deploy.sh
- AWS CLI の設定をする
- ECR に Docker イメージをプッシュする
- タスク定義のリビジョンを更新して,最新の Docker イメージを反映する
- サービスに紐付くタスク定義を更新して ECS にデプロイをする
詳しくは CircleCI のドキュメントにも載っているので,合わせて見ると良いと思う.
学んだこと
ECS は設定項目が多く,ポチポチとデフォルト設定のまま進めていたら,少し気になる点を発見した.
まず,クラスタを新規に作成するときに,ネットワーキングの部分で,デフォルトでは VPC を新規に作成する設定になっていた.何となく CloudFormation のスタック変更が長いなぁと思っていたら VPC まで作られていて,既存の VPC で動かすことが多いだろうし,ここは注意しておきたいところだなと思った.あと,自動的に作られるセキュリティグループは,デフォルトで 80 ポートを 0.0.0.0 で開放していた.ここも注意しておきたいと思った.
まとめ
- circleci/go-ecs-ecr を試しながら ECS に入門した
- CircleCI 経由で ECR にプッシュして ECS にデプロイできるのは非常に便利だった
- ECS のデプロイ方法は他にもあるため,要件を整理して比較検討をしてみたいと思う
- GitHub - aws/amazon-ecs-cli: A custom Amazon ECS CLI that eases up the cluster setup process, enables users to run their applications locally or on ECS using the same Docker Compose file format and familiar Compose commands.
- GitHub - silinternational/ecs-deploy: Simple shell script for initiating blue-green deployments on Amazon EC2 Container Service (ECS)
- GitHub - aws/amazon-ecs-cli: A custom Amazon ECS CLI that eases up the cluster setup process, enables users to run their applications locally or on ECS using the same Docker Compose file format and familiar Compose commands.
ECS を学ぶのに最高な Black Belt 資料
非常によくまとまっていて素晴らしい資料だと思う.今のところ毎日1回は見ている気がする.また今月に資料の更新もされていて,情報の鮮度が保たれているという点も助かる!
www.slideshare.net