#
ドキュメント

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

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

発生原因

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