AWS CloudFormationとは ― テンプレートとスタック
CloudFormationは、
AWS CloudFormationとは、テンプレートに書いた構成どおりにリソースを作るサービス
VPCやEC2をコンソールの画面で作ると、同じ構成をもう一度作るときも、同じ操作を繰り返すことになります。AWS CloudFormationなら、テキストファイルに書いた構成どおりにリソースをまとめて作成し、設定できます。
インフラの構成をコードで管理するIaCを、AWSで行う手段の1つです。宣言型と手続き型の違いや冪等性のような、ツールに依らない考え方はIaCの記事で説明しています。
CloudFormationに渡すファイルを、テンプレートと呼びます。VPCやEC2インスタンスのように必要なリソースを書くと、CloudFormationが順番を決めて作成します。リソースの依存関係を、利用者が1つずつ考える必要はありません。
テンプレートの書き方は、Resourcesが中心
テンプレートは、YAMLかJSONの形式で書くテキストファイルです。内容は、役割ごとのセクションに分かれます。どのテンプレートにも必須なのは、作成するリソースを書くResourcesのセクションです。
| セクション | 役割 |
|---|---|
| Resources | 作成する |
| Parameters | スタックの |
| Outputs | スタックの |
次の例は、VPCを1つ作り、その中にサブネット1つとEC2インスタンス1台を置くテンプレートです。インスタンスタイプは、Parametersでスタックを作るときに選べるようにしています。
AWSTemplateFormatVersion: 2010-09-09
Description: VPC, subnet and one EC2 instance
Parameters:
InstanceType:
Type: String
Default: t3.micro
AllowedValues:
- t3.micro
- t3.small
LatestAmiId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
MySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.1.0/24
MyInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId
InstanceType: !Ref InstanceType
SubnetId: !Ref MySubnet
Outputs:
InstanceId:
Description: ID of the EC2 instance
Value: !Ref MyInstanceResourcesの下の MyVPC や MySubnet は、テンプレートの中でリソースを指す名前です。この名前を、論理IDと呼びます。Type にはリソースの種類を書き、Properties にはその設定を書きます。
!Refは、別のリソースやパラメータの値を取り出す書き方です。サブネットの VpcId に!Ref MyVPCと書くと、作られたVPCのIDが入ります。インスタンスの InstanceType には、パラメータで選んだ値が入ります。
LatestAmiId は、最新のAmazon LinuxのAMIのIDを受け取るパラメータです。AWSが公開している値の保存場所を指定しておくと、スタックの作成時にそこからIDを読み込みます。Outputsには、作ったインスタンスのIDを返すよう書いています。
同じサブネットをJSONで書くと、次のようになります。JSONでは、!Refを"Ref"という名前の項目として書きます。YAMLは#でコメントを書けますが、JSONには書けません。
"MySubnet": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": { "Ref": "MyVPC" },
"CidrBlock": "10.0.1.0/24"
}
}スタックは、まとめて作成してまとめて削除する単位
テンプレートからリソースを作るときは、スタックを作ります。スタックは、関連するリソースを1つの単位として扱うまとまりです。スタックを作成すると、リソースがまとめて作成されます。スタックを削除すると、中のリソースもすべて削除されます。
前の節のテンプレートでは、サブネットがVPCを、インスタンスがサブネットを参照しています。リソースAがリソースBを参照していると、CloudFormationはBを先に作成します。削除するときは、Aを先に削除します。
参照関係のないリソースは、できるだけ同時に作成します。参照だけでは決まらない順番は、DependsOn という属性で指定します。
スタックを削除しても残したいリソースには、DeletionPolicy という属性で Retain を指定します。
CloudFormationは、テンプレートに書かれたとおりに、各サービスのAPIを呼んでリソースを作ります。そのため、スタックを作成する人には、中のリソースを作成する権限が必要です。権限はIAMで与えます。CloudFormationが使うIAMロールを指定したときは、そのロールの権限で作成します。
料金は、スタックではなく中のリソースにかかります。ユーザーガイドによると、作成してすぐスタックを削除しても、リソースが動いていた時間の料金はかかります。
更新では、変更セットで差分を確認してから実行する
スタックを更新するときは、書き換えたテンプレートか、新しいパラメータの値を渡します。CloudFormationは現在のスタックと比較し、変更があったリソースだけを更新します。変更がないリソースは、止まらずに動き続けます。
リソースの更新動作は3種類あります。どれになるかは、リソースの種類と、変更したプロパティで決まります。
| 更新の | 起きる | 例 |
|---|---|---|
| 中断なしの | 動作したまま | EC2の |
| 一部 | 設定の | EC2の |
| 置き換え | 新しい | EC2の |
置き換えでは、通常は新しいリソースを先に作成します。ほかのリソースからの参照を付け替えてから、古いほうを削除します。置き換えで作られる新しいリソースには、古いほうのデータは引き継がれません。RDSのDBインスタンスの名前を変更すると、新しいデータベースが作成され、古いほうは削除されます。
更新の方法には、すぐに反映する直接更新と、変更セットを使う方法があります。変更セットは、スタックを変更する前に、どのリソースがどう変わるかを一覧にしたものです。変更セットを作成しただけでは、スタックは変わりません。実行したときに初めて更新されます。
変更セットの一覧には、リソースごとに Action と Replacement が表示されます。Action は、追加・変更・削除のどれかを示します。Replacement は、変更時に置き換えになるかどうかを示します。次の図で、テンプレートの変更を選ぶと、変更セットに表示される値と影響が分かります。
- 変わる
もの - AWS::EC2::Instance の Tags
- 変更セットの Action
- Modify
- 変更セットの Replacement
- False
- 更新の
動作 - 中断なしの
更新 - 影響
- インスタンスは
動いたまま 更新され、 インスタンスIDも 変わりません。
- 変わる
もの - AWS::EC2::Instance の InstanceType
- 変更セットの Action
- Modify
- 変更セットの Replacement
- Conditional
(条件に よる) - 更新の
動作 - 一部
中断を 伴う 更新 - 影響
- EBSを
ルートに した インスタンスでは、 新旧の タイプの 互換性で、 再起動か 置き換えかが 決まります。 インスタンスストアを ルートに した インスタンスは、 必ず 置き換えです。
- 変わる
もの - AWS::EC2::Instance の AvailabilityZone
- 変更セットの Action
- Modify
- 変更セットの Replacement
- True
- 更新の
動作 - 置き換え
- 影響
- 通常は
新しい インスタンスを 先に 作り、 参照を 付け替えてから 古い ほうを 削除します。 インスタンスIDは 新しくなります。
- 変わる
もの - AWS::RDS::DBInstance の DBInstanceIdentifier
- 変更セットの Action
- Modify
- 変更セットの Replacement
- True
- 更新の
動作 - 置き換え
- 影響
- 新しい
DBインスタンスを 作り、 古い ほうを 削除します。 バックアップを 取っていなければ、 古い データベースの データは 失われます。
- 変わる
もの - テンプレートから
削除した リソース - 変更セットの Action
- Remove
- 変更セットの Replacement
- 出ない
(Modify の ときだけの 項目) - 更新の
動作 - 削除
- 影響
- テンプレートから
削除した リソースは、 実際の AWSからも 削除されます。 DeletionPolicy で Retain を 指定した リソースは、 スタックの 管理から 外れるだけで 残ります。
Replacement が True なら、実行の前にRDSのスナップショットを取るなどの準備ができます。変更セットは、案ごとに複数作成して比較できます。1つを実行すると、そのスタックのほかの変更セットは削除されます。
ただし、変更セットは更新が成功することまでは保証しません。作成時に構文の誤りや名前の重複は確認します。それでも、実行中の条件で失敗することはあります。
失敗したときは、ロールバックで元に戻る
CloudFormationは、スタックのリソースを1つの単位として扱います。スタックの作成中に1つでも作成に失敗するリソースがあると、作成済みのリソースを削除して元に戻します。この動作を、ロールバックと呼びます。
更新に失敗したときも、スタックは以前の正常な状態に戻ります。作成で戻ったときの状態は ROLLBACK_COMPLETE です。更新で戻ったときは UPDATE_ROLLBACK_COMPLETE になります。
成功したリソースを残す設定を選ぶこともできます。この設定では、成功したリソースを削除せずに、失敗した箇所から再開できます。原因が権限の不足なら、権限を修正してから同じ操作を再実行します。
ドリフト検出は、CloudFormationの外での変更を見つける
スタックで作成したリソースも、EC2の画面などから直接変更できます。こうして実際の設定がテンプレートと異なる状態になることを、ドリフトと呼びます。ずれの考え方は、IaCの記事で説明したものと同じです。
ドリフト検出を使うと、テンプレートと異なるリソースとプロパティが分かります。リソースが削除されていた場合も、ドリフトとして示されます。ドリフトがなければ IN_SYNC と表示されます。変更されていれば MODIFIED、削除されていれば DELETED です。
通常の変更セットは、前回のテンプレートと新しいテンプレートだけを比較します。ドリフトに対応した変更セットは、実際の設定とも比較します。実行すると、AWSが管理する一部のプロパティなどを除き、ドリフトしたリソースをテンプレートの設定に戻します。
手作業・CLIとの使い分けは、1回きりか繰り返すか
AWSのリソースは、マネジメントコンソールの画面やAWS CLIのコマンドでも作れます。試しに1つ作って動作を確認するだけなら、画面やCLIで十分です。同じ構成を何度も作るなら、テンプレートにしておくほうが確実です。
ユーザーガイドの説明では、一度書いたテンプレートで同じリソースを複数のリージョンに何度でも作れます。テンプレートはテキストなので、誰が・いつ・何を変えたかを、バージョン管理で追えます。スタックを削除すれば中のリソースがまとめて削除されるため、削除し忘れも起きにくくなります。
テンプレートの変更を確認してから自動で反映する流れは、CI/CDの記事で説明した仕組みと組み合わせられます。複数のAWSアカウントやリージョンに同じスタックを展開するときは、StackSetsを使います。StackSetsは、1つのテンプレートをもとに、選んだアカウントとリージョンにスタックを1回の操作で作る機能です。アカウントのまとめ方は、Organizationsの記事で説明しています。
TerraformやAWS CDKとの違い
CloudFormationのほかにも、AWSのリソースをコードで作るツールがあります。AWS CDKは、AWSのオープンソースの開発フレームワークです。TypeScriptやPythonなどのプログラムでインフラを書きます。CDKで書いたインフラは、CloudFormationを通して作られます。
Terraformは、HashiCorpのIaCのツールです。AWSのほか、AzureやGoogle Cloudなどのリソースも扱います。実際のインフラの状態は、状態ファイルに記録して管理します。
| ツール | 書き方 | 扱う |
|---|---|---|
| AWS CloudFormation | YAMLか | 主に |
| AWS CDK | TypeScript・Pythonなどの | AWSの |
| Terraform | Terraformの | AWS・Azure・Google Cloudなど。 |
どれが向くかは、使うクラウドと、チームが慣れた書き方で変わります。各ツールの位置づけは、IaCの記事の代表的なツールの節でも比べています。
料金は、作ったリソースにかかる
AWSのリソースを作るだけなら、CloudFormationの追加料金はかかりません。かかるのは、EC2インスタンスなど作成したリソースの料金で、手動で作った場合と同じです。サードパーティなどのリソースの種類を使うときは、操作の回数と時間で料金がかかります。対象は、名前が AWS:: か Alexa:: で始まらない種類です。
この内容は、2026年10月29日にCloudFormationの料金ページで確認したものです。リソースごとの料金の考え方は、料金の記事にまとめています。
参考にした資料
- AWS「What is CloudFormation?」・「How CloudFormation works」(定義、テンプレート・スタック・変更セット、権限、作成の失敗)
- AWS「CloudFormation template sections」・「CloudFormation template format」(セクションの役割、YAMLとJSON)
- AWS「Specify existing resources at runtime with CloudFormation-supplied parameter types」・「AL2023 on Amazon EC2」(AMIのIDを受け取るパラメータ)
- AWS「Ref」・「DependsOn attribute」(参照と、作る順・消す順)
- AWS「Managing AWS resources as a single unit with CloudFormation stacks」(スタックの定義、更新の2つの方法、料金の注意、ロールバック)
- AWS「Understand update behaviors of stack resources」と、テンプレートリファレンスのAWS::EC2::Instance・AWS::RDS::DBInstance(更新の3種類と、プロパティごとの動作)
- AWS「Update CloudFormation stacks using change sets」・「Example change sets for CloudFormation stacks」・「ResourceChange」(変更セットの流れ、Action と Replacement)
- AWS「View CloudFormation stack events」・「Choose how to handle failures when provisioning resources」(ロールバックの状態、成功したリソースを残す設定)
- AWS「Detect unmanaged configuration changes to stacks and resources with drift detection」・「Using drift-aware change sets」(ドリフト検出と、ドリフトを考慮した変更セット)
- AWS「Managing stacks across accounts and Regions with StackSets」(StackSetsの役割)
- AWS「What is the AWS CDK?」(CDKの定義と、CloudFormationを通して作ること)
- HashiCorp「What is Terraform?」(Terraformの対象と状態ファイル)
- AWS「AWS CloudFormation Pricing」(料金の決まり方。2026-10-29確認)
練習問題(全5問)
正解:テンプレートに
CloudFormationは、
正解:Resources
Resourcesは、
正解:VPCを
ある
正解:スタックを
変更セットは、
正解:作成できたリソースも
CloudFormationは、
選んでから「採点する」を押すと、解説つきで答え合わせができます。