CloudFormation StackAWS 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_COMPLETEUPDATE_ROLLBACK_COMPLETE はロールバックが成功しているので適切に対応すれば問題ありません。

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

問題になるのはロールバックが失敗した UPDATE_ROLLBACK_FAILEDDELETE_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 を使用することを推奨します。

発生原因

  • 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 CLICloudFormation ドキュメントを参照してください。
cloudformation Available Commands

前提

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

  1. 変更セットを作成
  2. 変更セットを確認して問題がなければ Approve承認する
  3. 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_FAILED
  • UPDATE_IN_PROGRESS のスタックがあり Deploy が終了しない
    • CodePipeline を強制的に停止する必要がある
    • 強制的に停止しても改善されない場合がある

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

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

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

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

CodePipeline_-_AWS_Developer_Tools

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

変更セットを実行

CloudFormation_-_スタック_base-ci