俺のアウトプット

調べたこと、試したことを書きます

CloudFormationテンプレートの組み込み関数

組み込み関数を上手に利用すると、より動的なテンプレートを作成出来ます。
例えば、

  • 実行するまでわからない値を取得する。
  • 値を加工する。
  • 値を条件分岐によりプロパティにセットする。

のようなことが出来ます。

組み込み関数

組み込み関数の一覧です。

組み込み関数 分類 説明 入力例 出力例
Ref 参照 値を参照 MySubnet subnet-eb4950c3
Fn::GetAtt 参照 リソースの属性値を参照 MySubnet.AvailabilityZone us-east-1a
Fn::ImportValue 参照 別スタックによってエクスポートされた出力の値を参照
Fn::FindInMap 選択 Mappingsセクションで定義された値を取得 [RegionMap, !Ref AWS::Region, 64] ami-7a11e213
Fn::GetAZs 選択 特定リージョンのAZを取得 us-east-1 [us-east-1a, us-east-1b, us-east-1c, us-east-1d]
Fn::Select 選択 リストから取得 [3, [東京都, 神奈川県, 千葉県, 埼玉県] 埼玉県
条件関数 条件分岐 リソース作成や出力に条件を追加
Fn::Sub 加工 テンプレート文字列 ${AWS::StackName}-${Environment} test-development
Fn::Base64 加工 文字列のBase64化 test dGVzdA==
Fn::Join 加工 文字列の連結 ["-", [2018, 07, 24]] 2018-07-24
Fn::Split 加工, リスト化 文字列の分割 ["-", 2018-07-24] [2018, 07, 24]
Fn::Cidr リスト化 Cidrアドレスブロック [10.0.0.0/16, 4, 8] [10.0.0.0/24, 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24]

条件関数はこちらのエントリを参照してください。

Fn::ImportValueはこちらのエントリを参照を参照してください。

サンプル1

VPCとサブネットを作成するサンプルです。

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  Environment:
    Type: String
    Default: Production
    AllowedValues:
      - Development
      - Testing
      - Staging
      - Production
    Description: enter the environment name.
Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
      -
        Key: Name
        Value: !Sub ${AWS::StackName}-${Environment}
  MySubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: 10.0.1.0/24
      Tags:
      -
        Key: Name
        Value: !Sub ${AWS::StackName}-${Environment}
Outputs:
  Output1:
    Value: !GetAtt MySubnet.AvailabilityZone
    Description: AvailabilityZone

Ref

!Ref logicalName

よく使う組み込み関数です。
指定したパラメーターまたはリソースの値を参照します。

Fn::Sub

!Sub String

パラメータが埋め込まれたテンプレート文字列から文字列を作成します。 パラメータは ${Environment} の形式で埋め込みます。
この組み込み関数もよく使われます。 DescriptionやTagのName値、Outputの出力、EC2のユーザーデータなど、動的な文字列を設定するプロパティで活躍します。

Fn::GetAtt

!GetAtt logicalNameOfResource.attributeName

リソースから属性の値を参照します。
取得出来る属性は 組み込み関数リファレンス-Fn::GetAtt の属性を参照してください。

サンプル2

VPCとサブネットを2つ作成するサンプルです。

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  CidrBlock:
    Type: String
    Default: 10.0.0.0/16
  Count:
    Type: String
    Default: 4
  MaskSize:
    Type: String
    Default: 8
Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref CidrBlock
  MySubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: !Select [0, !Cidr [!Ref CidrBlock, !Ref Count, !Ref MaskSize]]
  MySubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: !Select [1, !Cidr [!Ref CidrBlock, !Ref Count, !Ref MaskSize]]
Outputs:
  Output1:
    Value: !Ref MySubnet1
    Description: MySubnet1
  Output2:
    Value: !Ref MySubnet2
    Description: MySubnet2

Fn::Cidr

!Cidr [ ipBlock, count, sizeMask ]

Cidrアドレスブロックをリストで返します。リストの数は count の数だけ作成されます。
例えば !Cidr [10.0.0.0/16, 4, 8] の場合、指定したCidrブロック 10.0.0.0/16 とマスクサイズ 8 から

  • 10.0.0.0/24
  • 10.0.0.1/24
  • 10.0.0.2/24
  • 10.0.0.3/24

のリストを返します。
主にサブネットのCidrブロックを設定する時に利用します。

Fn::Select

!Select [ index, listOfObjects ]

Cidr関数をリスト化すると

  • !Select [0, 10.0.0.0/24, 10.0.0.1/24, 10.0.0.2/24, 10.0.0.3/24] -> 10.0.0.0/24
  • !Select [1, 10.0.0.0/24, 10.0.0.1/24, 10.0.0.2/24, 10.0.0.3/24] -> 10.0.0.1/24

になり、それぞれ0番目と1番目の値が選択されます。

サンプル3

VPCを作成するサンプルです。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
Outputs:
  Output1:
    Value: !Join [", ", !GetAZs ap-northeast-1]
    Description: GetAZs, Join
  Output2:
    Value: !Select [1, !Split ["-", !Ref "AWS::Region"]]

Fn::GetAZs

!GetAZs region

指定したリージョンのAZリストを取得します。
リージョンを省略した場合は、疑似パラメータ AWS::Region が指定されます。

Fn::Join

!Join [ delimiter, [ comma-delimited list of values ] ]

リストの値をデリミタ(区切り文字)で連結して1つの文字列にします。

Fn::Split

!Split [ delimiter, source string ]

Joinの逆です。
指定した文字列をデリミタ(区切り文字)で分割してリスト化します。

f:id:kitsugi:20180724075254p:plain

サンプル4

EC2インスタンスを作成します。
東京リージョンの場合、 CloudFormation-gettingstarted_5.3.3_1.0_8e08a38f-32bit-20110227-0559 が選択されます。

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  MyName:
    Type: String
  MyValue:
    Type: String
Mappings:
  RegionMap: 
    us-east-1:
      "32": "ami-6411e20d"
      "64": "ami-7a11e213"
    us-west-1:
      "32": "ami-c9c7978c"
      "64": "ami-cfc7978a"
    eu-west-1:
      "32": "ami-37c2f643"
      "64": "ami-31c2f645"
    ap-southeast-1:
      "32": "ami-66f28c34"
      "64": "ami-60f28c32"
    ap-northeast-1:
      "32": "ami-9c03a89d"
      "64": "ami-a003a8a1"
Resources:
  MyEC2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", "32"]
      InstanceType: m1.small
      UserData:
        Fn::Base64: !Sub |
          Ref: MyValue
          Ref: MyName
          Hello World
Outputs:
  Output1:
    Value: !Ref MyEC2
    Description: MyEC2

Fn::FindInMap

!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]

Mappingsセクションで指定したマッピング情報から値を返します。最上位のキーと2番目のキーを省略することはできません。

Fn::Base64

!Base64 valueToEncode

文字列をBase64にエンコードします。
この関数は通常、EC2インスタンスのユーザーデータやメタデータに値を埋め込む時に利用します。

参考