AWS CloudFormation
JSON または YAML テンプレートで AWS インフラをコードとして定義・管理する Infrastructure as Code サービスで、リソースの作成から削除までをスタック単位で一括管理する
概要
AWS CloudFormation は、AWS リソースのプロビジョニングと管理をコードで自動化する Infrastructure as Code (IaC) サービスです。JSON または YAML 形式のテンプレートファイルに VPC、EC2、RDS、Lambda などの AWS リソースとその設定を宣言的に記述し、スタックとしてデプロイします。CloudFormation はテンプレートに記述されたリソース間の依存関係を自動的に解決し、適切な順序でリソースを作成します。変更セット機能により、テンプレートの変更がどのリソースに影響するかを事前に確認でき、意図しない変更を防止できます。ドリフト検出機能は、手動で変更されたリソースとテンプレートの差分を検出します。スタックの削除時にはすべてのリソースが自動的にクリーンアップされるため、環境の作成と破棄を繰り返す開発・テストフェーズで特に有用です。CloudFormation 自体の利用料金は無料で、作成されたリソースの料金のみが発生します。
テンプレートの主要セクションと組み込み関数
CloudFormation テンプレートは Parameters、Mappings、Conditions、Resources、Outputs の主要セクションで構成されます。Parameters はデプロイ時に外部から値を渡す入力パラメータで、環境名やインスタンスタイプを動的に切り替えられます。Mappings はリージョンや環境に応じた値のルックアップテーブルで、AMI ID のリージョン別マッピングなどに使います。Conditions は条件に基づいてリソースの作成を制御し、本番環境のみ Multi-AZ を有効にするといった分岐が可能です。Resources がテンプレートの中核で、作成する AWS リソースとその設定を宣言的に定義します。Fn::Ref、Fn::GetAtt、Fn::Sub などの組み込み関数でリソース間の参照や文字列の動的生成を行い、Fn::If で Conditions に基づく条件分岐を記述します。Azure の ARM テンプレートは JSON のみ対応ですが、CloudFormation は JSON と YAML の両方をサポートしており、YAML の方が可読性が高く実務では主流です。
変更セットとドリフト検出による安全な更新
CloudFormation の変更セット (Change Set) は、テンプレートの変更がどのリソースに影響するかを事前にプレビューする機能です。リソースの追加、変更、置換、削除が一覧で表示されるため、意図しないリソースの置換 (データ消失を伴う再作成) や削除を未然に防げます。スタックポリシーを設定すれば、本番データベースなどの重要リソースの更新や削除を明示的に禁止することも可能です。ドリフト検出機能は、コンソールや CLI から手動変更されたリソースとテンプレートの差分を検出し、IaC の一貫性を維持するのに役立ちます。IaC 入門の関連書籍 (Amazon) では、こうした運用プラクティスが体系的にまとめられています。
ネストスタックと StackSets によるモジュール化
大規模な環境では、1 つの巨大なテンプレートではなく、ネストスタックで責務を分割します。ネットワーク層、データベース層、アプリケーション層を別々のスタックに分離し、変更の影響範囲を限定することで、デプロイの安全性と速度が向上します。クロススタック参照 (Exports/Imports) を使えば、ネットワークスタックが出力した VPC ID やサブネット ID をアプリケーションスタックから参照できます。StackSets は複数の AWS アカウントとリージョンに同一テンプレートを一括デプロイする機能で、Organizations と連携すれば新規アカウント作成時にガードレール (CloudTrail 有効化、Config ルール設定など) を自動適用できます。AWS SAM は CloudFormation の拡張で、Lambda 関数、API Gateway、DynamoDB テーブルなどのサーバーレスリソースを簡潔な構文で定義でき、ローカルテストやデプロイの自動化も組み込まれています。