Cloudformationのテンプレートに使える関数をまとめてみました ( 2 )

2021.12.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、イムチェジョンです。
最近、Cloudformationの作成をしています。
作成するときに関数を使ったらもっと簡単に作成できたので、作成しながら役に立った関数についてまとめたいと思います。
関数が多いので、今回のブログは2つに分けて作成します。
今回にまとめる関数は下のアジェンダで確認できます。

Cloudformationのテンプレートに使える関数をまとめてみました (1)

アジェンダ

  1. Fn::ImportValue
  2. Fn::Join
  3. Fn::Select
  4. Fn::Split
  5. Fn::Sub
  6. Fn::Transform
  7. Ref

1. Fn::ImportValue

関数の定義

  • 組み込み関数 Fn::ImportValueは他のスタックで出した出力(OUTPUT )の値を返す
  • 各AWSアカウントの Export 名は1つのリージョン内で固有

  • パラメータ

    • sharedValueToImport
      • インポートスするスタックの出力値
  • 戻り値
    • スタックの出力値

使い方

Fn::ImportValue: sharedValueToImport
!ImportValue sharedValueToImport

テンプレート(A)のoutputで定義したリソースをテンプレート(B)で使うこと

テンプレート(A)

#〜省略〜
Outputs:
	SubnetId:
	Value: !Ref SubnetId
	Description: ID of Subnet
	Export:
		Name: SubnetId
	
	SecurityGroupIds:
	Value: !Ref SecurityGroupIds
	Description: ID of Security Group
	Export:
		Name: SecurityGroupIds

テンプレート(B)

#〜省略〜
EC2instance:
	Type: AWS::EC2::Instance
	Properties:
		ImageId: !Ref ImageId
		InstanceType: !Ref InstanceType
		SubnetId: !ImportValue SubnetId
		DisableApiTermination: true
		BlockDeviceMappings:
			- DeviceName: "/dev/xvda"
			Ebs:
				VolumeType: gp2
				VolumeSize: 30
				DeleteOnTermination: true
		SecurityGroupIds:
			- Fn::ImportValue: SecurityGroupIds
		KeyName: !Ref KeyName
#〜省略〜

2. Fn::Join

関数の定義

  • 組み込み関数 Fn::Joinは、指定された区切り文字で区分された一連の値を単一値に追加する
  • 区切り文字が空文字列であれば一連の値は区切り文字なしで接続される

  • パラメータ

    • delimiter
      • 彫刻二つの間で発生する値
      • 区切り文字はピース間でのみ発生し、最終値は終了しない
    • ListOfValues
      • 結合しようとする値のリスト
  • 戻り値
    • 結合された文字列

使い方

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

複数のCIDRが出力 CIDR:CIDR:CIDR:CIDR....の結果がoutputの値に出力

#〜省略〜
Resources:  
	VPC:  
		Type: AWS::EC2::VPC  
		Properties:  
			CidrBlock:  192.168.0.0/16
			nableDnsSupport:  true  
			EnableDnsHostnames:  true  

Outputs:  
	Subnets:  
		Description:  Output Fn::Cidr
		Value:  !Join  [  ":",  !Cidr  [  192.168.0.0/16,  10,  8  ]  ]

3. Fn::Select

関数の定義

組み込み関数 Fn::Selectは、インデックス別オブジェクトリストからオブジェクト1つを返却

  • パラメータ
    • インデックス
      • 持ってくるオブジェクトのインデックス
      • 値=0〜N-1
      • N=Arrayに含まれている要素の数
    • listOfObjects
      • 選択するオブジェクトのリスト
      • このリストはnullではなく、null項目を含めることもできない
  • 戻り値
    • 選択されたオブジェクト

使い方

Fn::Select: [ index, listOfObjects ] 
!Select [ index, listOfObjects ]

AvailabilityZoneのリストの中で0番目の項目を指定 CIDRのリストの中で0番目の項目を指定

#〜省略〜
# -----
# Public Subnet
# -----
publicSubnet:
	Type: AWS::EC2::Subnet
	Properties:
		AvailabilityZone: !Select [ 0, !GetAZs  '' ]
		CidrBlock: !Select [0, !Cidr [!GetAtt  vpc.CidrBlock, 2, 8]]
		VpcId: 10.0.0.0/16
		Tags:
			- Key: Name
			  Value: public-subnet
#〜省略〜

4. Fn::Split

関数の定義

  • 組み込み関数 Fn::Splitは結果として得た文字列リストから要素を選択できるように文字列を文字列の値リストに分割する
  • コンマ(,)のような区切り文字を用いて分割位置を指定

  • パラメータ

    • delimiter
      • 原本の文字列を分割する位置を決定する文字列の値
    • source string
      • 分割する文字列の値
  • 戻り値
    • 文字列値のリスト

使い方

Fn::Split: [ delimiter, source string ]
!Split [ delimiter, source string ]

リージョン名を-を基準に分けてoutputの値として設定

#〜省略〜
Resources:
	MyVPC:
		Type: AWS::EC2::VPC
		Properties:
			CidrBlock: 10.0.0.0/16
			
Outputs:
	RegionPart:
		Value: !Select [1, !Split ["-", !Ref  "AWS::Region"]]
#〜省略〜

5. Fn::Sub

関数の定義

組み込み関数 Fn::Subは入力文字列の変数を指定した値に切り替える

  • パラメータ
    • String
      • 変数が含まれた文字列
    • VarName
      • String パラメータに含む変数の名前
    • VarValue
      • AWS CloudFormationは実行時間の時に接続された変数名をこの値に切り替える
  • 戻り値
    • すべての変数をこの値に変えて原本文字列を返えす

使い方

Fn::Sub:
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value

!Sub
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value

Fn::Sub: String
!Sub String

Properties:  
	Name:  !Sub  
		-  www.${Env}.${DnsDomain}  
		-  Env:  {'Fn::ImportValue':  !Sub  '${text}-env'}  
		  DnsDomain:  {'Fn::ImportValue':  !Sub  '${text}-domain'}

または

#〜省略〜
Parameters:
	Env:
		Default: "dev"
		Type: String
		Description: "Environment name"
	SystemName:
		Default: "SystemName"
		Type: String
		Description: "System name"

Resources:
  EC2instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-00000000
      InstanceType: "t2.micro"
    #〜省略〜
	Tags:
		- Key: Name
		  Value: !Sub ${SystemName}-${Env}
#〜省略〜

6. Fn::Transform

関数の定義

組み込み関数 Fn::Transform は、スタックテンプレートの一部分であるユーザー指定処理を行うマクロを指定 マクロを通して検索·変更作業などの簡単な作業からテンプレート全体の変形と同じ作業まで、テンプレートに対するユーザー指定処理を実行

  • パラメータ
    • name
      • 処理を実行しようとするマクロの名前
    • parameter
      • マクロに伝達するキー値ペアで指定されたリストパラメータ
  • 戻り値
    • 処理されたスタックテンプレートに含まれる処理されたテンプレートコードのピース

使い方

Fn::Transform:
  Name : macro name
  Parameters :
          Key : value

Transform:
  Name: macro name
  Parameters:
    Key: value

AWS::Include変形を呼び出し、テンプレートコードのピースを検索する位置がInputValueパラメータに伝わるよう指定

#〜省略〜
Fn::Transform:
	Name: AWS::Include
	Parameters:
		Location: {Location:  {Ref:  InputValue}}
#〜省略〜

7. Ref

関数の定義

組み込み関数 Refは、指定されたパラメータまたはリソースに関する情報を返却

  • パラメータ
    • logicalName
      • 逆参照したいリソースまたはパラメータの論理名
  • 戻り値
    • リソースの物理的IDまたはパラメータの値

使い方

Ref: logicalName
!Ref logicalName

#〜省略〜
Parameters:
	KeyPair:
	    Type: AWS::EC2::KeyPair::KeyName
	    Description: KeyPair Name

Resources:
  EC2instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-00000000
      InstanceType: "t2.micro"
      #〜省略〜
      BlockDeviceMappings:
        - DeviceName: '/dev/xvda'
          Ebs:
            VolumeType: 'gp2'
            VolumeSize: 10
      KeyName: !Ref KeyPair
#〜省略〜