この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、イムチェジョンです。
最近、Cloudformationの作成をしています。
作成するときに関数を使ったらもっと簡単に作成できたので、作成しながら役に立った関数についてまとめたいと思います。
関数が多いので、今回のブログは2つに分けて作成します。
今回にまとめる関数は下のアジェンダで確認できます。
Cloudformationのテンプレートに使える関数をまとめてみました (1)
アジェンダ
- Fn::ImportValue
- Fn::Join
- Fn::Select
- Fn::Split
- Fn::Sub
- Fn::Transform
- Ref
1. Fn::ImportValue
関数の定義
- 組み込み関数
Fn::ImportValue
は他のスタックで出した出力(OUTPUT )の値を返す - 各AWSアカウントの
Export
名は1つのリージョン内で固有 -
パラメータ
- sharedValueToImport
- インポートスするスタックの出力値
- 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
- 結合しようとする値のリスト
- delimiter
- 戻り値
- 結合された文字列
使い方
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
- 分割する文字列の値
- delimiter
- 戻り値
- 文字列値のリスト
使い方
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は実行時間の時に接続された変数名をこの値に切り替える
- String
- 戻り値
- すべての変数をこの値に変えて原本文字列を返えす
使い方
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
- マクロに伝達するキー値ペアで指定されたリストパラメータ
- name
- 戻り値
- 処理されたスタックテンプレートに含まれる処理されたテンプレートコードのピース
使い方
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
- 逆参照したいリソースまたはパラメータの論理名
- 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
#〜省略〜