AWSサービスがなかなか理解できないなぁ..
そのお悩みを解決します!
AWSを学び始めた皆さん。
学習は順調に進んでいますか?
AWSはたくさんサービスがあって、1つ1つのサービスを学ぶのに苦労しますよね。
そこで本記事では「CloudFormationの組み込み関数」について、初心者にわかりやすいよう図解付きで解説していきます。
結論として、組み込み関数にはこのような種類があります。
今はまだ分からなくても全然大丈夫です!
本記事では前半No.1〜7の組み込み関数について、1つずつ丁寧に解説していきます。
後半No.8〜13の組み込み関数についてはこちらの記事で解説しています。
本記事を読んだ後に「CloudFormationの組み込み関数はこういう時に使うんだなぁ」って理解できるようになれば嬉しいです。
またなんとなく分かっているつもりの方も「理解できていなかった」と思うポイントが隠されているかもしれません..!
AWSを学んでいる方の参考になれば嬉しいです!それではどうぞ!
CloudFormation組み込み関数とは
CloudFormationの組み込み関数は、パラメータの参照や値の加工等に利用する関数です。
公式のドキュメントはこちらになります。
AWS CloudFormation ユーザガイド 組み込み関数
この関数を使用することで、動的なテンプレートを作成することが出来ます。
ちなみにFn::を!で書くことを短縮形と呼びます。
早速1つ1つの関数について、解説しますね。
①Ref:値を参照する
同じテンプレート内に定義されたAWSリソースを参照したいなぁ..
この時はRef関数を使用しましょう。
Ref関数は指定したパラメータまたはリソースの値を参照する関数です。
VPCとサブネットを作成するテンプレートを例に使用方法をみてみましょう。
同じテンプレート内に定義されたVPCの中にサブネットを作成したいようですね。
サブネットを作成するためには、VpcIdの指定が必要です。
実際にはこのように一意のVpcIdを記述する必要があります。
VpcId: vpc-a123456b
しかし、まだリソースが作成されていないため、VpcIdを指定することができません。
そのため、Ref関数を使用し、このように記述しています。
VpcId: !Ref MyVPC
このように記述することで、AWSリソース作成前のパラメータを参照することが出来ます。
Ref関数は組み込み関数の中でもよく使われる関数なので、覚えておきましょう。
RefはReference(参照)からきています。
②Fn::Sub:文字列の変数を指定した値に置き換える
テンプレートによって、動的な文字列を設定したいなぁ..
この時はFn::Sub関数を使用しましょう。
Fn::Sub関数は文字列の変数を指定したパラメータ値に置き換える関数です。
先ほどと同じVPCとサブネットを作成するテンプレートを例に使用方法をみてみましょう。
CloudFormationで作成したMyVPCにタグを設定したいようですね。
どの環境なのか分かるようにタグを設定するには、実際にこのように記述する必要があります。
Tags:
-
Key: Name
Value: Production
しかし、テンプレートに直接記述するとタグの値を動的に変えることができません。
そのため、Fn::Sub関数を使用し、このように記述しています。
Tags:
-
Key: Name
Value: !Sub ${Environment}
このように記述することで、タグの値を動的に変更することが出来ます。
Fn::Sub関数も組み込み関数の中でもよく使われる関数なので、覚えておきましょう。
SubはSubstitution(置換)からきています。
③Fn::GetAtt:AWSリソースの属性値を参照する
同じテンプレート内に定義されたAWSリソースの属性値を参照したいなぁ..
この時はFn::GetAtt関数を使用しましょう。
Fn::GetAtt関数はAWSリソースの属性値を参照する関数です。
先ほどと同じVPCとサブネットを作成するテンプレートを例に使用方法をみてみましょう。
同じテンプレートで作成されたMySubnetのAZをOutputsセクションに出力したいようですね。
そのため、Fn::GetAtt関数を使用し、このように記述します。
Outputs:
Output1:
Value: !GetAtt MySubnet.AvailabilityZone
Description: AvailabilityZone
このように記述することで、MySubnetで作成されるAZの値を取得することが出来ます。
実際にこのように出力されます。
この関数もよく使われる関数なので、覚えておきましょう。
GetAttはGetAttribute(要素の属性値を取得する)というjavascriptのメソッドからきています。
④Fn::ImportVaule:別スタックで出力された値を参照する
別のテンプレート内に定義されたAWSリソースを参照したいなぁ..
この時はFn::ImportVaule関数を使用しましょう。
Fn::ImportVaule関数は別テンプレートのスタックで出力(OUTPUT)された値を参照する関数です。
セキュリティグループ(以降SGと記載)を作成するテンプレートとEC2を作成するテンプレートを例に使用方法をみてみましょう。
EC2を作成するテンプレートで別のテンプレートに定義したSGを参照したいようですね。
このためには2段階の設定が必要です。
- OutputsセクションのExportプロパティで値をエクスポート(参照される側)
- 組み込み関数Fn::ImportValueで値をインポート(参照する側)
1. 別のテンプレートで定義したSGをOutputsセクションでエクスポートする必要があります。このように記述します。
Outputs:
WebSG:
Description: The ID of the web security group
Value: !Ref WebSG
Export:
Name: "stack-web-sg"
この時にExportするNameはリージョン内で一意の値にする必要があるので、気をつけましょう。
2. EC2を作成するテンプレートでエクスポートされた値を参照します。
Fn::ImportVaule関数を使用し、このように記述します。
SecurityGroupIds: [!ImportValue "stack-web-sg"]
このように記述することで、別テンプレートの値を取得することが出来ます。
このようにスタック間でリソースを連携することをクロススタック参照と呼びます。
クロススタック参照により、AWSリソースをアプリケーション部とネットワーク部というように、テンプレートを分割することが出来ます。 分割するメリットはこちらです。
Fn::ImportVaule関数もよく使われる関数です。覚えておきましょう。
Value(値)をImport(入力する)でそのままの意味なので、覚えやすいですね。
⑤Fn::FindInMap:Mappingセクションで定義された値を取得する
同じテンプレートでも別のパラメータでAWSリソースを作成したいなぁ..
この時はFn::FindInMap関数を使用しましょう。
Fn::FindInMap関数はMappingセクションで定義された値を取得する関数です。
Mappingセクションでリージョン毎に値が異なるパラメータを管理することでテンプレートの再利用性が向上します。
EC2インスタンスを作成するテンプレートを例に使用方法をみてみましょう。
テンプレートによって、EC2のAMIを変更したいようですね。
まずはMappingセクションにAMIのマッピングテーブルを作成します。このように記述します。
Mappings:
RegionMap:
ap-southeast-1:
"32": "ami-66f28c34"
"64": "ami-60f28c32"
ap-northeast-1:
"32": "ami-9c03a89d"
"64": "ami-a003a8a1"
リージョン、ビット毎にAMIを設定しました。
今回は東京リージョン(ap-northeast-1)で32ビットのAMIを使用したいと思います。
そのため、Fn::FindInMap関数を使用し、このように記述します。
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", "32"
このように記述することで、ap-northeast-1で32ビットのAMI “ami-9c03a89d”を取得することが出来ます。
Fn::FindInMap関数はテンプレートを使いまわすことができる関数です。
これまで解説した関数よりは使用頻度は低いですが、覚えておきましょう。
InMap(Mappingの中)からFind(探す)で覚えやすいですね。
⑥Fn::Base64:文字列をBase64エンコードする
EC2にユーザーデータやメタデータの値を設定するのにBase64エンコードしたいなぁ..
この時はFn::Base64関数を使用しましょう。
Fn::Base64関数は文字列をBase64形式にエンコードする関数です。
Base64とはデータを他の形式へ変換する(エンコード)方式の一つです。
詳しくはこちらの記事で分かりやすく紹介されているので、参考にして下さい。
base64ってなんぞ??理解のために実装してみた
先ほどと同じEC2インスタンスを作成するテンプレートを例に使用方法をみてみましょう。
EC2にユーザーデータを設定したいようですね。
そのため、Fn::Base64関数を使用し、このように記述しています。
UserData:
Fn::Base64:
! /bin/bash
yum update -y
yum install httpd -y
このように記述することで、Base64でユーザーデータを設定できます。
ちなみにこの例はwebサーバを事前にインストールするコマンドです。
Fn::Base64関数はあまり使用頻度は高くないですが、便利な関数なので、覚えておきましょう。
関数名がそのままの意味なので、覚えやすいですね。
⑦Fn::Transform:テンプレートの処理に使用するマクロを指定する
S3上のファイルをテンプレートに読み込みたいなぁ..
この時はFn::Transform関数を使用しましょう。
Fn::Transform関数はテンプレートの処理に使用するマクロを指定できる関数です。
2022/6/18時点でマクロにはこちらの5種類があります。
- AWS::CodeDeployBlueGreen:スタックの CodeDeploy を通じて ECS ブルー/グリーンデプロイを有効にする
- AWS:Include:S3上のファイルをテンプレートに読み込む
- AWS::SecretsManager:ローテーションを実行する Lambda 関数を指定する
- AWS::Serverless:使用するAWS SAMのバージョンを指定する
- AWS። ServiceCatalog:既存のサービスカタログプロビジョニング済み製品を出力する
今回はこの中からピックアップしてAWS:Includeについて解説します。
他のマクロについて知りたい方はこちらの公式ドキュメントを確認してみて下さいね。
AWS CloudFormation ユーザガイド 変換リファレンス
AWS:IncludeはS3上に置かれている別のテンプレートのパラメータをテンプレートに読み込みたい時に使用します。プログラミング言語のinclude、copy、import等をイメージしてもらうと分かりやすいですね。
使用方法をみてみましょう。
AWS:Includeは色々な場所で指定することができますが、今回はテンプレートの最上位に指定してみます。Fn::Transform関数を使用し、このように記述しています。
Fn::Transform:
Name: 'AWS::Include'
Parameters:
Location:'s3://S3BucketName/MyFileName.yaml'
このように記述することで、S3BucketNameにあるMyFileName.yamlを読み込むことができます。今回はDescriptionを呼び出しています。
より詳細な使い方は、クラスメソッド様のこちらのブログが参考になります。
AWS::Include Transformを使ってCloudFormationのテンプレートをキレイに整理しよう!!
この関数を使うと何がいいの?
この関数を使用するメリットはこちらです。
AWS:Includeはインフラの規模が大きくなるCloudFormationテンプレートで使ってみましょう。使用頻度は低いですが、覚えておくと便利です。
まとめ
今回はAWSサービスの中からCloudFormationの組み込み関数を7つご紹介しました。
後半No.8〜13の組み込み関数をまだ確認していない方はこちらの記事も読んでみて下さいね。
AWS環境を動的に作成するためにも、組み込み関数はマスターしておきたいですね。
最初は難しく感じますが、実際にテンプレートを書くことで徐々に慣れていきます!
こちらの記事でAWS初学者におすすめのハンズオン講座をご紹介しています。
この講座でも一部の組み込み関数について解説されているので、良ければ参考にしてみて下さい。
それでは、これからも一緒に学んで、自己価値を高めていきましょう〜!
最後まで、お読み頂きありがとうございました!
参考文献
こちらの記事を作成するにあたり、こちらのブログ記事や本を参考にさせて頂きました!
①AWSエンジニア入門講座――学習ロードマップで体系的に学ぶ
②AWS認定資格 クラウドプラクティショナーの教科書: 合格へ導く虎の巻 CloudTech制作委員会シリーズ
どれもAWS初学者にとって、とても分かりやすい内容になっていますよ!
良ければ参考にしてみて下さい!
コメント