#
ドキュメント

Document

自分のための備忘録です。

スタックのロールバック

スタックの状態( 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_COMPLETEUPDATE_ROLLBACK_COMPLETEはロールバックが成功しているので適切に対応すれば問題がない。

  • ROLLBACK_COMPLETE => CodePipelineの場合はActionModeをDELETE_ONLYにして再実行(CHANGE_SET_EXECUTEは実行しない)
  • UPDATE_ROLLBACK_COMPLETEは変更セットを作成できるので問題ない

問題になるのはロールバックが失敗したUPDATE_ROLLBACK_FAILEとDELETE_FAILED。

UPDATE_ROLLBACK_FAILED

可能なオペレーション

ref. https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-update-rollback-failed/?utm_source=pocket_mylist

UPDATE_ROLLBACK_FAILEDは、スタックを削除するか元の状態に戻るまでロールバックを続けるかの2つのオペレーションのみ可能。
スタックのロールバックを続けるにはAWS CLI continue-update-rollback を使用する。

発生原因

CodePipeline の Deploy によるスタックの状態に関するまとめ

スタック操作は AWS CLI を使用することが多いので AWS CLICloudFormation ドキュメントを参照してください。
cloudformation Available Commands

前提

CodePipeline は以下フローを前提とします(必ず変更セットを作成してください)。

  1. 変更セットを作成
  2. 変更セットを確認して問題がなければ Approve承認する
  3. Deploy を実行

本文では変更セットが意図したものであることを確認していることを前提にします。 変更セットが意図したものであっても Deploy が意図通りに終了しない場合の対策をまとめます。

気にしなくてよいもの

  • すべて UPDATE_COMPLETE => 問題ない(これを想定して Deploy する)
  • UPDATE_ROLLBACK_COMPLETE => CodePipeline が稼働する前のリソースの状態に戻るので良しとします   正しくコードを修正することで改善されるためCIを回していくことが可能なためです

UPDATE_ROLLBACK_COMPLETEの発生例 1

スタックの出力( Outputs )が他のスタックで使用されている場合。
リソース(のまとまり)ごとに CloudFormation テンプレートを分けており他のスタックの出力を使用する場合に発生します。

Export Foo cannot be updated as it is in use by BAR

気にするもの

  • UDDATE_ROLLBACK_FAILED
  • UPDATE_IN_PROGRESS のスタックがあり Deploy が終了しない
    • CodePipeline を強制的に停止する必要がある
    • 強制的に停止しても改善されない場合がある

UPDATE_IN_PROGRESS のスタックがあり Deploy が終了しない例

  1. ECS タスク定義の sercrets にパラメータを追加する
  2. SSM パラメータに ↑ で追加したパラメータを追加し忘れる

変更セットは問題なく作成。ただし該当のタスク定義を使用している ECS サービスが起動できず(SSMパラメータを読み込めず)、更新失敗と再更新を繰り返して UPDATE_IN_PROGRESS のまま CodePipeline が終了しません。

とった対策
  1. WEB マネジメントコンソールから 実行を停止 を実施 => CodePipeline は停止したが該当スタックの UPDATE_IN_PROGRESS は解消されない
  2. スタックアクション から スタックの更新をキャンセル AWS CLI cancel-update-stack を実施してもよい
CodePipeline_-_AWS_Developer_Tools
  1. CodePipeline の停止
  2. スタックの更新をキャンセル の順に試した

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

ciの実行

CloudFormation_-_スタック_base-ci

DELETE_FAILED

  • DELETE_FAILED
    • DELETE_FAILED状態のスタックはDELETEしかできない