CI/CD パイプライン構築コース

ECS自動デプロイの4ステップ — 変更を安全に届ける順番

ECSへの自動デプロイは、ツールが違っても「ビルド、DBマイグレーション、サービス更新、通知」という順序に収束します。順番の理由と責務分離を掴みます。

TL;DR

  1. 新しいコンテナイメージを作ってからDBマイグレーションを実行する。
  2. タスク定義を更新し、ECSサービスが新しい版へローリングする。
  3. 頻繁に変わるECS定義はecspresso、基盤はTerraformに分ける。

014ステップを順番どおりに流す

ビルド → DBマイグレーション → ECS更新 → 通知。

4ステップを順番どおりに流す
ビルド → DBマイグレーション → ECS更新 → 通知。

DockerイメージをECRへpushし、その新版のdb-migratorを単発実行する。成功して初めてサービスを新タスク定義へ更新し、最後に結果を関係者へ知らせる。

順番実行すること次へ進む条件
1. buildイメージをECRへpush新タグが確定
2. migration単発ECSタスクでDB更新終了コードとログが成功
3. deploy新タスク定義でサービス更新ローリング開始
4. notify結果を共有成功・失敗を明記

DBマイグレーションを通さずにサービスを更新しない依存関係が、アプリとスキーマの不整合を防ぐ。

02DBマイグレーションは「新しいイメージ」の後

古いdb-migratorを走らせても、新しいmigrationファイルは反映されない。

DBマイグレーションは「新しいイメージ」の後
古いdb-migratorを走らせても、新しいmigrationファイルは反映されない。

先にイメージをビルドしてタグを確定し、そのタグを参照する単発ECSタスクでマイグレーションを実行する。失敗時にサービスを更新しない依存関係が安全弁になる。

順番理由失敗時の扱い
build → migration新しいmigrationを含むイメージを使うサービス更新を行わない
migration → deployスキーマを先に整える原因を修正して再実行
deploy → notify完了結果を確認してから伝える失敗通知で調査を開始

db-migratorも新イメージで実行する。古いイメージでは追加したmigrationを反映できない。

03Terraformとecspressoを分ける理由

基盤の安定した変更と、イメージタグのように頻繁な変更を同じapplyに載せない。

Terraformとecspressoを分ける理由
基盤の安定した変更と、イメージタグのように頻繁な変更を同じapplyに載せない。

TerraformはVPC・IAM・ECRなど基盤を管理する。ecspressoはSSMからイメージタグを読み、ECSタスク定義とサービスのデプロイに集中する。

管理対象主担当変更頻度
TerraformVPC・IAM・ECRなどの基盤低い
ecspressoECSタスク定義・サービス更新高い
SSM Parameter Storeイメージタグ等の受け渡しデプロイごと

頻繁に変わるアプリのデプロイを、基盤全体のterraform applyに巻き込まない。

結論

  1. デプロイは4段の順序が安全性を作る。
  2. DB更新は新イメージで、サービス更新より前。
  3. 責務分離でアプリ更新が基盤全体へ波及しない。