YAML

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等)