#
ドキュメント

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

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 のドキュメントは以下を参照してください。
ref. cloudformation Available Commands

前提

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

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

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

気にしておくこと

  • すべて UPDATE_COMPLETE => 問題ない(これを想定して Deploy する)
  • UPDATE_ROLLBACK_COMPLETE => CodePipeline の稼働前のリソースに戻るので問題ない (正しく IaC を修正することで再度 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