FOR PROFESSIONALSプロフェッショナル向け

LIaC・CI/CD・開発運用段4設計層仕組み

CloudFormation がスタックを更新する仕組み|依存の順序・置換の条件・守りの部品を理解する

CloudFormation がスタックを更新する仕組み|依存の順序・置換の条件・守りの部品を理解する

本番のスタックを更新するとき、変更セットは作れるのに、画面に出る「Replacement」の意味と、なぜその順で作られ消されるのかを説明できない、という場面があります。プロパティを1行変えただけでデータを持つリソースが作り直されそうになり、依存関係が絡むと更新の順番も止まる場所も読めません。この記事は、更新の中で何が起きているかを順に分けて、変更セットを読む前提を作ります。

この記事の結論

  • 更新は、いま動いているテンプレートと送ったテンプレートの差分から始まり、変わっていないリソースは触られません。
  • 変わるリソースの動きはプロパティごとに決まっていて、中断なし・一部中断・置換の3種類です。どれになるかは公式のリソースリファレンスで引きます。
  • 置換は通常、新しいものを作り、参照を付け替え、古いものを消す順で進みます。物理 ID が変わるので、データを持つものと名前を固定したものが事故になります。
  • 順番は Ref・GetAtt・Sub の暗黙の依存と DependsOn で決まります。作成と更新は参照先が先、削除は参照元が先で、依存が無いものは並列です。
  • 守りは別々の部品です。変更セットで事前に見て、スタックポリシーで更新を拒否し、DeletionPolicy で消し方を決めます。

スタックの更新は何をもとに動くのか|差分の判定と、変わらないリソース

更新の全体像を先に1枚にします。以降の章は、この4段のどこの話かを示しながら進みます。

UPDATE FLOW更新の流れ

更新は差分 → 依存順 → 置換なら作って付け替えて消すの順に進む

  1. 判定

    差分の判定 — 動いているテンプレートと送ったテンプレートを比べる

    変わっていないリソースは触られない

  2. 実行

    依存順に実行 — 参照先が先、依存の無いものは並列

    Ref / GetAtt / Sub と DependsOn が順を決める

  3. 置換

    置換なら新規作成 — 参照を新しい方へ付け替える

    物理 ID が変わる

  4. 後始末

    旧リソースの削除 — 通常は最後

    データは新しい方に引き継がれない

出典: AWS CloudFormation ユーザーガイド(更新の動作)

変更セットがこの流れのどこを見せているのかは、AWS CloudFormation の入口を扱った READ ALSO — プロフェッショナル向け・段4 設計 AWS CloudFormation とは何か|変更セット・ドリフト・StackSets で基盤をコードで持つ設計の入口 で部品として整理しています。ここでは、その部品が読む対象である「更新の中身」を扱います。

スタックの更新では、現在のスタックに入っているテンプレートと、新しく送ったテンプレートを比べます。変更が見つかったリソースだけが更新の対象になり、変わっていないリソースは操作されません。

ここで押さえたいのは、「テンプレートを丸ごと流し直す」わけではない点です。逆に言えば、1つのプロパティの変更が、そのリソースにどんな動作を起こすのかがそのまま結果になります。次の章がその分かれ目です。

なお、ネストされたスタックを使っている場合は、親から見ると子のスタックも更新の流れに入ります。子の中でも同じ差分の判定と動作の分類が走る、と読んでください。

更新の動作は3つ|中断なし・一部中断・置換はプロパティごとに決まる

リソースを更新したときの動作は、次の3つに分かれます。どれになるかは、リソースの種類とプロパティごとに決まっています。

動作 何が起きるか 物理 ID
中断なしの更新 同じリソースのまま、止まらずに変更される 変わらない
一部中断の更新 同じリソースのまま、更新中に止まる時間がある 変わらない
置換 別のリソースを作り、古い方を消す 変わる

UPDATE BEHAVIORS更新の動作

物理 ID が変わるのは置換だけで、守りもここに集まる

中断なし・一部中断

同じリソースを更新する

  • 物理 ID は変わらない
  • 一部中断は、更新中に止まる時間がある
  • どちらになるかはプロパティごとに決まる

置換

別のリソースを作り直す

  • 物理 ID が変わる
  • 新しいものは空の状態で作られる
  • 名前固定や他からの参照があると失敗や影響が出る
出典: AWS CloudFormation ユーザーガイド(更新の動作)。どの動作かは各リソースのリファレンスで引く

どのプロパティがどの動作になるかの一覧は、この記事には載せません。リソースリファレンスの各プロパティに「更新の動作」が書かれているので、そちらを正として引きます。改定で変わりうる情報を、記事に写して古くしないためです。

引き方の手順としては、変更しようとしているプロパティのページを開き、更新の動作の欄を確かめます。変更セットを作る前にこれを見ておくと、画面の結果が予想どおりかを判断できます。

CHECK 1ここまでの確認

プロパティを書き換えたとき、リソースの物理 ID が変わるのはどの更新の動作か?

答えと解説

答え: 3. 置換

置換は同じリソースを直すのではなく別のリソースを作り直す動作なので、新しい物理 ID になります。「更新の動作は3つ」の章を読み直してください。

置換のとき、新旧のリソースはどの順で動くのか|物理 ID が変わることの意味

置換になるとき、通常の順は次のとおりです。

  1. 新しいリソースを作る
  2. このリソースを参照している側を、新しいリソースへ付け替える
  3. 古いリソースを削除する

つまり、置換の最初の操作は「作成」です。変更セットで置換の有無を事前に確かめる理由もここにあります。実行してから気づくのでは、新しいリソースが作られ、古いリソースが消えるところまで進んでしまうためです。

物理 ID が変わることの意味は2つあります。1つは、中身が引き継がれないことです。新しいリソースは空の状態で作られるので、データベースやストレージのデータは新しい方に移りません。もう1つは、外から物理 ID や名前で直接このリソースを指していた設定が、そのままでは新しい方に届かないことです。スタックの中の Ref などで参照している箇所は付け替えられますが、スタックの外の手作業の設定や連携先は付け替わりません。

更新の順番は何で決まるのか|暗黙の依存・DependsOn・並列

更新の順番を決めるのは、リソース間の依存です。依存には2種類あります。

  • 暗黙の依存: Ref、Fn::GetAtt、Fn::Sub でほかのリソースを参照すると、参照先が先に必要になる関係が自動でできる
  • 明示の依存: DependsOn 属性で、参照が無くても「これを先に」と指定する

順序は操作ごとに向きが変わります。リソース A が B を参照しているとき、作成と更新は参照先の B が先で、削除は参照元の A が先です。

ORDER BY REFERENCE順序の向き

A が B を Ref するとき、順序は操作ごとに向きが変わる

  1. A が B を Ref する

    参照元 A、参照先 B

  2. 作成は B → A

    参照先が先

  3. 更新は B → A

    参照先が先

  4. 削除は A → B

    参照元が先

出典: AWS CloudFormation ユーザーガイド(DependsOn 属性)

依存が無いリソース同士は、既定では並列に処理されます。DependsOn は、この既定の並列を上書きして順番を作る属性です。参照があればそれで順は決まるので、Ref・GetAtt・Sub で足りる所に DependsOn を重ねる必要はありません。参照が無いのに順番が要る所に限って使います。

Ref と GetAtt は、値を取り出す関数であると同時に、リソース間の依存順を作る関数でもあります。値を渡すために書いた参照が、順番の指定も兼ねている点を読み落とさないでください。

置換と依存を重ねると、挙動が読みやすくなります。置換される B を A が参照しているなら、B の新規作成が先、A の参照の付け替え、最後に旧 B の削除、の順です。

CHECK 2ここまでの確認

リソース A が B を Ref しているとき、スタックの削除でどちらが先に消えるか?

答えと解説

答え: 1. 参照元の A

参照元を先に消さないと、参照先を消した時点で A が宙に浮きます。作成と更新は参照先が先、削除は逆です。「更新の順番は何で決まるのか」の章を読み直してください。

置換で事故になるのはどんなリソースか|データを持つもの・名前を固定したもの・他スタックが参照するもの

置換が危ないのは、次の3種類です。

種類 何が起きるか 先にすること
データを持つもの(データベース・ストレージなど) 新しいものは空の状態で作られる スナップショットなど、置換前提の準備
名前を固定したもの 新旧が同じ名前を同時に持てず、作成の段で衝突しうる 名前の指定を外せるか、置換にならない変更で済むかを検討
ほかのスタックが参照するもの 参照している側に影響が及ぶ 参照元の一覧を先に確認

名前を固定したものは、置換が「新しいものを先に作る」順で進むために問題になります。同じ名前のリソースが同時に2つ存在できない種類では、新規作成が名前の衝突で失敗します。名前を自動生成に任せていれば避けやすい、という設計上の判断につながります。

他のスタックからの参照は、Outputs の Export と Fn::ImportValue で作ります。インポートされている間は、エクスポート元を削除できません。置換や削除が起きるリソースの値をほかのスタックが使っていないか、更新の前に確かめます。

CHECK 3ここまでの確認

置換されるデータベースを失わないために、更新の前にしておくことは何か?

答えと解説

答え: 2. スナップショットなど、置換されて空の新しいものができる前提の準備

置換では新しいリソースが空の状態で作られます。変更セットは置換を見せるだけで止めません。「置換で事故になるのは」の章を読み直してください。

本番の更新で、どの部品を先に効かせるか|変更セット・スタックポリシー・DeletionPolicy の役割分担

守りの部品は役割が違います。混ぜると、効くはずの場面で効きません。

部品 役割 止めるか
変更セット 実行せずに、各リソースの変更内容と置換の有無を見る 止めない(見せるだけ)
スタックポリシー 特定のリソースへの更新(置換・削除を含む)を拒否する 止める
DeletionPolicy リソースが削除されるときの扱い(Snapshot など)を決める 削除時の扱いを変える

使う順番は次のようになります。まず変更セットで置換の有無を見ます。置換が出たら、そのリソースがデータを持つか、名前を固定しているか、他から参照されているかを前章の表で確かめます。守りたいリソースには、あらかじめスタックポリシーで置換や削除を拒否しておきます。誤ったテンプレート変更が入っても、更新がそこで拒否されます。

DeletionPolicy は、スタックを削除するときやリソースを消すときの扱いを決める属性で、たとえば削除の前にスナップショットを残す指定ができます。置換で古いリソースが消える場面に、どこまで効くかは、この記事では公式の個別ページを確認できていないため断定しません。置換前提の備えは、DeletionPolicy だけに頼らず、更新の前に自分でスナップショットを取る形が確実です。公式の DeletionPolicy の説明で確かめてから設計に入れてください。

CHECK 4ここまでの確認

更新を実行せずに、置換が起きるかどうかを確かめる手段は何か?

答えと解説

答え: 1. 変更セット

変更セットは実行せずに各リソースの変更内容を見せる機能です。スタックポリシーは更新を拒否する側、DeletionPolicy は削除時の扱いを決める側です。最後の章を読み直してください。

まとめ

更新は、差分の判定、依存順の実行、置換なら新規作成と参照の付け替え、旧リソースの削除の順に進みます。置換かどうかは変更セットで事前に見て、事故になりやすいデータを持つもの・名前を固定したもの・他から参照されるものは、スタックポリシーとスナップショットで先に守ります。順番に迷ったら、Ref の向きと、作成・更新は参照先が先、削除は参照元が先、の2点に戻ってください。

参照ソース

SCOREこの記事の確認テスト

0/4問 正解

各章の「ここまでの確認」に答えると、ここに集まります。結果はこの端末のブラウザにだけ残り、サーバには送りません。

PRACTICEこの記事の論点を練習問題で確かめる

この記事が扱うサービスの問題だけを続けて解けます。練習問題は Google でログインした人が使えます(練習問題の一覧)。

HAND IT OVER人に渡すなら

一言で説明するなら

改装工事に似ています。図面の差分だけを工事し、壁を壊して建て直す場所は先に新しい壁を立てて配線をつなぎ替え、最後に古い壁を撤去します。

FAQよくある質問

変更セットがあれば置換は防げるのか?

防ぎません。変更セットは実行前に置換の有無を見せる部品で、更新そのものは止めません。止めるのはスタックポリシーのような別の部品です。

DependsOn は必ず書くべきなのか?

Ref・GetAtt・Sub で参照している所では不要です。参照が無いのに順番が要る所だけに書きます。

置換を避けられないときは何をするのか?

影響範囲と戻し方を先に決めます。データを持つものはスナップショットを取り、名前固定や他スタックからの参照がないかを確かめます。失敗したときの読み方は運用の記事に譲ります。

SAME TRACK同じ領域の記事

CloudFormation のスタックが失敗したときの直し方|イベントを読み、ロールバックを続けるか止めるか決める運用
CloudFormation のスタックが失敗したときの直し方|イベントを読み、ロールバックを続けるか止めるか決める運用 段2 構成運用
デプロイ方式の選び方|インプレース・ブルー/グリーン・カナリアを「戻しやすさ」と「止められない度」で決める設計
デプロイ方式の選び方|インプレース・ブルー/グリーン・カナリアを「戻しやすさ」と「止められない度」で決める設計 段2 構成設計
CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由
CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由 段2 構成仕組み