読者です 読者をやめる 読者になる 読者になる

CircleCI で ECS にデプロイをするサンプルプロジェクト circleci/go-ecs-ecr を試した

CircleCI を使って,ECS に Docker コンテナをデプロイする方法を調べていたら,CircleCI が公開しているサンプルプロジェクト circleci/go-ecs-ecr の存在を知ったので,さっそく試してみた.

circleci/go-ecs-ecr を動かすと,Golang の API が動く Docker イメージを作成して,ECR にプッシュして,ECS にデプロイする,という流れを簡単に試すことができる.僕自身が ECS に入門したばかりなので,勉強のキッカケとしてもお手軽でとても良かった.

github.com

ザックリと構成図を書くと,こんな感じになる.

f:id:kakku22:20170419014555j:plain

circleci/go-ecs-ecr を Fork する

まず最初に circleci/go-ecs-ecr を Fork する.このままだと circle.ymldeploy.sh に定義されたリージョンが全てバージニア (us-east-1) になっているため,東京 (ap-northeast-1) に変更する必要がある.例えば以下のように.

github.com

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 PercentMaximum 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 のドキュメントにも載っているので,合わせて見ると良いと思う.

circleci.com

学んだこと

ECS は設定項目が多く,ポチポチとデフォルト設定のまま進めていたら,少し気になる点を発見した.

まず,クラスタを新規に作成するときに,ネットワーキングの部分で,デフォルトでは VPC を新規に作成する設定になっていた.何となく CloudFormation のスタック変更が長いなぁと思っていたら VPC まで作られていて,既存の VPC で動かすことが多いだろうし,ここは注意しておきたいところだなと思った.あと,自動的に作られるセキュリティグループは,デフォルトで 80 ポートを 0.0.0.0 で開放していた.ここも注意しておきたいと思った.

まとめ

ECS を学ぶのに最高な Black Belt 資料

非常によくまとまっていて素晴らしい資料だと思う.今のところ毎日1回は見ている気がする.また今月に資料の更新もされていて,情報の鮮度が保たれているという点も助かる!

www.slideshare.net