CloudFormationテンプレートで使用される構造化データの記述形式 です。YAMLまたはJSONで記述されますが、特にYAMLのブロックスタイル は可読性が高く、人間が理解・保守しやすいため一般的に推奨されます。テンプレートは論理的な階層構造を持ち、リソース定義やパラメータ設定を明確に表現できる点が特徴です。
基本構文
構文記法
構文 記法 階層構造 「スペース」でインデント(半角スペース2文字) キーと値 「: 」で区切る(コロンの後に半角スペース) リスト構造 「- 」で区切る(ハイフンの後に半角スペース) コメント 「#」から行末までコメント
# コメント: このテンプレートは S3 バケットを作成します
AWSTemplateFormatVersion: '2010-09-09'
Description: サンプルのS3バケットを作成するテンプレート
Resources: # 階層構造(スペース2つでインデント)
MyS3Bucket: # キーと値を「: 」で区切る(コロンの後にスペース)
Type: AWS::S3::Bucket # リソースタイプを指定
Properties:
BucketName: my-sample-bucket
Tags: # リスト構造(- の後にスペースを入れる)
- Key: Environment
Value: Dev
- Key: Owner
Value: ExampleUser
整形ルール
「{」「[」の後は、半角スペースが推奨
「}」「]」の前は、半角スペースが推奨
「,」の後は、半角スペースが推奨
空行
空行は無視されます。可読性向上のために適宜使用できます。
ブロック構文(改行の扱い)
記号 動作 | 改行を保持 > 改行をスペースに変換 |+ 末尾の改行を保持 |- 末尾の改行を削除
# 改行を保持(ユーザーデータスクリプトで使用)
UserData:
Fn::Base64: |
#!/bin/bash
yum update -y
yum install -y httpd
# 改行をスペースに変換(長い文字列の折り返し)
Description: >
This is a very long description that spans
multiple lines but will be converted to
a single line with spaces.
スカラー(値)の定義
スカラー 表記例 文字列 abc / "abc" / 'abc' 数値 55 / 33.5 真偽値 true / false Null ~(チルダ) 日付 YYYY-MM-DD
Parameters:
InstanceType:
Type: String
Default: t3.micro # 文字列型(例: インスタンスタイプ)
MaxSize:
Type: Number
Default: 10 # 数値型(例: 上限値など)
EnableMonitoring:
Type: String
Default: true # 真偽値(CloudFormationでは String として扱う)
AllowedValues:
- true
- false
OptionalComment:
Type: String
Default: ~ # Null(チルダ)を指定:値なしを意味する
シーケンス(配列)の定義
# セキュリティグループのインバウンドルール
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
# ネストされたリストの例:リージョンごとのアベイラビリティゾーン
Regions:
- ap-northeast-1: # 東京リージョン
- ap-northeast-1a
- ap-northeast-1c
- us-east-1: # バージニア北部リージョン
- us-east-1a
- us-east-1b
- us-east-1c
マッピング(ハッシュ:key/value)の定義
Mappings:
RegionMap:
us-east-1:
AMI: ami-0c55b159cbfafe1f0
InstanceType: t3.micro
ap-northeast-1:
AMI: ami-0f9ae750e8274075b
InstanceType: t3.small
# リソース定義
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0c55b159cbfafe1f0
InstanceType: t3.micro
Tags:
- Key: Name
Value: MyInstance
- Key: Environment
Value: Production
ハッシュのマージ(<<)
# 共通設定の定義
CommonConfig: &common
Encrypted: true
KmsKeyId: !Ref MyKMSKey
# マージして使用
Resources:
MyEBSVolume:
Type: AWS::EC2::Volume
Properties:
<<: *common
Size: 100
AvailabilityZone: us-east-1a
# 展開結果
# Properties:
# Encrypted: true
# KmsKeyId: !Ref MyKMSKey
# Size: 100
# AvailabilityZone: us-east-1a
CloudFormation 組み込み関数
基本的な参照関数
# リソースやパラメータの値を直接取得する
!Ref MyParameter # パラメータ値
!Ref MyS3Bucket # バケット名
!Ref MyEc2 # インスタンスID
# リソースの特定の属性値を取得する
!GetAtt MyEC2Instance.PrivateIp
!GetAtt MyLoadBalancer.DNSName
!GetAtt MyLambda.Arn
文字列操作関数
# 変数の置換を行う
!Sub 'arn:aws:s3:::${BucketName}/*'
!Ref MyParameter # パラメータ値
# 配列を指定した区切り文字で結合する
!Join [ ',', [ 'a', 'b', 'c' ] ] # a,b,c
# 文字列を区切り文字で分割して配列にする
!Split [ ',', 'a, b, c' ] # ['a', 'b', 'c']
条件関数
# 条件に応じて値を分岐する
!If [IsProduction, 't3.large', 't3.micro']
# 2つの値が等しいか判定する
Conditions:
IsProduction: !Equals [!Ref Environment, 'production']
# 論理演算子(And / Or / Not)
Conditions:
DeployResources: !And
- !Equals [!Ref Environment, 'production']
- !Equals [!Ref Region, 'ap-northeast-1']
マッピング
# Mappingsセクションで定義したマップから値を検索
Mappings:
RegionMap:
ap-northeast-1:
AMI: ami-12345678
us-east-1:
AMI: ami-87654321
Resources:
MyInstance:
Properties:
ImageId: !FindInMap [RegionMap, !Ref AWS::Region, AMI]
検索関数
# リストから指定したインデックスの要素を取得
!Select [0, !GetAZs ''] # 最初のAZを取得
!Select [1, ['a', 'b', 'c']] # 'b'を取得
リスト・配列操作関数
# リージョンのアベイラビリティーゾーンのリストを取得
!GetAZs '' # 現在のリージョンのAZ
!GetAZs 'us-east-1' # 指定リージョンのAZ
Base64エンコード
# 文字列をBase64エンコード(UserDataで使用)
UserData:
Fn::Base64: !Sub |
#!/bin/bash
echo "Hello from ${AWS::StackName}"
エクスポートした値のインポート
# 他のスタックからエクスポートされた値をインポート
!ImportValue NetworkStack-VpcId
CIDR
# CIDR範囲を複数のサブネットに分割
!Cidr [!GetAtt MyVPC.CidrBlock, 6, 8] # 6個のサブネットを、8ビットづつ分割して作る
疑似パラメータ
AWS::AccountId # AWSアカウントID(例: 123456789012)
AWS::Region # 現在のリージョン(例: ap-northeast-1)
AWS::StackName # スタック名
AWS::StackId # スタックの一意のID
AWS::Partition # パーティション(aws, aws-cn, aws-us-gov等)
AWS::URLSuffix # URLサフィックス(amazonaws.com, amazonaws.com.cn等)