AWS CloudFormation で実践する Infrastructure as Code - テンプレート設計とスタック管理
テンプレートでインフラを定義し、変更セットで影響範囲を事前確認する。ドリフト検出で構成の逸脱を検出し、スタックセットで Organizations 全体に一括デプロイする手法を紹介します。
CloudFormation の概要
CloudFormation は AWS リソースを YAML または JSON のテンプレートで宣言的に定義し、スタックとしてプロビジョニングする IaC サービスです。手動でのリソース作成と比べて、環境の再現、バージョン管理、自動化に使えます。テンプレートは Git で管理でき、コードレビューや CI/CD パイプラインに統合することでインフラ変更にソフトウェア開発と同じ品質管理プロセスを適用できます。SAM は CloudFormation の拡張で、サーバーレスアプリケーションの定義を簡素化します。CloudFormation Registry を通じて AWS 公式タイプに加えサードパーティやカスタムリソースタイプも管理できます。
テンプレート設計とスタック管理
テンプレートは Parameters (最大 200 個) でデプロイ時の入力値、Mappings で環境ごとの設定値、Conditions で条件分岐を定義します。1 スタックあたり最大 500 リソースを管理でき、テンプレート本体のサイズ上限は S3 経由で 1 MB です。超過する場合はネストスタックで分割し、AWS::CloudFormation::Stack リソースで子テンプレートの URL を参照します。変更セットはスタック更新前に作成し、追加 / 変更 / 削除されるリソースをプレビューします。Replace (置換) が発生するリソースは一時的にサービス断が生じるため、変更セットで事前に確認します。Outputs セクションと Export/ImportValue を使えば、スタック間でリソース ARN や ID を共有でき、スタックを分けてチームで分担する構成をとれます。DeletionPolicy 属性で Delete (デフォルト)、Retain (スタック削除してもリソース保持)、Snapshot (削除前にスナップショット取得) を指定し、重要データの保護を仕組み化します。
ドリフト検出とスタックセット
ドリフト検出はスタックのリソースがテンプレートの定義から逸脱していないかを検出します。手動でのコンソール操作やスクリプトによる変更がドリフトとして検出され、テンプレートとの差分を確認できます。定期的なドリフト検出を EventBridge スケジュールで自動化し、構成の逸脱を早期に発見します。ドリフト検出は全リソースタイプをサポートしているわけではないため、サポート対象リソースの一覧をドキュメントで確認します。スタックセットは複数のアカウントとリージョンに同一テンプレートを一括デプロイする機能で、Organizations との統合で OU 単位のデプロイを自動化します。新しいアカウントが OU に追加されると、スタックセットが自動的にデプロイされます。スタックセットの同時実行数 (MaxConcurrentCount) や失敗許容数 (FailureToleranceCount) で、大規模展開時の同時実行と許容する失敗の数を決めます。
設計のベストプラクティスと落とし穴
テンプレート設計では、論理名 (LogicalId) の安易な変更に注意が必要です。LogicalId を変更するとリソースの置換が発生し、RDS インスタンスや EBS ボリュームなどステートフルなリソースはデータ損失につながります。スタックポリシーで重要リソースの更新や削除を止められ、UpdateReplacePolicy: Retain も設定できます。循環参照 (Circular Dependency) はデプロイ失敗を引き起こす一般的なエラーで、セキュリティグループ間の相互参照で発生しやすいため、AWS::EC2::SecurityGroupIngress / Egress リソースで分離します。スタックのロールバック失敗 (UPDATE_ROLLBACK_FAILED) が発生した場合、ContinueUpdateRollback API でスキップするリソースを指定して回復します。大規模テンプレートでは cfn-lint に加え、TaskCat で複数リージョン同時テストや cfn-guard でポリシーコンプライアンスの自動検証を組み合わせられます。
Terraform / CDK との使い分け
マルチクラウドを必要としない AWS の環境では、CloudFormation でスタックセットや Organizations 統合などのネイティブの機能を使えます。状態ファイルは AWS が自動管理するため、S3 バケットやロックテーブルの用意が不要です。Terraform はマルチクラウドに対応し、AWS 以外のリソースも同一ワークフローで管理できますが、状態ファイルは利用者が管理します。CDK は TypeScript や Python などの汎用プログラミング言語でインフラを定義し、for ループや条件分岐などの言語機能を活用して複雑なインフラを簡潔に記述できます。CDK は最終的に CloudFormation テンプレートを生成するため、ドリフト検出などの機能をそのまま利用できます。選定の指針として、組織標準のガードレール展開にはスタックセット、プログラマブルな抽象化には CDK、マルチクラウドには Terraform を使う分け方があります。
CloudFormation の料金と制限の注意点
CloudFormation 自体に追加料金は発生しません。コストはプロビジョニングされる AWS リソースの利用料金のみです。サードパーティリソース (CloudFormation Registry 経由の拡張タイプ) の管理にはリソースあたりのハンドラー操作で課金されます (CREATE/UPDATE/DELETE/READ/LIST 各操作)。主要な制限として、1 アカウントあたりのスタック数上限は既定 2,000 (引き上げ可能)、1 テンプレートの Outputs 上限は 200、Mappings 上限は 200 です。テンプレートの開発効率を高めるには、cfn-lint でテンプレートの構文エラーを事前検出し、変更セットでデプロイ前に影響範囲を確認します。ネストされたスタックで共通リソース (VPC、セキュリティグループ) を再利用し、テンプレートの重複を排除します。Rain CLI でテンプレートのフォーマットとデプロイを効率化できます。
まとめ
CloudFormation はテンプレートで同じインフラを繰り返し作成できる IaC のサービスです。変更セットでデプロイ前に影響範囲を確認し、ドリフト検出で構成の逸脱を検出します。スタックセットで Organizations 全体にテンプレートを一括デプロイし、マルチアカウント / マルチリージョンのインフラ管理を自動化します。DeletionPolicy やスタックポリシーでステートフルリソースを保護し、CDK や Terraform と組み合わせて、プロジェクトの要件に合う IaC の構成を選べます。
参考資料 (AWS 公式)
本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。
本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。