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の逆です。
指定した文字列をデリミタ(区切り文字)で分割してリスト化します。
サンプル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インスタンスのユーザーデータやメタデータに値を埋め込む時に利用します。
参考
- AWSドキュメント