CloudFormationの基礎

基本概念

CloudFormationは、AWSが提供する公式のIaC(Infrastructure as Code)ツールです。IaCとは、インフラストラクチャの構成をコードとして記述・管理する手法で、CloudFormationはAWSリソースに特化したIaCを実現します。


CloudFormationの最大の特徴は、宣言的構文 (Declarative) を採用している点です。宣言的構文では、「どのように構築するか」の手順ではなく、「最終的にどうあるべきか」の状態を記述します。これにより、インフラの設定を直感的に理解しやすく、また冪等性(何度実行しても同じ結果になる)が保証されます。
テンプレートはJSONまたはYAML形式で記述します。特にYAMLは人間にとって読み書きしやすく、コメントも記述できるため、実務では広く採用されています。JSON形式も使用可能ですが、可読性の観点からYAMLが推奨されます。


CloudFormationは、AWSのすべてのリージョンで利用可能で、EC2、RDS、Lambda、S3などのAWSサービスを包括的にサポートしています。AWSマネージド サービスとして提供されるため、追加のツールインストールは不要で、AWSマネジメントコンソール、AWS CLI、SDKから直接利用できます。
AWS公式サービスとして提供されているため、新しいAWSサービスや機能への対応が迅速に行われ、AWS環境との親和性が高い点も大きな利点です。

スタック、テンプレート、リソースの関係

CloudFormationは、テンプレートスタックリソースという3つの主要な概念で構成されています。


テンプレート (Template) は、インフラ構成を定義したYAMLまたはJSON形式の設計図です。VPC、EC2インスタンス、セキュリティグループなど、作成したいAWSリソースとその設定を記述します。テンプレートはバージョン管理システム(Git等)で管理でき、再利用可能な資産として扱われます。

スタック (Stack) は、テンプレートから実際に作成されたAWSリソースの集合体です。1つのテンプレートから1つのスタックを作成し、スタック単位でリソースのライフサイクル(作成・更新・削除)を管理します。スタックには一意の名前を付け、AWSアカウント内で識別します。

リソース (Resource) は、スタックによって作成・管理される個々のAWSコンポーネントです。EC2インスタンス、RDSデータベース、S3バケットなど、テンプレート内で定義されたすべてのAWSサービスがリソースとして扱われます。


これらの関係性は、テンプレート(設計図)スタック(実体)リソース(構成要素) という階層構造で表現されます。1つのテンプレートから複数のスタックを作成することも可能で、開発環境用スタック、ステージング環境用スタック、本番環境用スタックといった環境別の展開ができます。


スタック内のすべてのリソースは相互に関連付けられており、スタックを削除すると、そのスタックに属するすべてのリソースが自動的に削除されます。この一括管理の仕組みにより、リソースの削除漏れや孤立したリソースの発生を防ぎます。

Terraformとの違い

CloudFormationとTerraformは、どちらもIaCツールですが、対応範囲と設計思想に明確な違いがあります。


対応プラットフォームの違いでは、CloudFormationはAWS専用のIaCツールであり、AWSリソースのみを管理します。一方、TerraformはAWS、Azure、GCP、Kubernetes、さらにはDatadog、PagerDutyなどのSaaSまで、マルチクラウド・マルチプラットフォームに対応しています。

記述言語の違いとして、CloudFormationはYAMLまたはJSON形式でテンプレートを記述します。対してTerraformは独自の宣言的な記述言語であるHCL(HashiCorp Configuration Language)を使用し、より簡潔で人間にとって読みやすい構文を提供します。

状態管理の違いでは、CloudFormationはAWSサービス側でスタックの状態を自動管理し、ユーザーが状態ファイルを意識する必要はありません。Terraformはterraform.tfstateという状態ファイルで実際のインフラとコードの差分を検出し、ユーザーが状態ファイルの保存場所(ローカルまたはリモートバックエンド)を選択・管理します。

提供形態の違いとして、CloudFormationはAWSマネージドサービスとして提供され、追加のツールインストールは不要で、AWSアカウントがあればすぐに利用開始できます。Terraformはオープンソースのスタンドアロンツールとして提供され、ローカル環境にインストールして使用します。

新機能への対応速度では、CloudFormationはAWS公式サービスのため、新しいAWSサービスや機能への対応が比較的迅速です。Terraformは、AWS Providerのアップデートを待つ必要があり、若干のタイムラグが発生する場合があります。

基本的なワークフロー

CloudFormationは、作成 (Create)更新 (Update) 削除 (Delete) という明確なライフサイクルでインフラを管理します。

スタックの作成

最初に、YAMLまたはJSON形式でテンプレートを作成し、必要なAWSリソースを定義します。次に、AWSマネジメントコンソール、AWS CLI、またはSDKを使用してスタックを作成します。スタック作成時には、一意のスタック名とテンプレートファイル(S3 URLまたはローカルファイル)を指定します。


パラメータを使用する場合は、環境固有の値(インスタンスタイプ、AMI ID、タグ等)を入力します。CloudFormationは、テンプレートを解析してリソース間の依存関係を自動的に判断し、適切な順序でリソースを作成します。

作成中のスタックのステータスはCREATE_IN_PROGRESSとなり、すべてのリソースが正常に作成されるとCREATE_COMPLETEに遷移します。
エラーが発生した場合はCREATE_FAILEDとなり、デフォルトでは自動的にロールバック(作成したリソースを削除)が実行されます。

スタックの更新

既存のスタックに変更を加える場合は、テンプレートを修正してスタック更新を実行します。CloudFormationは、現在のスタック状態と新しいテンプレートを比較し、変更セット (Change Set) を生成します。


変更セットには、追加・変更・削除されるリソースと、変更が既存リソースに与える影響(中断を伴う変更か、置き換えが必要か)が詳細に表示されます。この事前確認により、意図しないリソースの削除や再作成を防ぎます。


変更セットの内容を確認後、問題がなければ適用を実行します。更新中のステータスはUPDATE_IN_PROGRESSとなり、完了するとUPDATE_COMPLETEに遷移します。更新に失敗した場合はUPDATE_ROLLBACK_IN_PROGRESSとなり、前の安定した状態に自動的にロールバックされます。


CloudFormationは、可能な限り既存リソースを維持し、変更が必要な部分のみを更新します。ただし、一部のリソースプロパティは変更時にリソースの置き換え(削除と再作成)が必要になる場合があり、これらは変更セットで事前に確認できます。

スタックの削除

不要になったインフラを削除する際は、スタックの削除を実行します。CloudFormationは、スタックに属するすべてのリソースを自動的に削除します。削除は依存関係の逆順で実行され、例えばEC2インスタンスを削除してからセキュリティグループを削除するといった適切な順序が保たれます。


削除中のステータスはDELETE_IN_PROGRESSとなり、すべてのリソースが削除されるとスタック自体も削除され、一覧から消えます。削除に失敗した場合はDELETE_FAILEDとなり、削除できなかったリソースが残ります。


一部のリソース(S3バケット、RDSスナップショット等)には削除保護機能があり、意図しない削除を防ぐために削除ポリシーを設定できます。テンプレート内でDeletionPolicy属性をRetainに設定すると、スタック削除時にもリソースを保持することが可能です

変更セットによる安全な更新

本番環境のスタック更新では、変更セットを活用した慎重なワークフローが推奨されます。まず変更セットを作成して影響範囲を確認し、チーム内でレビューを実施します。問題がなければ変更セットを実行し、実際の更新を適用します。


この2段階のプロセスにより、予期しない変更やダウンタイムを事前に検出でき、本番環境の安定性を保ちながらインフラを更新できます。変更セットは、Terraform のterraform planに相当する機能であり、実行前の確認を可能にする重要な安全機構です。