異なるスタック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
状態のスタックはDELETE
しかできないROLLBACK_COMPLETE
は初めてスタックを作成する際に作成できなかった場合に発生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
When in this state, you can delete the stack or continue rollback
DELETE_FAILED
DELETE_FAILED
状態のスタックはDELETE
しかできないStack:arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxx:stack/sample/yyyyyyyyy is in ROLLBACK_COMPLETE state and can not be updated. (Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError; Request ID: zzzzzzzzzz; Proxy: null)
UPDATE_ROLLBACK_FAILED
は、スタックを削除するか元の状態に戻るまでロールバックを続けるかの2つのオペレーションのみ可能。
スタックのロールバックを続けるにはAWS CLIcontinue-update-rollbackを使用すると良い。
スタックの操作はAWS CLI
を使用することが多い。AWS CLI
のCloudFormation
のドキュメントは以下を参照。
cloudformation Available Commands
CodePipeline
は以下フローを前提とする(必ず変更セットを作成)。
Approve
で承認する
Deploy
を実行本文では変更セットが意図したものであることを確認していることを前提にする。
変更セットが意図したものであってもDeploy
が意図通りに終了しない場合の対策をまとめる。
UPDATE_COMPLETE
=> 問題ない(これを想定してDeploy
する)UPDATE_ROLLBACK_COMPLETE
=> CodePipeline
が稼働する前のリソースの状態に戻るので良しとする
(正しくコードを修正することで改善されるため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
されている可能性が高いので、整合性を確かめる。