DB-MIGRATOR INCIDENT EXPLAINER

なぜ今になって壊れたのか

古いDockerイメージは動くのに、クリーンに作り直したイメージは失敗した。Git・Docker・ECR・ECS・RDSをまたいだ不整合を、2026-08-24の実測結果から解きほぐす。

根本原因はTerraformではなく、未追跡ファイルを含んだDocker build context。
新イメージでtypoを消した際、RDS適用済みの正しいmigrationまで消えて顕在化。
migrationをGitへ戻し、ARM64イメージ 1ddc111・revision 8で正常化。
01

全体像 — 問題は4段階で進んだ

混入、潜伏、顕在化、復旧を一本の時間軸で見る。

未追跡migrationの混入からrevision 8での復旧までを示す時系列図
ecspressoは原因ではなく、古くからあった不整合を表面化させた。
結論:TerraformやECRがイメージを書き換えたのではない。ローカルのbuild contextとGitの内容が一致していなかった。
段階起きたこと見えていた状態
混入未追跡migrationを含めて f303e43 をbuildtagは正常に見える
潜伏RDSへ 20260603225644 を適用旧イメージでは動く
顕在化33a1292 に必要なmigrationがないrevision 7が失敗
復旧migrationを戻して 1ddc111 をbuildrevision 8が成功
02

根本原因 — Gitの外側までDockerは運ぶ

commit hashのtagは、イメージ内容の清潔さを保証しない。

Git未追跡ファイルもDocker build contextに含まれることを示す図
DockerはGitを見ない。. にあるものをbuild contextとして扱う。
GIT_COMMIT_HASH := $(git rev-parse --short HEAD)

docker build --platform=linux/arm64 \
  -t db-migrator-stg:${GIT_COMMIT_HASH} \
  -f Dockerfile .

# Dockerfile
COPY . .
COPY --from=builder /app/db ./db
実測では、f303e43 のGit treeにない正しいmigrationとtypo側migrationが、同じtagのDockerイメージ内には存在した。
場所正しいmigrationtypo migration
Git commit f303e43なしなし
Docker image f303e43ありあり
現在のRDSversion適用済みDBは存在しない
03

なぜ今回なのか — 一致していた旧ペアを崩した

問題は新しく作られたのではなく、新しいイメージへの切り替えで発見された。

旧イメージでは一致し新イメージでmigration不一致が起きた比較図
revision 7の実行で、RDSが知るversionを新イメージが説明できなくなった。

旧ペア:偶然整合

RDSは 20260603225644 を記録。旧イメージ f303e43 は、Git外から混入した対応ファイルを持っていた。

新ペア:不整合が露出

RDSの履歴は同じまま。新イメージ 33a1292 には対応するup/downがなく、revision 7で停止した。

failed to apply migrations: no migration found for version 20260603225644: read down ... file does not exist
これはrollbackを要求するエラーではない。DBの現在versionに対応するmigration pairを、実行中のイメージから見つけられないという整合性エラー。
04

復旧 — typoだけでなく正しい履歴も戻す

1回目は混入除去だけ。2回目でDBとGitの履歴を再び一致させた。

33a1292の失敗からmigrationを復旧した1ddc111の成功までを示す図
DBのmigration記録をいじらず、失われた元ファイルをGitへ戻した。
  1. commit 22b3bf3 からup / down / dump.sqlを復旧
  2. 3ファイルだけをcommitし、新tag 1ddc111 を作成
  3. ARM64・no-cacheでbuildし、slack_metrics だけを収録していることを確認
  4. ECRへpushし、task definition revision 8へ登録
  5. dbName=slack_metricsfinish to apply migrationsRun task completed! を確認
schema_migrations を削除・強制変更して合わせる方法は採用しなかった。DBだけを書き換えると、履歴の不整合を広げるため。
05

現在地と残作業

障害復旧は完了。再発防止と講座単位のGit整理が残る。

確認項目現在の状態
ECS task definitionrevision 8 / ARM64
使用イメージdb-migrator-stg:1ddc111
ECR digestsha256:e4cc1b20…c9863137
migration実行成功
slack_netrics DB現在存在しない
Parameter Store image tag未作成

残り

  1. db-migratorのecspresso変更を章単位でcommitする
  2. aws.mk のbuild platformをARM64へ戻す
  3. 未追跡migrationがあればbuildを止めるguardを追加する
  4. batch側ファイル名を教材どおり ecs-task-def.overrides.json へ揃える
  5. 作業を続けない場合は、現在availableのRDSを停止する
古いimage f303e43、失敗image 33a1292、revision 7は残っているが、最新revision 8は参照していない。削除は緊急ではない。

今回の要点

← CI/CDコースの解説一覧へ戻る