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) を適切に設定し、大規模展開時のリスクを制御できます。 IaC について体系的に学びたい方は、関連書籍 (Amazon)も参考になります。

設計のベストプラクティスと落とし穴

テンプレート設計では、論理名 (LogicalId) の安易な変更に注意が必要です。LogicalId を変更するとリソースの置換が発生し、RDS インスタンスや EBS ボリュームなどステートフルなリソースはデータ損失につながります。スタックポリシーで重要リソースの更新や削除を防止し、UpdateReplacePolicy: Retain を設定することが推奨されます。循環参照 (Circular Dependency) はデプロイ失敗を引き起こす一般的なエラーで、セキュリティグループ間の相互参照で発生しやすいため、AWS::EC2::SecurityGroupIngress / Egress リソースで分離します。スタックのロールバック失敗 (UPDATE_ROLLBACK_FAILED) が発生した場合、ContinueUpdateRollback API でスキップするリソースを指定して回復します。大規模テンプレートでは cfn-lint に加え、TaskCat で複数リージョン同時テストや cfn-guard でポリシーコンプライアンスの自動検証を組み合わせると品質が向上します。

Terraform / CDK との使い分け

CloudFormation はマルチクラウドを必要としない AWS 専用環境で、特にスタックセットや 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 戦略を構築できます。