CloudFormationで作るCodePipelineで継続的デリバリされるECSクラスタを考えてみました。
前提
- リポジトリにはGitHubを使う
- CloudFormationで環境一式が作成される
- ECSは単一タスク定義にコンテナ2つ
- WebとAppコンテナ
- CodepipelineはWeb, Appコンテナ用それぞれ用意
コンポーネント
GitHub
リポジトリを分けます。分ける理由はファイル更新時のデリバリー範囲を狭めるためです (Webコンテナの設定変更だけならAppコンテナは反映しない)。
- learning_of_codepipeline_ecs
- CloudFormation設定ファイル
- learning_of_codepipeline_ecs_app
- Appコンテナ用 Dockerfile
- Appコンテナ用 Codebuild設定ファイル
- learning_of_codepipeline_ecs_web
- Webコンテナ用 Dockerfile
- Webコンテナ用 Codebuild設定ファイル
CloudFormation
下記リソースの作成を行います。
- CodePipeline
- CodeBuild
- App, WebコンテナイメージをビルドしてECRにPush
- ECSクラスタ
- App, Webコンテナを動かす
CodePipeline
単一PipelineでApp, WebコンテナのビルドとECSへのデプロイをやろうと思ったのですが、下記問題があったのでWebとAppで別のPipelineにしました。
- Web, Appどちらかの更新で両方のビルドが始まってしまう
- ECSへのデプロイ時に片方が常に失敗する
成果物
CodePipeline
https://github.com/kter/learning_of_codepipeline_ecs
Webコンテナ用
https://github.com/kter/learning_of_codepipeline_ecs_web
Appコンテナ用
https://github.com/kter/learning_of_codepipeline_ecs_app
備考
前述の通り、最初1つのPipelineでWeb, App両方のビルド & デプロイをしようと思ったのですが、リポジトリ更新時どちらもビルドが始まってしまう問題と、ECSのデプロイが失敗する問題で、最終的には2つに分けました。