スタックのロールバック | AWS CoudFormation
CloudFormation Stack や AWS CLI による Stack 操作 も参考にしてください。
スタックの状態( stack status )
ref. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-view-stack-data-resources.html
| status | 内容 | 操作 |
|---|---|---|
| ROLLBACK_COMPLETE | 新規スタック作成失敗(新規スタック作成時にしか発生しない) | 変更セット作成不可。DELETE( CodePipeline はDELETE_ONLY )のみ可能 |
| UPDATE_ROLLBACK_COMPLETE | 既存スタックの更新失敗。更新前の状態にロールバックが成功 | 変更セットを作成可能 |
| UPDATE_ROLLBACK_FAILED | 既存スタックの更新失敗。更新前の状態にロールバック失敗 | 変更セットを作成不可 |
| DELETE_FAILED | リソースの削除に失敗 | DELETEのみ可能 |
ROLLBACK_COMPLETE、UPDATE_ROLLBACK_COMPLETE はロールバックが成功しているので適切に対応すれば問題ありません。
ROLLBACK_COMPLETE=> CodePipeline の場合は ActionMode を DELETE_ONLY にして再実行( CHANGE_SET_EXECUTE は実行しない)UPDATE_ROLLBACK_COMPLETEは変更セットを作成
問題になるのはロールバックが失敗した UPDATE_ROLLBACK_FAILED と DELETE_FAILED です。
ROLLBACK_COMPLETE
- スタックの作成に失敗し、作成されたすべてのリソースの削除が完了したことを示す
- 新規作成の失敗なので、スタックを削除しても大きな問題は発生しない
ROLLBACK_COMPLETE状態のスタックはDELETEしかできない
UPDATE_ROLLBACK_COMPLETE
- 更新に失敗したが、更新前の状態にロールバックが成功した状態
-
Successful return of one or more stacks to a previous working state after a failed stack update.
-
- ロールバックが成功しているので、
UPDATE_ROLLBACK_FAILEDと異なり変更セットを作成できる
UPDATE_ROLLBACK_FAILED
- 更新前の状態に戻すことができなかったことを示す
-
スタックが UPDATE_ROLLBACK_FAILED 状態の場合、動作状態 (UPDATE_ROLLBACK_COMPLETE) までロールバックを続けることができます。」
– https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-continueupdaterollback.html
-
When in this state, you can delete the stack or continue rollback
– https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-view-stack-data-resources.html
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-update-rollback-failed/
-
可能なオペレーション
ref. https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-update-rollback-failed/
UPDATE_ROLLBACK_FAILED は、スタックを削除するか元の状態に戻るまでロールバックを続けるかの 2 つのオペレーションのみ可能です。
スタックのロールバックを続けるには AWS CLI continue-update-rollback を使用することを推奨します。
- スタックを削除
- DeleteStack WEB API
- delete-stack AWS CLI
- 元の状態に戻るまでスタックのロールバックを続ける
- ContinueUpdateRollback WEB API
- continue-update-rollback AWS CLI
発生原因
- https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-update-rollback-failed
DELETE_FAILED
- リソースの削除に失敗した状態
DELETE_FAILED状態のスタックはDELETEしかできない- 削除に失敗したリソースを残したまま削除する方法は AWS CLI による Stack 操作 を参照
CodePipeline の Deploy によるスタックの状態に関するまとめ
スタック操作は AWS CLI を使用することが多いので AWS CLI の CloudFormation ドキュメントを参照してください。
cloudformation Available Commands
前提
CodePipeline は以下フローを前提とします(必ず変更セットを作成してください)。
- 変更セットを作成
- 変更セットを確認して問題がなければ
Approveで承認する Deployを実行
本文では変更セットが意図したものであることを確認していることを前提にします。
変更セットが意図したものであっても Deploy が意図どおりに終了しない場合の対策をまとめます。
リソースの状態に問題がないもの
- すべて
UPDATE_COMPLETE=> 問題ない(これを想定してDeployする) UPDATE_ROLLBACK_COMPLETE=>CodePipelineが稼働する前のリソースの状態に戻るので、リソースの状態としては問題ない- ただしデプロイ自体は失敗しているのでコードを修正して再実行する
UPDATE_ROLLBACK_COMPLETE の発生例
スタックの出力( Outputs )が他のスタックで使用されている場合。
リソース(のまとまり)ごとに CloudFormation テンプレートを分けており、他のスタックの出力を使用する場合に発生します(このため過度の分割は慎重になる必要があります)。
Export Example cannot be updated as it is in use by BAR
対応が必要なもの
UPDATE_ROLLBACK_FAILEDUPDATE_IN_PROGRESSのスタックがありDeployが終了しないCodePipelineを強制的に停止する必要がある- 強制的に停止しても改善されない場合がある
UPDATE_IN_PROGRESS のスタックがあり Deploy が終了しない例
- ECS タスク定義の secrets にパラメータを追加する
- SSM パラメータに ↑ で追加したパラメータを追加し忘れる
変更セットは問題なく作成。ただし該当のタスク定義を使用している ECS サービスが起動できず( SSM パラメータを読み込めず)、更新失敗と再更新を繰り返して UPDATE_IN_PROGRESS のまま CodePipeline が終了しません。
対策
- WEB マネジメントコンソールから
実行を停止を実施 =>CodePipelineは停止したが該当スタックのUPDATE_IN_PROGRESSは解消されない スタックアクションからスタックの更新をキャンセル
AWS CLI cancel-update-stack を実施してもよい

CodePipeline の停止 -> スタックの更新をキャンセル の順に試したが、最初に スタックの更新をキャンセル すれば良かった。
上記の場合は該当スタック以外は Deploy されている可能性が高いので、整合性を確かめる。
変更セットを実行
