エンジニア

2022.09.30

これからAWS CloudFormationを始めるあなたに伝えたい5つのこと(後編:テンプレート作成編)

これからAWS CloudFormationを始めるあなたに伝えたい5つのこと(後編:テンプレート作成編)

ごきげんよう!ハンズラボの小川です。

みなさん、AWS CloudFormation使っていますか?
AWS CloudFormationは、IaC(Infrastructure as Code)を実現するサービスです。

使い慣れると非常に便利なサービスですが、数あるAWSサービスの中でもテンプレートの作成や
運用等の面で、やや取っ付きにくさのあるサービスではないでしょうか(個人の見解です)。

そこで、この記事では、CloudFormationのちょっとしたコツを前編・後編の2回に分けてお送りします。

前編では、環境の構築や運用に関するコツをご紹介しました。
後編となる本記事では、いよいよテンプレートの作成に関するコツをご紹介していきます!


コツ3:先人たちが作成したテンプレートを再利用する


コツの3つ目です!(前編でコツを2つご紹介したので、カウントは3から始めます)
先輩方が作成したテンプレートがあれば、ぜひベースとして有効活用させてもらいましょう!

AWS CloudFormationはIaCを実現できるサービスである、と冒頭にお伝えしました。
IaCとは、ざっくり言うと「インフラ部分をコードで構築・管理しましょう」というもので、
メリットの一つとして「作成したコードを別環境の構築に再利用できる」と言う点があります。

もうお分かりですね?
そう、テンプレート作成時に、先輩方が過去に作成したテンプレートを再利用することで、
かなりの効率化が図れてしまうのです!

既存のテンプレートなんて無い…という方もご安心ください。
AWS CloudFormationのテンプレートリファレンスには書き方の例が掲載されています。
例えば、よく使いそうなS3バケットの場合はこんな感じです。

Google先生に検索をお願いしても良いでしょう。
世界中の先人たちがたくさんのテンプレートを残してくれています。

正直、CloudFormationのテンプレートを1から書き起こそうとすると、かなりの労力が必要です。
慣れていない人であれば尚更です。参考にできるものがあれば、ぜひ利用させてもらいましょう。

ただし、注意も必要です。
そのテンプレートの内容はあなたが構築したい環境とまったく同じでしょうか?
いかに優れたテンプレートがあったとしても、まったく同じ環境を構築するのでなければ、
そのテンプレートをこれからあなたが構築したい環境用に編集しなければなりません。

コツ3:既存テンプレートを有効活用して効率化!

というわけで、次のコツも見てみましょう!


コツ4:マネジメントコンソールを見る


さて、4つ目のコツです。
もし、あなたがマネジメントコンソールに接続できる環境にいるのであれば、ぜひマネジメント
コンソールを眺めながらテンプレートを作ってみてください

たとえば、あなたがCloudWatchアラーム設定用のテンプレートを作成したい、と考えているとします。

まず、テンプレート作成時には欠かせないCloudFormationのテンプレートリファレンスを見てみます。
結構な数のプロパティがありますね。さて、これらのプロパティのうち、設定しなければいけないのは
どれで、どんな値を入れれば良いでしょう?

それを知る手がかりとして、マネジメントコンソールは非常に役に立ちます。
急がば回れ、ここで一旦マネジメントコンソールを見てみましょう。

マネジメントコンソールにサインインし、CloudWatchアラームの作成画面を開きます。すると、
最初に「メトリクスの選択」画面が表示されます。メトリクスを設定する必要があるのですね。
では、リファレンスを見てみましょう。MetricNameやMetricsというプロパティがあります。
「メトリクスの選択」はどうやらこのあたりのプロパティに該当しそうです。

マネジメントコンソールでメトリクスを選択すると、今度は「統計」や「期間」を設定する画面に
遷移しました。これらがどのプロパティに該当するかリファレンスを確認すると、「Period」と
「Statistic」が該当していそうです。「Statistic」はAverageやMaximumなど、設定できる値が
決まっている、ということもリファレンスには書いてありました。

このように、マネジメントコンソールとリファレンスを突き合わせながらテンプレートを作成
することで、設定が必要なプロパティや設定値にアタリをつけやすくなります。

また、リファレンスは基本的に英語表記ですが、マネジメントコンソールは日本語などの利用者が
読みやすい言語で表示できるため、その項目が何のための項目でどのような設定を入れることが
できるのか?が分かりやすい点も、おすすめしたい理由のひとつです。

コツ4:マネジメントコンソールを参照してアタリをつける!


コツ5:出来るだけ固有情報を排除する


コツもいよいよ5つ目です。
テンプレートを作成する際は、使い回すことを前提に、できるだけ環境固有の情報を排除しましょう

コードを使いまわせるのがIaCのメリットの一つです。
しかし、コードに「その環境固有の情報」、例えばAWSのアカウントIDがそのまま記述されていると
使いまわす際にその部分をすべて書き換える必要が出てきてしまいます。そうなると書き換えの手間も
かかりますし、書き換え忘れによる思わぬ影響の発生など、リスクにも繋がりかねません。

CloudFormationには擬似パラメータという便利なパラメータがあります。
例えば、テンプレート内で「!Ref “AWS::AccountId“」と記述すると、その部分はデプロイ先の
AWSのアカウントIDが自動で反映されます。AWSアカウントIDを意識することなくテンプレートを
利用することができるようになるので、非常におすすめです。

組み込み関数もおさえておけるとなお良いです。
環境固有情報の排除、という点では、特にFn::GetAttRefは利用方法を確認して損はありません。

Fn::GetAttやRefは、テンプレート内の他のリソースの情報を利用したいな〜というときに活躍します。
例えばEC2インスタンスを作成する場合は、所属するサブネットのIDの記述が必要です。このとき、
同じテンプレートでサブネットを作成しているのであれば、 !Ref Subnet名 のように記述すること
でCloudFormationが自動で認識・反映してくれます。こうすることで、環境固有のサブネットIDを
テンプレートに記述する必要がなくなります。

Fn::GetAttやRefで指定されたときにどのような値を返すかは、リソースによって異なります。
リファレンスの「Return values」部分に掲載されていますので、ぜひ確認してみてください。

また、Refは、テンプレート内のParametersセクションで定義した値の参照にも利用できます。
EC2インスタンスであれば、インスタンスタイプは環境によって異なる可能性が高いですね。
こういったどうしても記述を避けられない環境固有情報はParametersセクションで定義しておき
各リソース部分ではRefで参照するようにすれば、後で「ここは書き換えが必要」が分かりやすく
なるのでおすすめです。

コツ5:環境固有情報を減らして再利用しやすくする!


以上、CloudFormationテンプレート作成時のコツをご紹介しました。
前編の記事も含め、これからCloudFormationに挑戦する方の参考になれば幸いです。

お読みいただきありがとうございました!

一覧に戻る