AWSを業務で使っていると、「環境構築を自動化したい」「設定をコードで管理したい」
――そんな場面が必ず出てきます。
でもTerraformほどの自由度はいらない。
AWS公式の仕組みで、確実にAWSリソースを管理したい。
そこで登場するのが AWS CloudFormation(CFn) です。
この記事では、CloudFormationの基本的な考え方と、
最小構成のテンプレートを使って「どう動くか」を体感していきます。
1. CloudFormationとは?
CloudFormationは、AWSのリソース構成をYAMLまたはJSONで定義し、AWSに適用できる仕組みです。
手動操作では「誰が・いつ・どんな設定を変えたか」が不明になりがちですが、
CFnを使えば構成がコードとして残り、再現性のある環境構築が可能になります。
特徴をざっくりまとめると👇
| 特徴 | 説明 |
|---|---|
| インフラをコード化(IaC) | コンソール操作の代わりにYAMLファイルで定義 |
| 差分管理 | テンプレート変更 → スタック更新で差分デプロイ可能 |
| 再現性 | 同じテンプレートを別環境にそのまま適用できる |
| 一括管理 | リソースを「スタック」という単位でまとめて操作 |
わかりにくいという方は、以下記事でたとえを用いて解説していますので、よろしければ参照してみてください!
2. CloudFormationの構成要素
CloudFormationのテンプレートは、基本的に以下のようなセクションで構成されています。
AWSTemplateFormatVersion: "2010-09-09"
Description: Sample template for understanding structure
Metadata:
Version: 1.0
Author: "shimizu"
Mappings:
RegionMap:
ap-northeast-1:
AMI: ami-0123456789abcdef0
ap-northeast-3:
AMI: ami-0abcdef0123456789
Parameters:
Environment:
Type: String
AllowedValues: [dev, stg, prod]
Default: dev
Conditions:
IsProd: !Equals [!Ref Environment, prod]
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Condition: IsProd
Properties:
BucketName: !Sub "${Environment}-app-bucket"
Outputs:
BucketName:
Value: !Ref S3Bucket
日本語は文字化けするので、Descriptionなどに説明文を入れる際はご注意ください。
3. 各セクションの役割一覧
| セクション名 | 説明 |
|---|---|
| AWSTemplateFormatVersion | テンプレートフォーマットのバージョン(基本 "2010-09-09" 固定) |
| Description | テンプレート全体の説明。コンソールにも表示される |
| Metadata | カスタムメタデータ(テンプレートに関する補足情報)もしくは、入力パラメータの順序を定義可能 |
| Mappings | 環境・リージョンごとに定義値をマッピング。FindInMap関数で参照する |
| Parameters | デプロイ時に外部から渡せる変数。環境名やCIDR、ブーリアンなどを指定する際に使用 |
| Conditions | 条件式を定義し、リソースを作成するかどうかを動的に制御する |
| Resources | 実際に作成されるAWSリソースを定義するセクション。最重要。 |
| Outputs | スタック作成後に出力したい値を定義。別スタックでImportValueとして利用可能。 |
4. 各セクションの詳細
🧩 Metadata(メタデータ)
テンプレートの補足情報を記載するためのセクションです。
パラメータの順序指定でよく使います。
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: "Network Configuration"
Parameters:
- VPCID
- SubnetId
- SecurityGroupID
- Label:
default: "Amazon EC2 Configuration"
Parameters:
- InstanceType
- KeyName
ParameterLabels:
VPCID:
default: "Which VPC should this be deployed to?"
🌏 Mappings(マッピング)
環境やリージョンごとに異なる設定値を定義しておくセクションです。
FindInMap 関数を使って参照します。
Mappings:
RegionMap:
ap-northeast-1:
AMI: ami-0123456789abcdef0
ap-northeast-3:
AMI: ami-0abcdef0123456789
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]
⚙️ Conditions(条件)
テンプレート内でリソースを作成するかどうかを動的に制御できます。
!Equals や !And, !Or, !Not などの論理関数を使用。
Parameters:
Environment:
Type: String
AllowedValues: [dev, prod]
Conditions:
IsProd: !Equals [!Ref Environment, prod]
Resources:
ProdBucket:
Type: AWS::S3::Bucket
Condition: IsProd
Properties:
BucketName: prod-app-bucket
5. 実際に試す(S3バケット)
では、最小構成のテンプレートで試してみましょう。
以下をテキストなどで作成して、デスクトップなどわかりやすいところに保存しましょう。
s3-sample.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Create a simple S3 bucket
Parameters:
BucketName:
Type: String
Description: "The name of the S3 bucket"
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref BucketName
6. デプロイ手順(手動)
マネジメントコンソールにアクセスし、CloudFormationを選択し「スタックの作成」を押下します。

「テンプレートファイルのアップロード」を選択し、保存したファイルを選択します。
スタック名とパラメータ(S3バケット名)を入力して、「次へ」を押下します。
バケット名は全世界で一意である必要があるので、日付などかぶりにくいものを入力しましょう。
設定はそのままで、「次へ」を押下します。
ステータスが「CREATE_COMPLETE」になり、マネジメントコンソールから、S3に行くと
指定したバケット名でバケットが作成されていました。
7. スタックの更新・削除
更新(差分適用)/削除
マネジメントコンソールでCloudFormationにもどり、作成したスタックを選択すると以下の画面が表示されます。
「スタックを更新」のプルダウンから、「変更セットを作成」もしくは「直接更新を実行」を選択すると、更新が可能です。
また、削除したい場合は、同画面の「削除」を押下することで削除することが可能です。
※削除することで作成したリソースも削除されます。
8. まとめ
- CloudFormationテンプレートは、8つの主要セクションで構成される
-
Resourcesが中心だが、ParametersやMappingsを使うと汎用性が上がる -
Conditionsを使えば環境ごとの制御も可能 -
Metadataはチーム開発時のドキュメント化に役立つ
次回予告
次回は、
「ネステッドスタックでテンプレートを分割管理してみよう」
をテーマに、
親スタックと子スタックの関係、Outputs/ImportValueを使ったデータ連携を解説します。







