AWSサービスがなかなか理解できないなぁ..
そのお悩みを解決します!
AWSを学び始めた皆さん。
学習は順調に進んでいますか?
AWSはたくさんサービスがあって、1つ1つのサービスを学ぶのに苦労しますよね。
そこで本記事では「CloudFormationの組み込み関数」について、初心者にわかりやすいよう図解付きで解説していきます。
結論として、組み込み関数にはこのような種類があります。
今はまだ分からなくても全然大丈夫です!
本記事では後半No.8〜13の組み込み関数について、1つずつ丁寧に解説していきます。
前半No.1〜7の組み込み関数についてはこちらの記事で解説しています。
本記事を読んだ後に「CloudFormationの組み込み関数はこういう時に使うんだなぁ」って理解できるようになれば嬉しいです。
またなんとなく分かっているつもりの方も「理解できていなかった」と思うポイントが隠されているかもしれません..!
AWSを学んでいる方の参考になれば嬉しいです!それではどうぞ!
CloudFormation組み込み関数とは
CloudFormationの組み込み関数は、パラメータの参照や値の加工等に利用する関数です。
公式のドキュメントはこちらになります。
AWS CloudFormation ユーザガイド 組み込み関数
この関数を使用することで、動的なテンプレートを作成することが出来ます。
ちなみにFn::を!で書くことを短縮形と呼びます。
早速1つ1つの関数について、解説しますね。
⑧Fn::Cidr:CIDRアドレスブロックを取得する
サブネットに指定するネットワークアドレスを自動で取得したいなぁ..
この時はFn::Cidr関数を使用しましょう。
Fn::Cidr関数はCIDRアドレスブロックを取得する関数です。
VPCとサブネットを2つ作成するテンプレートを例に使用方法をみてみましょう。
サブネットに指定するネットワークアドレス(CidrBlock)を指定したいようですね。
実際にはこのようにネットワークアドレスを記述する必要があります。
CidrBlock: 10.0.0.1/24
しかし、このようにハードコーディングすると、汎用的にテンプレートを使用できなくなりますね。
そのため、Fn::Cidr関数を使用し、このように記述しています。
CidrBlock: !Select [0, !Cidr [!Ref CidrBlock, !Ref Count, !Ref MaskSize]]
このように記述すると、VPCで指定したネットワークアドレスを元にサブネットで指定できるCidrアドレスブロックのリストを作成してくれます。 (!Select関数については次に解説しています。)
Fn::Cidr関数で使用するパラメータは以下の3つです。
- 配列に格納する元データを指定
下記の3で指定されるサブネットマスクで分割可能なアドレス範囲を指定します。 - 全部で何個の配列データを作成するか指定
- CIDRアドレスブロックのビット数を指定
サブネットビットはサブネットマスクの逆になります。/24を指定したい場合は、8ビットの8を指定し、/27を指定したい場合は、5ビットの5を指定します。
Fn::Cidr関数はそこまで使用頻度は高くないですが、便利な関数なので、覚えておきましょう。
関数がそのままの意味なので覚えやすいですね。
⑨Fn::Select:リストから値を取得する
リストから値を1つだけ取得したいなぁ..
この時はFn::Select関数を使用しましょう。
Fn::Select関数はリストから値を取得する関数です。
先ほどと同じVPCとサブネットを2つ作成するテンプレートを例に使用方法をみてみましょう。
先ほどのFn::Cidr関数で取得したCidrアドレスブロックの配列から値を1つ取得したいようですね。
そのため、Fn::Select関数を使用し、このように記述しています。
CidrBlock: !Select [0, !Cidr [!Ref CidrBlock, !Ref Count, !Ref MaskSize]
このように記述することで、配列の中から1番目の値を取得することが出来ます。
配列は0から始まるため、1番目の値を取得したい時は0を指定しましょう。
Fn::Select関数も組み込み関数の中でもよく使われる関数です。
Select(選択)、そのままで覚えやすいですね。
⑩Fn::GetAZs:特定リージョンのAZを取得する
特定のリージョンで使用できるAZのリストを取得したいなぁ..
この時はFn::GetAZs関数を使用しましょう。
Fn::GetAZs関数は特定リージョンのAZを取得する関数です。
VPCを作成するテンプレートを例に使用方法をみてみましょう。
東京リージョン(ap-notheast-1)で使用できるAZのリストを取得したいようですね。
そのため、Fn::GetAZs関数を使用し、このように記述します。
Value: !Join [", ", !GetAZs ap-northeast-1]
このように記述することで、ap-northeast-1で使用できるAZのリストを取得することが出来ます。(!Joinについては次に解説します。)
[ap-northeast-1a,ap-northeast-1b,ap-northeast-1c,ap-northeast-1d]
あれ?僕のアカウントではap-northeast-1aとap-northeast-1cしか取得できなかった..
GetAZs関数は特定のリージョンで使用できる全てのAZを取得できる訳ではありません!
デフォルトのサブネットがある場合は、そのサブネットのAZしか取得できないようです。
こちらのブログの解説がわかりやすかったので、参考にして下さい。
CloudFormation Fn::GetAZs を使ったテンプレートが人によって失敗したりしなかったりする件
使用方法に注意する必要がありますが、この関数もハードコーディングが不要になるため便利な関数です。
Get(取得する)AZs(複数のAZ)、そのままで覚えやすいですね。
⑪Fn::Join:文字列を結合する
リストに入っている値を1つの文字列にしたいなぁ..
この時はFn:: Join関数を使用しましょう。
Fn::Join関数は文字列を結合する関数です。
先ほどと同じVPCを作成するテンプレートを例に使用方法をみてみましょう。
先ほどのFn::GetAZs関数で取得したAZのリストを1つの文字列として取得したいようですね。
そのため、Fn::Join関数を使用し、このように記述します。
Value: !Join [", ", !GetAZs ap-northeast-1]
このように記述することで、指定した区切り文字 ”, ”で連結して1つの文字列にすることができます。
ap-northeast-1a,ap-northeast-1b,ap-northeast-1c,ap-northeast-1d
また、他のパラメータと連結して文字列を作成する場合にもFn::Join関数は便利です。
例えば、このように記述すると、特定のS3バケットのパスを指定することができます。
Resource:
- Fn::Join:
- ""
- - "arn:aws:s3:::"
- !Ref ImageBucketName
- "/*"
Fn::Join関数は文字列を加工する時に便利な関数です。
Join(結合する)、そのままで覚えやすいですね。
⑫Fn::Split:文字列を分割してリスト化する
文字列を分割させたいなぁ..
この時はFn::Split関数を使用しましょう。
Fn::Split関数は文字列を分割してリスト化する関数です。
この関数は先ほどのJoinと逆のことをします。
先ほどと同じVPCを作成するテンプレートを例に使用方法をみてみましょう。
一部の文字列”northeast”だけを出力したいようですね。
そのため、Fn::Split関数を使用し、このように記述します。
Value: !Select [1, !Split ["-", !Ref "AWS::Region"]]
!Ref “AWS::Region”が”ap-northeast-1″だとしましょう。
この文字列を指定した区切り文字 「”-”」で分割することができます。
["ap","northeast","1"]
そして、Fn::Split関数で1を指定しているため、2番目の”northeast”を取得することができます。
Fn::Split関数も文字列を加工する時に便利な関数です。
Split(分割する)、そのままで覚えやすいですね。
⑬条件関数
環境によってEC2のインスタンスタイプを変更したいなぁ..
この時は条件関数を使用しましょう。
条件関数はリソース作成や出力に条件を追加する関数です。
この関数により条件分岐に沿ってAWSリソースを柔軟に作成することができます。
2022/6/18時点でこちらの5種類があります。
- Fn::If:値を評価する
- Fn::Equals:2つの値が等しいかどうかを比較する
- Fn::Not:真偽を反転する
- Fn::And:全ての条件が真かどうかを判定する
- Fn::Or:いずれかの条件が真かどうかを判定する
今回はピックアップして、Fn::IfとFn:::Equalsの使い方をご紹介します。
他の関数の使い方は公式ドキュメントを参考にしてみて下さいね。
AWS CloudFormation ユーザガイド 条件関数
EC2インスタンスを作成するテンプレートを例に使用方法をみてみましょう。
環境によってEC2のインスタンスタイプを変更したいようですね。
ここでは本番環境はt2.micro、それ以外の環境はt2.nanoで設定するとしましょう
このためには2段階の設定が必要です。
- Conditionsセクションで条件を定義する
- Resourcesセクションで1の条件を使用し、値を評価する
1.ConditionsセクションでFn::Equals関数を使用し、条件を定義します。
Conditions:
IsProduction: !Equals [!Ref Env, "production"]
!Ref EnvはParametersセクションで指定した値となります。
そのため、Parametersセクションで指定した値と”production”の値を比較し、同じ場合はtrue、異なる場合はfalseを返します。
2. 1の条件を使用し、Fn::If関数を使用し、値を評価します。
Resources:
MyEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: !If [IsProduction, "t2.micro", "t2.nano"]
IsProductionがtrueつまり本番環境の時は”t2.micro”、それ以外の環境の時は”t2.nano”を返します。
条件関数はAWSリソースを柔軟に制御できる便利な関数です。
ただし使いすぎると、見づらいテンプレートになるため気をつけましょう。
まとめ
今回はAWSサービスの中からCloudFormationの組み込み関数を7つご紹介しました。
前半No.1〜7の組み込み関数をまだ確認していない方はこちらの記事も読んでみて下さいね。
AWS環境を動的に作成するためにも、組み込み関数はマスターしておきたいですね。
最初は難しく感じますが、実際にテンプレートを書くことで徐々に慣れていきます!
こちらの記事でAWS初学者におすすめのハンズオン講座をご紹介しています。
この講座でも一部の組み込み関数について解説されているので、良ければ参考にしてみて下さい。
それでは、これからも一緒に学んで、自己価値を高めていきましょう〜!
最後まで、お読み頂きありがとうございました!
参考文献
こちらの記事を作成するにあたり、こちらのブログ記事や本を参考にさせて頂きました!
①AWSエンジニア入門講座――学習ロードマップで体系的に学ぶ
②AWS認定資格 クラウドプラクティショナーの教科書: 合格へ導く虎の巻 CloudTech制作委員会シリーズ
どれもAWS初学者にとって、とても分かりやすい内容になっていますよ!
良ければ参考にしてみて下さい!
コメント