CircleCI+ECS+ECR環境でDockerコンテナのCD(継続的デプロイ)環境を構築する -後編-

Amazon ECS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

後編です。前編では、ECRとECSの環境までを構築しました。ここからは、CircleCI側のセットアップを行いたいと思います。

流れとしては、以下で実施しようと思います。

  1. GitHubにコードをpushする
  2. CircleCI用のIAMユーザを作成し、アクセスキーを取得する
  3. CircleCIにGitHubのリポジトリをリンクする
  4. CircleCIにアクセスキーを登録する
  5. ビルドを実施
  6. デプロイされているはずなので、webにアクセスしてみる

セットアップしてみた

GitHubにコードをpushする

こちらをforkするなり、zipでダウンロードして自分のリポジトリにコミットしGitHubへpushします。コードは特に変更せずそのまま登録すれば問題無いです。

local$ tree
.
├── Dockerfile # Dockerコンテナを定義
├── LICENSE
├── README.md
├── circle.yml # CircleCIで実施する、コンテナのビルドやテスト、デプロイコマンドを実行するように定義
├── deploy.sh  # ECRへのコンテナイメージをpush、ECSへのコンテナをデプロイする
├── requirements.txt
└── static-html-directory # Nginxで公開するコンテンツを格納
    └── index.html

動作の簡単な解説です(circle.ymlに何を行うか定義しています)

  1. Dockerfileに定義している内容で、コンテナイメージを作成します。Dockerfileには、nginxコンテナイメージでコンテナを起動すること、static-html-directoryをnginx公開フォルダにコピーすること、ポート80番をバインドすることを定義しています。
  2. テストとして、1でビルドしたコンテナを起動して80ポートへアクセスし、"Hello World"が表示されるかを確認します。
  3. deploy.shを実行します。ここでは、ビルドしたコンテナイメージのアップロード、ECSへのコンテナデプロイを実施します。

CircleCI用のIAMユーザを作成し、アクセスキーを取得する

AWSのマネジメントコンソールにて、CircleCI用のIAMユーザを作成します。ポリシーは、「AmazonEC2ContainerRegistryFullAccess」と「AmazonEC2ContainerServiceFullAccess」をアタッチします。 また、アクセスキーを取得しておきます。(後で実施する手順でCircleCIに登録します)

CircleCIにGitHubのリポジトリをリンクする

20160512-ecs-circleci-cd-1

まだ、AWSアクセスキーを登録していないのでビルドは失敗します。

CircleCIにアクセスキーを登録する

AWSアカウントID、アクセスキーをCircleCI実施時の環境変数として登録します

以下の3つを環境変数として登録します。ここで定義した環境変数はCirclCIでビルドを実行するときに利用します。

  • AWS_ACCOUNT_ID
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

20160512-ecs-circleci-cd-2

20160512-ecs-circleci-cd-3

20160512-ecs-circleci-cd-4

ビルドの実施

セットアップが完了したのでビルドを実施してみます。

FAILDとなっているタスクをクリックします。

20160512-ecs-circleci-cd-5

リビルドします。

20160512-ecs-circleci-cd-6

ビルドが成功しているはずです!また、ECSへのデプロイも完了しています。今回ECSクラスタは2台構成なので、ローリングアップデート方式によりコンテナが更新されます。

デプロイされているはずなので、webにアクセスしてみる

それでは、アクセスできるか確認してみます!

20160512-ecs-circleci-cd-7

ちゃんとデプロイされています!

これでCI環境ができたので、今後変更が発生した場合はGitHubへpushしたタイミングで自動でECSへデプロイされるようになります。手動でやらなくていいので、とても効率的です。

まとめ

CircleCIを使った、ECS+ECR環境への継続的デプロイができるようになりました。継続的って聞くとハードル高い?と思うことがあるかもしれませんが、1度導入すると効率的な開発やリリースが可能になるため離れられなくなると思います。破壊力あります。これを機会にCI/CD環境の導入を検討してはいかがでしょうか。