この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、クラスメソッド イムです。
私は最初にCloudFormationテンプレートを作成する時にコードとかセッションがよく理解できず、迷っていたりしました。
なので、今回のブログではCloudFormationテンプレートを始て作成する方も理解しやすいようにCloudFormationテンプレートのセッションについてまとめたいと思います。
ブログは全部で2つに分かれています。
このブログで紹介されてないCloudFormationテンプレートのセッションについては下記のブログを参考ください。
アジェンダ
- Rules
- Mappings
- Conditions
- Transform
- まとめ
1. Rules
スタックを作成したりアップデートする際に、テンプレートに送信されたパラメータまたはパラメータの組み合わせを検証します。
ルールセクションは、リソースを作成、アップデートする前にパラメータ値を検証します。
ルールセッションでは、下記の関数を使用します。
Fn::And
Fn::Contains
Fn::EachMemberEquals
Fn::EachMemberIn
Fn::Equals
Fn::If
Fn::Not
Fn::Or
Fn::RefAll
Fn::ValueOf
Fn::ValueOfAll
rules-test.yaml
AWSTemplateFormatVersion: '2010-09-09'
Rules:
devInstanceType:
RuleCondition: !Equals
- !Ref Environment
- dev
Assertions:
- Assert:
'Fn::Contains':
- - t2.medium
- !Ref InstanceType
AssertDescription: 'instance type must be t2.medium'
prdInstanceType:
RuleCondition: !Equals
- !Ref Environment
- prd
Assertions:
- Assert:
'Fn::Contains':
- - t2.large
- !Ref InstanceType
AssertDescription: 'instance type must be t2.large'
...
上記の例は2つのインスタンスタイプで定義されたパラメータ値を検証します。
つまり、dev インスタンスは t2.medium
で、prd インスタンスは t2.large
であることを確認します。
2. Mappings
Mappings セッションでは、キーと名前付きの一連の値をセットで定義します。
例えば、リージョン名をキーとしてリージョンごとに必要な値を指定して使用します。
また、Mappings セッション定義した値を取得するためには Fn::FindInMap
関数を使用します。
mappings-test.yaml
AWSTemplateFormatVersion: "2010-09-09"
# ------------
# Mappings
# ------------
Mappings:
RegionMap:
us-east-1:
HVM64: ami-0fxxxxxxxxxxxxx54
us-east-2:
HVM64: ami-0bxxxxxxxxxxxxx34
ap-northeast-1:
HVM64: ami-06xxxxxxxxxxxxx32
ap-northeast-2:
HVM64: ami-08xxxxxxxxxxxxx51
# ------------
# Resources
# ------------
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]
...
上記の Mappings セッションではリージョン名
をキーとして、AMI
の値を定義しました。
そして、リソースで使用する時は、例の24行のように作成します。
上記コードの意味は以下となります。
1) Mappings セッションの中で RegionMap
というグループの中に
2) Cfn を実行するリージョン
と同じ値の
3) HVM64
に定義されている値を取得する。
3. Conditions
条件 (Conditions) セッションでは、条件関数を通じてリソース作成または構成された環境を定義する文が含まれます。
例えば、条件を作成して条件が true の場合、AWS CloudFormation でリソースまた作成は出力ができます。
また、条件をプロパティに関連付けて条件が true の場合、AWS CloudFormation でプロパティを特定の値に設定、falseの場合には AWS CloudFormation は他の値で設定されます。
条件 (Conditions)作成のためには下記の関数を使用します。
Fn::And
Fn::Equals
Fn::If
Fn::Not
Fn::Or
conditions-test.yaml
AWSTemplateFormatVersion: '2010-09-09'
# ------------
# Conditions
# ------------
Conditions:
isAccount: !Equals [!Ref "AWS::AccountId", 67xxxxxxxxxx]
# ------------
# Resources
# ------------
Resources:
vpc:
Type: AWS::ec2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: Name
Value: !Sub Conditions-vpc
Condtion: isAccount
上記の例はアカウントIDが Cfnを実行するアカウントIDと一致する時、リソースを作成します。
4. Transform
トランスフォーム(Transform) セッションは AWS CloudFormation がテンプレート処理のために使用するマクロを1つ以上指定します。
AWS CloudFormation では指定された順番によってマクロを実行します。
transform-test.yaml
AWSTemplateFormatVersion: '2010-09-09'
# Transform for Description
Fn::Transform:
Name: AWS::Include
Parameters:
Location: description.yaml
# ------------
# Resources
# ------------
Resources:
# Transform for Resources
Fn::Transform:
Name: AWS::Include
Parameters:
Location: bucket1.yaml
Bucket2:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub Backet2-${AWS::AccountId}
# Transform for tags
Fn::Transform:
Name: AWS::Include
Parameters:
Location: tags.yaml
次に、transform-test.yaml
ファイルの Transform
の Location
にファイル名を入力します。
description.yaml
Description: 'Test Transform'
bucket1.yaml
Backet1:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub Backet1-${AWS::AccountId}
AccessControl: Private
PublicAccessBlockConfiguration:
BlockPublicAcls: True
BlockPublicPolicy: True
IgnorePublicAcls: True
RestrictPublicBuckets: True
Tags:
- Key: Name
Value: Bucket1
tags.yaml
Tags:
- Key: Name
Value: Bucket2
すると、テンプレートをパッケージ化した時、下記のように変更されます。
package.yaml
AWSTemplateFormatVersion: '2010-09-09'
Fn::Transform:
Name: AWS::Include
Parameters:
Location: s3://<S3name>/5011e6xxxxxxxxxxxxxxxxxxxxxxxxx
Resources:
Fn::Transform:
Name: AWS::Include
Parameters:
Location: s3://<S3name>/4fbdc0xxxxxxxxxxxxxxxxxxxxxxxxx
Bucket2:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub Backet2-${AWS::AccountId}
Fn::Transform:
Name: AWS::Include
Parameters:
Location: s3://<S3name>/b7b7a3xxxxxxxxxxxxxxxxxxxxxxxxx
5. まとめ
今回のブログでは、CloudFormationテンプレートのセッションについてまとめてみました。