#
ドキュメント

Document

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

CloudFormation Stack

リソース置換仕様

異なるスタックABが存在すると仮定する。

  1. Aexampleというリ名前(論理IDや物理IDではない、多くの場合Nameプロパティ)のリソースを作成済みとする
  2. Bで↑と同名のexampleという名前のリソースを作成しようとした場合にはCodePipelineDeployですでにexampleが存在する旨のエラーが発生する

AWS CLI CloudFormationドキュメント

AWS CLICloudFormationのドキュメントは以下を参照。
cloudformation Available Commands

変更セット

変更セットの詳細

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets-samples.html

AWS CLIで変更セットの取得

変更セットの詳細をAWS CLIで取得する。

$ aws cloudformation describe-change-set --change-set-name {{変更セットARN}} --profile {{profile}}

ref. https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets-view.html

stack status

ref. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-view-stack-data-resources.html

  • 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
    • 更新前の状態に戻すことができなかったことを示す
    • 「スタックが UPDATE_ROLLBACK_FAILED 状態の場合、動作状態 (UPDATE_ROLLBACK_COMPLETE) までロールバックを続けることができます。」
      ref. 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/
  • 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)

400 Bad Request

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 CLIcontinue-update-rollbackを使用すると良い。

発生原因

  • https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-update-rollback-failed

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の発生例

スタックの出力(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

Codepipelineの停止 -> スタックの更新をキャンセルの順に試したが、最初にスタックの更新をキャンセルでもよかったのでは。

上記の場合は該当スタック以外はDeployされている可能性が高いので、整合性を確かめる。

ciの実行

CloudFormation_-_スタック_base-ci