概要
AWS のリソースをマネジメントコンソールから手動で作成していると、手順の抜け漏れや設定ミスが起こりやすく、同じ環境を再現するのも困難です。開発環境・ステージング環境・本番環境で同じ構成を揃えたい場合や、リソースの変更履歴を管理したい場合には、手動操作では限界があります。
AWS CloudFormation は、AWS リソースの構成をテンプレート(JSON または YAML)で定義し、そのテンプレートに基づいてリソースを自動的にプロビジョニングするサービスです。テンプレートをコードとして管理することで、環境の再現性が高まり、変更の追跡も容易になります。
本記事では、CloudFormation の基本概念を理解し、YAML テンプレートを使って S3 バケットと SNS トピックを含むスタックを作成・更新・削除する一連の操作を体験します。

この記事のメリット
- CloudFormation の主要概念(テンプレート、スタック、変更セット)を理解できる
- YAML 形式のテンプレートの基本的な構造と書き方を習得できる
- コンソールからスタックの作成・更新・削除の操作を体験できる
- 変更セットを使ったスタック更新のプレビュー方法を把握できる
- Infrastructure as Code(IaC)の利点を実感できる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

クラウドおさる
クラウドおさるはじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
AWS CloudFormation とは



とひさん、AWS CloudFormation ってどういうサービスですか?
CloudFormation は、AWS リソースをコードで定義して自動的にプロビジョニングするサービスだよ。いわゆる「Infrastructure as Code(IaC)」を実現する AWS のネイティブツールなんだ。



コードで定義するっていうのは、具体的にどういうことですか?
たとえば「S3 バケットを1つ、SNS トピックを1つ作りたい」という構成を YAML や JSON のファイルに書いておくんだ。それを CloudFormation に渡すだけで、自動的にリソースが作られるよ。



手動で作るのとはどう違うんですか?
手動だと手順の抜け漏れや設定ミスが起こりやすいよね。CloudFormation を使えば、同じテンプレートから何度でも同じ環境を再現できるんだ。主なユースケースはこんな感じだよ。
- 開発・ステージング・本番環境の統一的な構築
- マルチリージョンへの同一構成のデプロイ
- リソース構成のバージョン管理と変更追跡
- 環境の一括削除(リソースの消し忘れ防止)



環境の一括削除もできるんですね。消し忘れでコストがかかる心配がなくなりそうです。
そうそう、それも大きなメリットの一つだね。
テンプレート



テンプレートにはどんなことを書くんですか?
テンプレートは JSON か YAML で書くファイルで、作成したい AWS リソースの構成を定義するものだよ。いくつかのセクションに分かれているんだ。
| セクション | 必須 | 説明 |
|---|---|---|
AWSTemplateFormatVersion | いいえ | テンプレートのバージョン(2010-09-09 を指定) |
Description | いいえ | テンプレートの説明 |
Parameters | いいえ | スタック作成時に外部から渡す値の定義 |
Resources | はい | 作成する AWS リソースの定義 |
Outputs | いいえ | スタック作成後に出力する値の定義 |



セクションがたくさんありますけど、全部書かないといけないんですか?
いや、必須なのは Resources セクションだけだよ。最低限リソースの定義があればテンプレートとして機能するんだ。Parameters や Outputs は便利だから使うことが多いけど、なくても動くよ。



なるほど、まずは Resources だけ書けばいいんですね。
スタック



テンプレートを書いたら、次はどうするんですか?
テンプレートをもとに「スタック」を作成するよ。スタックというのは、テンプレートから作成された AWS リソースの集合のことなんだ。



テンプレートとスタックは別のものなんですか?
そうだよ。テンプレートは「設計図」で、スタックは「設計図から実際に建てた建物」みたいなイメージだね。1つのテンプレートから複数のスタックを作ることもできるよ。たとえば同じテンプレートで開発用スタックと本番用スタックを作る、なんてことができるんだ。





スタックを削除したらどうなりますか?
スタックを削除すると、そのスタックに含まれるリソースも一括で削除されるよ。だから、不要になった環境をまるごとクリーンアップできるんだ。



リソースを1つずつ消す必要がないんですね。便利です。
変更セット



一度作ったスタックを後から変更したい場合はどうするんですか?
テンプレートを修正してスタックを更新するんだけど、いきなり更新するのはちょっと怖いよね。そこで「変更セット」という仕組みがあるんだ。



変更セットってなんですか?
更新内容を事前にプレビューできる機能だよ。変更セットを作ると、以下の情報が確認できるんだ。
- 追加されるリソース
- 変更されるリソース
- 削除されるリソース
- リソースの置き換え(Replace)が発生するかどうか



置き換えが発生するって、リソースが一度削除されて再作成されるってことですか?
そのとおり。変更内容によってはリソースが置き換わることがあるんだ。変更セットで事前に確認してから実行すれば、意図しない変更を防げるよ。



本番環境の更新では特に大事そうですね。
ドリフト検出



CloudFormation で作ったリソースを、コンソールから手動で変更しちゃったらどうなりますか?
いい質問だね。手動で変更すると、テンプレートの定義と実際のリソース状態に差異が生じるんだ。これを「ドリフト」って呼ぶよ。



ドリフトが起きたら気づけるんですか?
CloudFormation には「ドリフト検出」機能があって、この差異を検出して一覧表示できるんだ。どのリソースのどのプロパティが変わったのかまで確認できるよ。



なるほど、テンプレートと実態のズレを見つけられるんですね。実践のほうでも試してみたいです。
実践
前提条件
- リージョン:
ap-northeast-1(東京) - IAM ユーザーまたはロールに CloudFormation、S3、SNS の操作権限があること
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| CloudFormation スタック | basic-cfn-stack | テンプレートから作成するスタック |
| S3 バケット | テンプレートで定義(自動命名) | サンプルリソース |
| SNS トピック | BasicCfnTopic | サンプルリソース |
ステップ1: テンプレートの作成
ローカル環境で以下の内容を basic-stack.yaml というファイル名で保存します。
AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation Basic Hands-on - S3 and SNS
Parameters:
Environment:
Type: String
Default: dev
AllowedValues:
- dev
- stg
- prod
Description: Environment name
Resources:
SampleBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub 'basic-cfn-${Environment}-${AWS::AccountId}'
Tags:
- Key: Environment
Value: !Ref Environment
SampleTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: BasicCfnTopic
DisplayName: Basic CloudFormation Topic
Tags:
- Key: Environment
Value: !Ref Environment
Outputs:
BucketName:
Description: Name of the S3 bucket
Value: !Ref SampleBucket
BucketArn:
Description: ARN of the S3 bucket
Value: !GetAtt SampleBucket.Arn
TopicArn:
Description: ARN of the SNS topic
Value: !Ref SampleTopicこのテンプレートのポイントを説明します。
- Parameters:
Environmentパラメータで環境名を指定できるようにしています。デフォルト値はdevです - Resources: S3 バケットと SNS トピックの 2 つのリソースを定義しています
!Sub: 文字列内で変数を展開する組み込み関数です。${Environment}はパラメータの値に、${AWS::AccountId}は AWS アカウント ID に置き換わります!Ref: パラメータやリソースの値を参照する組み込み関数です!GetAtt: リソースの属性値を取得する組み込み関数です- Outputs: スタック作成後に確認したい値(バケット名、ARN など)を出力します
ステップ2: スタックの作成
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
CloudFormationと入力し、表示された「CloudFormation」を選択します - 左側ナビゲーションの「スタック」を選択します
- 「スタックの作成」をクリックします
- 「テンプレートの準備」は「既存のテンプレートを選択」のままにします
- 「テンプレートソース」で「テンプレートファイルのアップロード」を選択します
- 「ファイルの選択」をクリックし、先ほど作成した
basic-stack.yamlをアップロードします


- 「次へ」をクリックします
- スタックの名前に
basic-cfn-stackと入力します - パラメータの
Environmentはデフォルトのdevのままにします


- 「次へ」をクリックします
- スタックオプションの設定はデフォルトのまま「次へ」をクリックします
- 確認画面の内容を確認し、「送信」をクリックします
- スタックのステータスが
CREATE_IN_PROGRESSからCREATE_COMPLETEに変わるまで待ちます


ステップ3: 作成されたリソースの確認
- スタック一覧から
basic-cfn-stackをクリックします - 「リソース」タブを選択すると、テンプレートで定義した S3 バケットと SNS トピックが表示されます


- 「出力」タブを選択すると、
Outputsセクションで定義した値が表示されます。バケット名、バケットの ARN、トピックの ARN が確認できます


ステップ4: 変更セットによるスタックの更新
テンプレートに SNS サブスクリプションを追加して、変更セットを使ったスタック更新を体験します。
ローカル環境で basic-stack.yaml の Resources セクション末尾に以下を追加し、保存します。
TopicSubscription:
Type: AWS::SNS::Subscription
Properties:
Protocol: email
TopicArn: !Ref SampleTopic
Endpoint: your-email@example.com注意:
Endpointの値はご自身のメールアドレスに置き換えてください。
- CloudFormation コンソールでスタック一覧から
basic-cfn-stackを選択します - 「スタックアクション」→「変更セットを作成」を選択します
- 「テンプレートの準備」で「既存のテンプレートを置換」を選択し、「テンプレートファイルのアップロード」から更新した
basic-stack.yamlをアップロードします - 「次へ」をクリックします
- パラメータはそのまま「次へ」をクリックします
- 変更セットオプションもそのまま「次へ」をクリックします
- 確認画面で「変更セットを作成」をクリックします
- 変更セットのステータスが
CREATE_COMPLETEになるまで待ちます


- 変更セットの内容を確認し、
TopicSubscriptionが「Add」として表示されていることを確認します - 「変更セットを実行」をクリックし、ダイアログでも「変更セットを実行」をクリックします
- スタックのステータスが
UPDATE_COMPLETEになれば更新完了です


ステップ5: ドリフト検出
CloudFormation で管理しているリソースを手動で変更した場合にドリフトとして検出されることを確認します。
- まず、SNS コンソールで
BasicCfnTopicの表示名を手動で変更します。上部の検索バーにSNSと入力し、「Amazon SNS」を選択します - 左側ナビゲーションの「トピック」を選択し、
BasicCfnTopicをクリックします - 「編集」をクリックし、表示名を
Modified Topic Nameに変更して「変更の保存」をクリックします - CloudFormation コンソールに戻り、
basic-cfn-stackを選択します - 「スタックアクション」→「ドリフトの検出」を選択します
- 数秒後、「スタックアクション」→「ドリフト結果を表示」を選択します。「スタックのドリフトステータス」が
DRIFTEDになっていない場合は「更新」ボタンを押します - ドリフトステータスが
DRIFTEDと表示され、SampleTopicがドリフトしていることが確認できます


SampleTopicの行を選択して「ドリフトの詳細を表示」をクリックすると、差分の詳細が表示されます。DisplayNameプロパティがテンプレートの値と異なっていることが確認できます


まとめ
- AWS CloudFormation は、テンプレートで AWS リソースの構成を定義し、自動的にプロビジョニングする IaC サービスです
- テンプレート は YAML または JSON 形式で記述し、
Resourcesセクションでリソースを定義します。Parametersでパラメータ化、Outputsで値の出力が可能です - スタック はテンプレートから作成されたリソースの集合であり、スタック単位でリソースの作成・更新・削除を管理します
- 変更セット を使うことで、スタック更新の内容を事前にプレビューし、意図しない変更を防止できます
- ドリフト検出 により、手動変更によるテンプレートと実際のリソース状態の差異を検出できます
- テンプレートをバージョン管理することで、環境の再現性と変更履歴の追跡性が向上します
参照先
- AWS CloudFormation とは – AWS CloudFormation
- テンプレートの基本についての学習 – AWS CloudFormation
- AWS CloudFormation スタックの使用 – AWS CloudFormation
- 変更セットを使用したスタックの更新 – AWS CloudFormation
- CloudFormation スタックのドリフトの検出 – AWS CloudFormation













