CloudFormationスタックがROLLBACK_COMPLETEで更新できない

  • AWS
  • CloudFormation

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

CloudFormationでスタックを更新しようとしたら、こんなエラーが出た。

Stack:arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/example-stack/xxxxxxxx is in ROLLBACK_COMPLETE state and can not be updated. (Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError;

何が起きているか

ROLLBACK_COMPLETE は「スタックを新規作成したとき」に失敗して、自動ロールバックが完了した状態。デフォルトだと作成失敗時にロールバックが有効になっているので、リソース作成中にどれか1つでもコケると全部巻き戻されてこの状態になる。

ポイントは、これは作成失敗由来の状態だということ。更新中の失敗とは別物。

対処法

ROLLBACK_COMPLETE のスタックは更新できない。UpdateStackを叩いても弾かれる。取れる手段は実質1つだけ。

  1. スタックを削除する
  2. テンプレートやパラメータの原因を直す
  3. 新規スタックとして作り直す

CDKなら cdk destroy してから cdk deploy でいい。

原因側でよくあるのは以下あたり。

  • テンプレートの構文エラー、無効なリソース設定
  • 必須パラメータの不足・値の誤り
  • リソース間の依存関係の設定ミス
  • リソース作成に必要なIAM権限の不足

原因はCloudFormationのスタックイベント(Events)を見れば大体特定できる。

UPDATE_ROLLBACK_FAILEDと混同しないこと

紛らわしいのが UPDATE_ROLLBACK_FAILED という別の状態。こっちは更新中に失敗してロールバックもできなかったケースで、ContinueUpdateRollback で UPDATE_ROLLBACK_COMPLETE まで持っていけば復旧できる。

aws cloudformation continue-update-rollback \
--stack-name example-stack \
--resources-to-skip ExampleResource

ただしこれが効くのは UPDATE_ROLLBACK_FAILED のときだけ。ROLLBACK_COMPLETE の状態で ContinueUpdateRollback を叩くと、

An error occurred (ValidationError) when calling the ContinueUpdateRollback operation: RollbackUpdatedStack cannot be called from current stack status

というエラーになって復旧できない。名前が似ているせいで最初どっちの状態か勘違いしそうになったので、ここは注意しておきたい。

flowchart LR
  A[CREATE_IN_PROGRESS] -->|作成失敗| B[ROLLBACK_IN_PROGRESS]
  B --> C[ROLLBACK_COMPLETE]
  C -->|更新不可・削除のみ| D[スタック削除]

  E[UPDATE_IN_PROGRESS] -->|更新失敗| F[UPDATE_ROLLBACK_IN_PROGRESS]
  F -->|ロールバック成功| G[UPDATE_ROLLBACK_COMPLETE]
  F -->|ロールバック失敗| H[UPDATE_ROLLBACK_FAILED]
  H -->|ContinueUpdateRollback| G
  G -->|再更新可能| E

ROLLBACK_COMPLETE は右側のフローとは別ルートで、復旧コマンドは存在しない。削除一択という理解でよさそう。