ITの教科書検索
入門読了 約10分

AWS CloudFormationとは ― テンプレートとスタック

CloudFormationは、テンプレートに書いた構成どおりにAWSのリソースを作るIaCのサービスです。スタック・変更セット・ロールバックの動きと、手作業との使い分けを図で示します。

目次
  1. AWS CloudFormationとは
  2. テンプレートの書き方
  3. スタックと作る順番
  4. 更新と変更セット
  5. 失敗したときのロールバック
  6. ドリフト検出
  7. 手作業・CLIとの使い分け
  8. TerraformやAWS CDKとの違い
  9. 料金
  10. 練習問題

AWS CloudFormationとは、テンプレートに書いた構成どおりにリソースを作るサービス

VPCやEC2をコンソールの画面で作ると、同じ構成をもう一度作るときも、同じ操作を繰り返すことになります。AWS CloudFormationなら、テキストファイルに書いた構成どおりにリソースをまとめて作成し、設定できます。

インフラの構成をコードで管理するIaCを、AWSで行う手段の1つです。宣言型と手続き型の違いや冪等性のような、ツールに依らない考え方はIaCの記事で説明しています。

CloudFormationに渡すファイルを、テンプレートと呼びます。VPCやEC2インスタンスのように必要なリソースを書くと、CloudFormationが順番を決めて作成します。リソースの依存関係を、利用者が1つずつ考える必要はありません。

テンプレートの書き方は、Resourcesが中心

テンプレートは、YAMLかJSONの形式で書くテキストファイルです。内容は、役割ごとのセクションに分かれます。どのテンプレートにも必須なのは、作成するリソースを書くResourcesのセクションです。

テンプレートの主なセクション(AWS CloudFormationユーザーガイド、2026-10-29時点)
セクション役割
Resources作成するリソースと、その設定を書く。どのテンプレートにも必須
Parametersスタックの作成時や更新時に、値を外部から渡す。省略できる
Outputsスタックの情報として返す値を書く。ほかのスタックから読み込むこともできる。省略できる

次の例は、VPCを1つ作り、その中にサブネット1つとEC2インスタンス1台を置くテンプレートです。インスタンスタイプは、Parametersでスタックを作るときに選べるようにしています。

VPC・サブネット・EC2を作るテンプレート(YAML)
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 MyInstance

Resourcesの下の 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には書けません。

同じサブネットをJSONで書いた例
"MySubnet": {
  "Type": "AWS::EC2::Subnet",
  "Properties": {
    "VpcId": { "Ref": "MyVPC" },
    "CidrBlock": "10.0.1.0/24"
  }
}

スタックは、まとめて作成してまとめて削除する単位

テンプレートからリソースを作るときは、スタックを作ります。スタックは、関連するリソースを1つの単位として扱うまとまりです。スタックを作成すると、リソースがまとめて作成されます。スタックを削除すると、中のリソースもすべて削除されます。

テンプレートYAMLかJSON読むCloudFormation作るスタック番号=作る順1VPCCidrBlock: 10.0.0.0/162サブネットVpcId: !Ref MyVPC3EC2インスタンスSubnetId: !Ref MySubnet参照参照スタックを消す3つともまとめて消える消す順は3→2→1
CloudFormationはテンプレートを読み、書かれたリソースを1つのスタックとして作ります。参照される側が先に作られ、スタックを削除すると逆の順にまとめて削除されます。

前の節のテンプレートでは、サブネットがVPCを、インスタンスがサブネットを参照しています。リソースAがリソースBを参照していると、CloudFormationはBを先に作成します。削除するときは、Aを先に削除します。

参照関係のないリソースは、できるだけ同時に作成します。参照だけでは決まらない順番は、DependsOn という属性で指定します。

スタックを削除しても残したいリソースには、DeletionPolicy という属性で Retain を指定します。

CloudFormationは、テンプレートに書かれたとおりに、各サービスのAPIを呼んでリソースを作ります。そのため、スタックを作成する人には、中のリソースを作成する権限が必要です。権限はIAMで与えます。CloudFormationが使うIAMロールを指定したときは、そのロールの権限で作成します。

料金は、スタックではなく中のリソースにかかります。ユーザーガイドによると、作成してすぐスタックを削除しても、リソースが動いていた時間の料金はかかります。

更新では、変更セットで差分を確認してから実行する

スタックを更新するときは、書き換えたテンプレートか、新しいパラメータの値を渡します。CloudFormationは現在のスタックと比較し、変更があったリソースだけを更新します。変更がないリソースは、止まらずに動き続けます。

リソースの更新動作は3種類あります。どれになるかは、リソースの種類と、変更したプロパティで決まります。

リソースの更新動作(AWS&nbsp;CloudFormationユーザーガイド・テンプレートリファレンス、2026-10-29時点)
更新の動作起きること例
中断なしの更新動作したまま設定を変更する。IDは変わらないEC2のタグを追加する
一部中断を伴う更新設定の変更中に、一時的に止まることがあるEC2のインスタンスタイプを変更する
置き換え新しいリソースを作り、古いほうを削除する。IDが変わるEC2のAZを変更する

置き換えでは、通常は新しいリソースを先に作成します。ほかのリソースからの参照を付け替えてから、古いほうを削除します。置き換えで作られる新しいリソースには、古いほうのデータは引き継がれません。RDSのDBインスタンスの名前を変更すると、新しいデータベースが作成され、古いほうは削除されます。

更新の方法には、すぐに反映する直接更新と、変更セットを使う方法があります。変更セットは、スタックを変更する前に、どのリソースがどう変わるかを一覧にしたものです。変更セットを作成しただけでは、スタックは変わりません。実行したときに初めて更新されます。

新しいテンプレート出す変更セットを作るまだ変えない比べる今のスタック見る変更の一覧追加・変更・削除置き換えるかどうか実行やめるスタックを更新ほかの変更セットは消える実行しないスタックは同じ
変更セットは、新しいテンプレートを現在のスタックと比較して作るだけで、スタックは変えません。一覧を確認して実行したときにだけ、スタックが更新されます。

変更セットの一覧には、リソースごとに Action と Replacement が表示されます。Action は、追加・変更・削除のどれかを示します。Replacement は、変更時に置き換えになるかどうかを示します。次の図で、テンプレートの変更を選ぶと、変更セットに表示される値と影響が分かります。

テンプレートの変更
変わるもの
AWS::EC2::Instance の Tags
変更セットの Action
Modify
変更セットの Replacement
False
更新の動作
中断なしの更新
影響
インスタンスは動いたまま更新され、インスタンスIDも変わりません。

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などのリソースも扱います。実際のインフラの状態は、状態ファイルに記録して管理します。

CloudFormation・CDK・Terraformの違い(各社の公式ドキュメント、2026-10-29時点)
ツール書き方扱う範囲
AWS CloudFormationYAMLかJSONのテンプレート主にAWSのリソース。スタックの単位で管理する
AWS CDKTypeScript・PythonなどのプログラムAWSのリソース。CloudFormationを通して作る
TerraformTerraformの設定ファイルAWS・Azure・Google Cloudなど。実際の構成を状態ファイルで追う

どれが向くかは、使うクラウドと、チームが慣れた書き方で変わります。各ツールの位置づけは、IaCの記事の代表的なツールの節でも比べています。

料金は、作ったリソースにかかる

AWSのリソースを作るだけなら、CloudFormationの追加料金はかかりません。かかるのは、EC2インスタンスなど作成したリソースの料金で、手動で作った場合と同じです。サードパーティなどのリソースの種類を使うときは、操作の回数と時間で料金がかかります。対象は、名前が AWS:: か Alexa:: で始まらない種類です。

この内容は、2026年10月29日にCloudFormationの料金ページで確認したものです。リソースごとの料金の考え方は、料金の記事にまとめています。

参考にした資料

練習問題(全5問)

Q1AWS CloudFormationの説明として正しいものはどれ?
Q2テンプレートで、どのテンプレートにも必ず書く必要があるセクションはどれ?
Q3サブネットの VpcId に !Ref MyVPC と書いたとき、CloudFormationが作る順番として正しいものはどれ?
Q4変更セットの説明として正しいものはどれ?
Q5スタックの作成中に1つのリソースの作成に失敗したとき、何も設定していなければCloudFormationはどうする?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

AWSの記事を続けて読む

AWS 全38本中35本目