スタックのロールバック も参考にしてください。
異なるスタック A と B が存在すると仮定します。
A で example という名前( 論理ID や 物理ID ではなく、多くの場合は Name プロパティの値)のリソースを作成済みとしますB で ↑ と同名の example という名前のリソースを作成した場合に CodePipeline の Deploy ですでに example が存在する旨のエラーが発生しますAWS CLIのCloudFormationのドキュメントは以下を参照。
cloudformation Available Commands
AWS CLIで変更セット詳細を取得できます。
$ aws cloudformation describe-change-set --change-set-name {{変更セットARN}} --profile {{profile}}
ROLLBACK_COMPLETEROLLBACK_COMPLETE はスタックを作成できなかった場合に発生(よってスタックを削除しても大きな問題は発生しない)ROLLBACK_COMPLETE 状態のスタックは DELETE しかできないUPDATE_ROLLBACK_COMPLETESuccessful return of one or more stacks to a previous working state after a failed stack update.
UPDATE_ROLLBACK_COMPLETE はロールバックが成功しているので UPDATE_ROLLBACK_FAILED と違って変更セットで更新できますUPDATE_ROLLBACK_FAILEDUPDATE_ROLLBACK_COMPLETE ) までロールバックを続けることができます。」When in this state, you can delete the stack or continue rollback
DELETE_FAILEDDELETE_FAILED 状態のスタックは DELETE しかできませんUPDATE_ROLLBACK_FAILED はスタックを削除するか元の状態に戻るまでロールバックを続けるかの 2 つのオペレーションのみ可能です。
スタックのロールバックを続けるにはAWS CLI continue-update-rollback を使用することを推奨します。
スタック操作は AWS CLIを使用することが多く、AWS CLI の CloudFormation のドキュメントは以下を参照してください。
ref. cloudformation Available Commands
CodePipeline は以下フローを前提とします(必ず変更セットを作成)。
Approve で 承認するDeploy を実行本文では変更セットが意図したものであることを確認していることを前提にします。
変更セットが意図したものであっても Deploy が意図通りに終了しない場合の対策をまとめます。
UPDATE_COMPLETE => 問題ない(これを想定して Deploy する)UPDATE_ROLLBACK_COMPLETE => CodePipeline の稼働前のリソースに戻るので問題ない
(正しく IaC を修正することで再度 CI を実行して改善できる)スタックの出力(Outputs)が他スタックで使用されている場合。
リソース(のまとまり)ごとに CloudFormation テンプレートを分けていて他のスタックの出力を使用する場合に発生します。
Export Foo cannot be updated as it is in use by BAR
UDDATE_ROLLBACK_FAILEDUPDATE_IN_PROGRESSのスタックがありDeployが終了しない変更セットは問題なく作成。ただし該当のタスク定義を使用しているECS サービスが起動できず(SSMパラメータを読み込めず)、更新失敗と再更新を繰り返してUPDATE_IN_PROGRESSのままCodePipelineが終了しない。
実行を停止を実施 => CodePipelineは停止したが該当スタックのUPDATE_IN_PROGRESSは解消されないスタックアクションからスタックの更新をキャンセル
AWS CLI cancel-update-stack を実施してもよい
CodePipelineの停止 -> スタックの更新をキャンセルの順に試したが、最初にスタックの更新をキャンセルすれば良かった。
上記の場合は該当スタック以外はDeployされている可能性が高いので、整合性を確かめる。