Slide 1

Slide 1 text

【初心者向け】 AWS CloudFormationの組み込み関数を使って 柔軟なCFnテンプレートを作成しよう 2022/7/28 AWS事業本部 たぬき

Slide 2

Slide 2 text

自己紹介 たぬき 所属 ❏ AWS事業本部 コンサルティング部 ❏ 東京オフィス 最近勉強したAWSサービス ❏ Amazon Rekognition Twitter ❏ たぬき (@tanuki_tzp) DevelopersIO Blog

Slide 3

Slide 3 text

CloudFormation使ってますか?

Slide 4

Slide 4 text

本セッションでお話すること ● CloudFormationで使う組み込み関数について

Slide 5

Slide 5 text

● AWS CloudFormationの詳しい解説 ● テンプレートの基本的な書き方について 本セッションでお話しないこと

Slide 6

Slide 6 text

CloudFormationについて

Slide 7

Slide 7 text

● AWSのインフラストラクチャをコードで管理するための サービス ● リソースの作成、変更、削除を自動化 CloudFormationとは

Slide 8

Slide 8 text

CloudFormationがリソースを作るための発注書 CFn のテンプレートとは

Slide 9

Slide 9 text

CFn のテンプレートとは

Slide 10

Slide 10 text

組み込み関数について

Slide 11

Slide 11 text

組み込み関数とは ● CloudFormationにはビルドインの組み込み関数が用意 されている ● 組み込み関数を使用してテンプレート内でデータの変換 や操作を行うことができる

Slide 12

Slide 12 text

AWS公式ドキュメント 組み込み関数リファレンス - AWS CloudFormation https://docs.aws.amazon.com/ja_jp/AWSCloudFormatio n/latest/UserGuide/intrinsic-function-reference.html 組み込み関数の種類

Slide 13

Slide 13 text

組み込み関数の種類 (2023/7/1 時点)

Slide 14

Slide 14 text

多い

Slide 15

Slide 15 text

今回の対象関数 (2023/7/1 時点)

Slide 16

Slide 16 text

今回のやってみる シンプルなCFnテンプレートに 関数を使用してみよう

Slide 17

Slide 17 text

ベースの構成図

Slide 18

Slide 18 text

テンプレートはyaml形式となります ※ブログにテンプレートを掲載しております ベースのCFnテンプレート AWSTemplateFormatVersion: "2010-09-09" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.0.0/24

Slide 19

Slide 19 text

ベースのCFnテンプレート AWSTemplateFormatVersion: "2010-09-09" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.0.0/24

Slide 20

Slide 20 text

Ref

Slide 21

Slide 21 text

● 指定された論理名に対応するリソースやパラメーターの 値を返す 例:VpcId: !Ref VPC → “VPC”というVPCのVPCID 組み込み関数 - Ref AWSTemplateFormatVersion: "2010-09-09" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.0.0/24 AWSTemplateFormatVersion: "2010-09-09" Resources: SampleVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref SampleVPC CidrBlock: 10.0.0.0/24

Slide 22

Slide 22 text

戻り値については公式のリファレンスのReturn valuesを参 照 AWS リソースおよびプロパティタイプのリファレンス https://docs.aws.amazon.com/ja_jp/AWSCloudFormatio n/latest/UserGuide/aws-template-resource-type-ref.html 組み込み関数 - Ref

Slide 23

Slide 23 text

組み込み関数 - Ref 例:VPCのReturn values Amazon EC2 resource type reference - AWS CloudFormation https://docs.aws.amazon.com/ja_jp/AWSCloudFormatio n/latest/UserGuide/AWS_EC2.html

Slide 24

Slide 24 text

Select

Slide 25

Slide 25 text

組み込み関数 - Select ● 要素のリストを条件に応じて選択する

Slide 26

Slide 26 text

組み込み関数 - Select 例:リストからパラメータで指定して、EC2インスタンスを起動 するアベイラビリティゾーンを選択 Parameters: AvailabilityZones: Type: List Default: - ap-northeast-1a - ap-northeast-1c - ap-northeast-1d Resources: EC2Instance: Type: AWS::EC2::Instance Properties: AvailabilityZone: !Select [0, !Ref AvailabilityZones]

Slide 27

Slide 27 text

組み込み関数 - Select リストにない要素は選択できない Nullに対応できない

Slide 28

Slide 28 text

Cidr

Slide 29

Slide 29 text

組み込み関数 - Cidr テンプレートを使い回すために可変であってほしい箇所 AWSTemplateFormatVersion: "2010-09-09" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.0.0/24

Slide 30

Slide 30 text

組み込み関数 - Cidr ● 指定されたCIDRブロック範囲内のIPアドレスを生成

Slide 31

Slide 31 text

組み込み関数 - Cidr CidrとSelectを組み合わせてテンプレートに組み込み AWSTemplateFormatVersion: "2010-09-09" Parameters: VpcCidrBlock: Type: String Default: "10.0.0.0/16" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: !Select [0, !Cidr !Ref VpcCidrBlock, 1, 8]

Slide 32

Slide 32 text

組み込み関数 - Cidr !Cidr !Ref VpcCidrBlock, 1, 8 VpcCidrBlock = 分割前のCidrブロック (10.0.0.0/16) 1 = 生成するサブネットのCidrブロックの数 8 = 生成するサブネットビット数 !Cidr !Ref VpcCidrBlock, 1, 8 = 10.0.0.0/24

Slide 33

Slide 33 text

組み込み関数 - Cidr サブネットビット数について

Slide 34

Slide 34 text

組み込み関数 - Cidr !Select [0, !Cidr !Ref VpcCidrBlock, 1, 8] 0 = 1番目の要素 !Cidr !Ref VpcCidrBlock, 1, 8 = 10.0.0.0/24 !Select [0, !Cidr !Ref VpcCidrBlock, 1, 8] = 10.0.0.0/24

Slide 35

Slide 35 text

組み込み関数 - Cidr !Cidr !Ref VpcCidrBlock, 2, 8 VpcCidrBlock = 分割前のCidrブロック (10.0.0.0/16) 2 = 生成するサブネットのCidrブロックの数 8 = 生成するサブネットビット数 !Cidr !Ref VpcCidrBlock, 2, 8 = 10.0.0.0/24, 10.0.1.0/24

Slide 36

Slide 36 text

組み込み関数 - Cidr !Select [1, !Cidr !Ref VpcCidrBlock, 2, 8] 1 = 2番目の要素 !Cidr !Ref VpcCidrBlock, 2, 8 = 10.0.0.0/24, 10.0.1.0/24 !Select [1, !Cidr !Ref VpcCidrBlock, 2, 8] = 10.0.1.0/24

Slide 37

Slide 37 text

Join

Slide 38

Slide 38 text

組み込み関数 - Join ● 文字列やリストの要素を指定した区切り文字で結合する

Slide 39

Slide 39 text

組み込み関数 - Join !Join [区切り文字, [要素1, 要素2, ...]] !Join [“-”, [“xxx”, “yyy”, “zzz”]] → xxx-yyy-zzz

Slide 40

Slide 40 text

組み込み関数 - Join AWSTemplateFormatVersion: "2010-09-09" Parameters: VpcCidrBlock: Type: String Default: "10.0.0.0/16" Environment: Type: String Default: "prod" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock Tags: - Key: Name Value: !Join [ "-", [ !Ref Environment, "sample", "VPC"]] Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: !Select [0, !Cidr !Ref VpcCidrBlock, 1, 8] Tags: - Key: Name Value: !Join [ "-", [ !Ref Environment, "sample", "subnet"]]

Slide 41

Slide 41 text

Sub

Slide 42

Slide 42 text

組み込み関数 - Sub ● 変数に値を置き換える ● プレースホルダー(${ })を使用できる

Slide 43

Slide 43 text

組み込み関数 - Sub AWSTemplateFormatVersion: "2010-09-09" Parameters: VpcCidrBlock: Type: String Default: "10.0.0.0/16" Environment: Type: String Default: "prd" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock Tags: - Key: Name Value: !Sub ”${Environment}-sample-VPC" Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: !Select [0, !Cidr !Ref VpcCidrBlock, 1, 8] Tags: - Key: Name Value: !Sub ”${Environment}-sample-subnet"

Slide 44

Slide 44 text

組み込み関数 - Sub プレースホルダー(${ })はRef関数やGetAtt関数として使用 できる Tags: - Key: Name Value: !Sub ”${Environment}-sample-VPC"

Slide 45

Slide 45 text

組み込み関数 - JoinとSub JoinとSubって使いどころが似てるな……

Slide 46

Slide 46 text

組み込み関数 - JoinとSub CloudFormation の組み込み 関数 Fn::Sub 対 Fn::Join | DevelopersIO https://dev.classmethod.jp/a rticles/cloudformation-fnsub -vs-fnjoin/

Slide 47

Slide 47 text

組み込み関数 - JoinとSub ● 実際使いどころはほぼ同じ ● Serverless frameworkを使用するときはSub関数に注意

Slide 48

Slide 48 text

まとめ

Slide 49

Slide 49 text

テンプレートの比較 AWSTemplateFormatVersion: "2010-09-09" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.0.0/24 AWSTemplateFormatVersion: "2010-09-09" Parameters: VpcCidrBlock: Type: String Default: "10.0.0.0/16" Environment: Type: String Default: "prod" Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock Tags: - Key: Name Value: !Join [ "-", [ !Ref Environment, "sample", "VPC"]] Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: !Select [0, !Cidr !Ref VpcCidrBlock, 1, 8] Tags: - Key: Name Value: !Join [ "-", [ !Ref Environment, "sample", "subnet"]]

Slide 50

Slide 50 text

まとめ 関数を使って 使い回しができるテンプレートを作成しましょう!

Slide 51

Slide 51 text

No content