スタックのロールバック も参考にしてください。
異なるスタック 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_COMPLETE
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_COMPLETE
はロールバックが成功しているので UPDATE_ROLLBACK_FAILED
と違って変更セットで更新できますUPDATE_ROLLBACK_FAILED
UPDATE_ROLLBACK_COMPLETE
) までロールバックを続けることができます。」When in this state, you can delete the stack or continue rollback
DELETE_FAILED
DELETE_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_FAILED
UPDATE_IN_PROGRESS
のスタックがありDeploy
が終了しない変更セットは問題なく作成。ただし該当のタスク定義を使用しているECS サービスが起動できず(SSMパラメータを読み込めず)、更新失敗と再更新を繰り返してUPDATE_IN_PROGRESS
のままCodePipeline
が終了しない。
実行を停止
を実施 => CodePipeline
は停止したが該当スタックのUPDATE_IN_PROGRESS
は解消されないスタックアクション
からスタックの更新をキャンセル
AWS CLI cancel-update-stack を実施してもよいCodePipelineの停止 -> スタックの更新をキャンセルの順に試したが、最初にスタックの更新をキャンセル
すれば良かった。
上記の場合は該当スタック以外はDeploy
されている可能性が高いので、整合性を確かめる。