aws

AWS CloudFormationとは?テンプレートの書き方から使い方までわかりやすく解説

AWS CloudFormation(クラウドフォーメーション)とは、AWSのインフラをコード(テンプレート)として定義し、自動で構築・管理できるサービスです。EC2インスタンスやS3バケット、VPCといったAWSリソースを、手作業ではなくテンプレートファイルにまとめて記述し、一括で作成・更新・削除できます。これにより、環境の一貫性を保ちながら、手動操作によるミスを減らせます。いわゆる「IaC(Infrastructure as Code=コードによるインフラ管理)」をAWS上で実現する代表的なサービスです。本記事では、CloudFormationの仕組みから、テンプレートの書き方、スタックの操作、Terraformとの違いまで、コード例つきでわかりやすく解説します。

目次

CloudFormationとは:インフラをコードで管理するAWSのサービス

まず、CloudFormationがどんなサービスで、何が嬉しいのかを整理します。

CloudFormationの基本

CloudFormationは、AWSリソースの構成を「テンプレート」と呼ばれるYAMLまたはJSON形式のファイルに記述し、その通りにインフラを自動構築するサービスです。たとえば「t2.microのEC2インスタンスを1台、特定のVPC内に作る」といった構成をテンプレートに書いておけば、AWSがその内容を読み取って自動的にリソースを作成します。同じテンプレートを使えば、開発・テスト・本番で同一の環境を何度でも再現できます。

以下は、もっともシンプルなEC2インスタンスを作成するテンプレートの例です。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: 't2.micro'
      ImageId: 'ami-0abcdef1234567890'
      KeyName: 'my-key-pair'

Typeで作成するリソースの種類を、Propertiesでその設定を指定します。ImageIdには使用するAMIのID、KeyNameにはSSH接続用のキーペア名を指定します。

CloudFormationを使うメリット

CloudFormationの主なメリットは、作業の自動化と環境の一貫性です。手作業の設定を減らすことで人為的なミスを防ぎ、同じテンプレートを再利用することで複数環境を一貫した状態で構築できます。さらに、テンプレートをGitなどでバージョン管理すれば、インフラの変更履歴をコードとして追跡できます。CloudFormation自体の利用に追加料金はかからず、作成したAWSリソースの利用料金のみが発生します。

主要な構成要素(テンプレート・スタック・変更セット)

CloudFormationを理解するうえで欠かせないのが、次の3つの用語です。テンプレートは、リソースの定義を記述したYAML/JSONファイルです。スタックは、1つのテンプレートから作成されたAWSリソースのまとまりで、作成・更新・削除の単位になります。変更セットは、既存スタックに加える変更を事前にプレビューする仕組みで、予期しない変更を防ぎます。この3つの関係を押さえると、CloudFormationの操作全体が理解しやすくなります。

CloudFormationテンプレートの書き方

テンプレートはCloudFormationの中心です。基本構造とよく使う書き方を見ていきます。

テンプレートの基本構造

テンプレートは、いくつかのセクションで構成されます。最低限必要なのはResourcesセクションで、ここに作成するリソースを記述します。そのほか、外部から値を渡すParameters、出力値を定義するOutputs、条件分岐のConditionsなどがあります。以下は、VPCとサブネットを作成する例です。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyVPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '10.0.0.0/16'
      EnableDnsSupport: true
      EnableDnsHostnames: true
  MySubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: '10.0.1.0/24'
      MapPublicIpOnLaunch: true

!Ref MyVPCは、同じテンプレート内で定義したVPCを参照する組み込み関数です。このように、リソース同士の依存関係をテンプレート内で表現できます。

パラメータで柔軟にする

Parametersを使うと、テンプレートを変更せずに値だけを差し替えられます。たとえばインスタンスタイプを外部から指定できるようにすると、開発環境と本番環境で同じテンプレートを使い分けられます。

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  InstanceType:
    Type: String
    Default: 't2.micro'
    Description: 'EC2インスタンスのタイプ'
Resources:
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: !Ref InstanceType
      ImageId: 'ami-0abcdef1234567890'
      KeyName: 'my-key-pair'

条件でリソースの作成を制御する

Conditionsを使うと、パラメータの値に応じてリソースを作るかどうかを切り替えられます。本番環境のときだけ特定のリソースを作る、といった制御が可能です。

Parameters:
  CreateProdResources:
    Type: String
    AllowedValues: ['true', 'false']
    Default: 'false'
Conditions:
  IsProd: !Equals [!Ref CreateProdResources, 'true']
Resources:
  MyProdInstance:
    Type: 'AWS::EC2::Instance'
    Condition: IsProd
    Properties:
      InstanceType: 't2.large'
      ImageId: 'ami-0abcdef1234567890'
      KeyName: 'my-key-pair'

スタックの操作:作成・更新・削除

テンプレートを書いたら、それをもとにスタックを作成します。スタックの基本操作を見ていきます。

スタックの作成

スタックは、AWSマネジメントコンソール、AWS CLI、AWS SDKのいずれからでも作成できます。AWS CLIを使う場合は次のコマンドです。

aws cloudformation create-stack \
  --stack-name my-stack \
  --template-body file://template.yml

作成が始まると、テンプレートに定義したリソースが順番にプロビジョニングされ、完了するとスタックの状態が「CREATE_COMPLETE」になります。

スタックの更新

テンプレートを修正して再適用すると、スタックを更新できます。CloudFormationは差分を検出し、変更が必要なリソースだけを更新します。

aws cloudformation update-stack \
  --stack-name my-stack \
  --template-body file://updated-template.yml

スタックの削除

スタックを削除すると、そのスタックで作成したリソースもまとめて削除されます。後片付けが簡単なのもIaCの利点です。

aws cloudformation delete-stack --stack-name my-stack

複数スタックの連携(クロススタック参照)

大規模な構成では、ネットワーク用・アプリ用などスタックを分割し、相互に参照させる方法が有効です。あるスタックの出力値をExportし、別のスタックから!ImportValueで取り込みます。たとえばVPCスタックでVPC IDをエクスポートし、EC2スタックでそれを参照する、といった構成です。スタックを役割ごとに分けることで、管理と再利用がしやすくなります。

変更セットで安全に更新する

本番環境のスタックを更新するときに怖いのが、意図しないリソースの再作成や削除です。これを防ぐのが変更セットです。

変更セットとは

変更セットは、スタックを更新する前に「何がどう変わるか」を一覧でプレビューする機能です。リソースの追加・変更・削除を事前に確認してから適用できるため、予期しない影響を避けられます。

aws cloudformation create-change-set \
  --stack-name my-stack \
  --template-body file://template.yml \
  --change-set-name my-change-set

確認してから適用する

作成した変更セットの内容を確認し、問題がなければ実行してスタックに反映します。確認にはdescribe-change-set、適用にはexecute-change-setを使います。本番環境では、いきなりupdate-stackするのではなく、変更セットで影響を確認してから適用するのが安全なやり方です。

CloudFormationとTerraform・Beanstalkの違い

IaCやデプロイの手段はCloudFormationだけではありません。よく比較される2つとの違いを簡潔に整理します。

Terraformとの違い

CloudFormationがAWS専用なのに対し、TerraformはAWS・Azure・GCPなど複数のクラウドに対応するマルチクラウド対応のIaCツールです。テンプレート言語も異なり、CloudFormationはYAML/JSON、TerraformはHCLという独自言語を使います。AWSだけで完結し、AWSサービスとの統合を重視するならCloudFormation、複数クラウドをまたいで統一的に管理したいならTerraform、という使い分けが基本です。

項目 CloudFormation Terraform
対応クラウド AWSのみ マルチクラウド(AWS/Azure/GCP等)
記述言語 YAML / JSON HCL
提供元 AWS純正 HashiCorp(サードパーティ)
向いているケース AWS専用・AWS統合重視 複数クラウド・幅広いリソース管理

Elastic Beanstalkとの違い

Elastic Beanstalkは、アプリケーションのコードをアップロードするだけで、必要なインフラの構築からデプロイまでを自動で行うサービス(PaaS的な位置づけ)です。インフラの細かい定義を意識せずに手早くアプリを動かしたいならBeanstalk、インフラ全体を細かくコードで定義・管理したいならCloudFormation、という違いがあります。両者は併用も可能で、CloudFormationでインフラ基盤を定義しつつ、その中でBeanstalk環境を構築することもできます。

CloudFormationと関連サービス・ツール

CloudFormationは、AWSの他のIaC・デプロイ関連ツールと組み合わせて使われることがよくあります。

AWS CDK:プログラミング言語でテンプレートを生成

AWS CDK(Cloud Development Kit)を使うと、TypeScriptやPythonなどのプログラミング言語でインフラを記述し、それをCloudFormationテンプレートに変換できます。YAMLを直接書く代わりに、使い慣れた言語でループや条件分岐を活用してテンプレートを生成したい場合に便利です。

AWS SAM:サーバーレス向けの拡張

AWS SAM(Serverless Application Model)は、CloudFormationを拡張し、Lambda・API Gateway・DynamoDBといったサーバーレス構成を簡潔に記述できるようにしたフレームワークです。サーバーレスアプリのデプロイを主とする場合は、SAMの利用を検討するとテンプレートがすっきりします。

CI/CDパイプラインとの統合

CloudFormationは、CodePipelineなどのCI/CDツールと組み合わせることで、テンプレートの変更を自動でデプロイできます。Gitにテンプレートをコミットすると、パイプラインが変更を検知してスタックを更新する、といった運用が可能です。これにより、インフラの変更管理をアプリ開発と同じワークフローに乗せられます。

CloudFormation利用時のポイント

テンプレートは小さく分割する

1つのテンプレートにすべてを詰め込むと、肥大化して管理が難しくなります。ネットワーク・アプリ・データベースなど役割ごとにテンプレートを分け、必要に応じてネストやクロススタック参照で連携させると、見通しがよくなり再利用もしやすくなります。

最小権限とセキュリティを意識する

IAMロールやポリシーをテンプレートで定義するときは、最小権限の原則を守り、必要なアクションだけを許可します。また、Drift Detection(ドリフト検出)機能を使うと、テンプレートの定義と実際のリソースの状態にズレが生じていないかを確認できます。

ランタイムなどのバージョンは最新の状況を確認する

Lambdaのランタイムなど、AWSのリソースには時間とともにサポートが終了するバージョンがあります。たとえばNode.jsランタイムは新しいバージョンへの移行が定期的に必要です。テンプレートに古いバージョンを指定したままにせず、作成・更新時には公式ドキュメントで現在サポートされているバージョンを確認しましょう。

まとめ:CloudFormationでAWSインフラをコード化する

AWS CloudFormationは、AWSのインフラをテンプレート(YAML/JSON)として定義し、自動で構築・管理できるサービスです。テンプレートにリソースを記述し、スタックという単位で作成・更新・削除を行い、本番更新時は変更セットで影響を事前確認する、という流れが基本です。同じテンプレートを再利用することで、環境の一貫性を保ちながらインフラ構築を効率化でき、Gitと組み合わせれば変更履歴もコードとして管理できます。AWSに特化している点が強みで、マルチクラウドが必要ならTerraform、サーバーレス中心ならSAM、プログラミング言語で書きたいならCDK、と関連ツールを使い分けるとよいでしょう。まずは小さなテンプレートでスタックを作るところから始めて、徐々に構成を広げていくのがおすすめです。

よくある質問(FAQ)

Q. CloudFormationの利用に料金はかかりますか?

A. CloudFormation自体の利用に追加料金はかかりません。テンプレートで作成したEC2やRDSなど、AWSリソースの通常の利用料金のみが発生します。

Q. テンプレートはYAMLとJSONのどちらで書くべきですか?

A. どちらでも同じことができますが、YAMLはコメントが書け、記述も簡潔なため、人が読み書きする用途ではYAMLが好まれる傾向があります。JSONはツールでの生成・処理に向いています。

Q. CloudFormationとTerraformはどちらを使うべきですか?

A. AWSだけで完結し、AWSサービスとの統合を重視するならCloudFormation、複数のクラウドをまたいで統一的に管理したいならTerraformが向いています。

Q. スタックを削除するとリソースはどうなりますか?

A. スタックを削除すると、そのスタックで作成したリソースもまとめて削除されます。残したいリソースには削除ポリシー(DeletionPolicy)を設定して保護できます。

Q. 本番環境を安全に更新するにはどうすればよいですか?

A. いきなり更新せず、変更セットを作成して「何がどう変わるか」を事前に確認してから適用するのが安全です。テスト環境で検証してから本番に反映することも推奨されます。

資料請求

RELATED POSTS 関連記事