CloudFormationスタック
AWS CloudFormationにおけるリソース管理の基本単位。テンプレートから作成されたAWSリソースの集合体であり、ライフサイクル管理の単位でもある。
Infrastructure as Codeツールにおける「状態管理」の概念を、AWS側がマネージドで担う設計が特徴的だ。TerraformのStateファイルに相当するものをユーザーが管理する必要がない。
テンプレート・スタック・リソースの関係
- テンプレート: YAMLまたはJSONで記述された設計図。あるべき姿を宣言的プログラミングで記述する
- スタック: テンプレートをデプロイして生まれるリソースの集合体。ライフサイクルの単位
- リソース: 実際に作成されるAWSの構成要素(EC2、S3、IAMロールなど)
スタックを削除すれば、そこに含まれるリソースも一括削除される(DeletionPolicyの設定次第)。
スタック分割戦略
どのリソースをどのスタックにまとめるかは重要な設計判断。AWSはライフサイクルとオーナーシップの2軸で考えることを推奨している。
- ライフサイクル: 変更頻度が同じリソースをまとめる。VPCとアプリ設定を同じスタックにすると、アプリ更新のたびにVPCに影響が及ぶリスクがある
- オーナーシップ: 管理責任が同じリソースをまとめる。インフラチームとアプリチームの境界に沿って分割することで、チーム間の独立性を保てる
典型的な分割パターン:
- ネットワーク層(VPC、サブネット)
- セキュリティ層(IAMロール、セキュリティグループ)
- データ層(RDS、S3)
- コンピューティング層(ECS、Lambda)
- アプリケーション層(アプリ固有の設定)
関心の分離の原則をインフラレイヤーに適用したものとも言える。
スタック間連携の方法
Outputs/Exports
あるスタックの出力値を別のスタックで!ImportValueを使ってインポートする。エクスポートされた値を参照しているスタックがある限り、元スタックを削除できない暗黙的依存が生まれる。
Nested Stacks
スタックの中にスタックを入れ子にする。共通パターンのモジュール化に適している。
StackSets
複数のAWSアカウント・リージョンに同じスタックをデプロイする。組織全体のガバナンス一元管理に使う。
削除時の保護
- DeletionPolicy: リソースレベルで削除時の挙動を制御(Delete/Retain/Snapshot)
- Stack Policy: スタックレベルで特定リソースの更新を禁止
- Termination Protection: スタック自体の削除を防ぐフラグ
本番環境のデータベースにはRetainやSnapshotを設定しておくのが安全だ。
関連
- Infrastructure as Code - CloudFormationが属するカテゴリ
- 宣言的プログラミング - テンプレートの記述スタイル
- ドリフト検出 - コードと実態の乖離を検出
- Change Set - 更新前の変更プレビュー
- 関心の分離 - スタック分割の設計原則
- 冪等性 - IaCが保証する性質