📄

【AWS】CloudFormationを学ぶ~テンプレートセクション~

2024/03/31に公開

はじめに

こんにちは。yam です。
AWSのCloudFormation(以下、CFn)のテンプレートの構造や要素について学んだことをまとめました!
今までCFnは試験対策として問題を解いたり、サンプルテンプレートを作成して環境を構築したりする程度でしか触れてきませんでした。試験問題に答えるために出題パターンを丸覚えするのは大変だし意味がないのでしっかり理解してCFnを使いこなせるようになりたい!と思ったのが学習するきっかけです。
今回は、AWSのブラックベルトを中心にその他サイトを参照し、学んだ内容を自分なりにまとめたいと思います。
概要の章では基本的なことについてもまとめたので、復習用や初学者の方の参考になれば幸いです。

概要

CFnとは

・AWSリソースの自動作成・更新・削除を行う
・ JSONまたはYAML形式のファイルにAWSリソースを定義する
・CFnで作成したリソースの集合体をスタックという単位で管理する
・CFn自体への課金はなし(※作成したリソースには課金が発生する)

メリット/デメリット

〇 作業の迅速化
〇 ヒューマンエラーの回避
〇 テンプレートの使いまわしが可能
✖ テンプレート作成やスタック管理の知識を要する

CFn用語集

CloudFormation : スタックの作成/変更/削除およびエラー検知とロールバックを行う
テンプレート : リソース、属性、依存関係の状態を定義するJSON/YAML形式のファイル
スタック : テンプレートからプロビジョニングされるリソースの集合のこと
     スタックを削除するとスタックに紐づくリソースが削除される
変更セット : テンプレートの変更前後の差分と変更に伴う影響を事前に確認するもの

CloudFormationの詳しい概要についてはAWS Black Beltの資料を参照しました。

テンプレートの要素

・CFnのテンプレートには下記の要素を記述する。
Resourceセクションは必須項目
・セクションの順序は任意(セクションが別セクションを参照する場合があるため下記が推奨順序)

順序 セクション名 説明 必須
1 AWSTempleteFormatVersion テンプレートのバージョン NO
2 Description テンプレートの説明文 NO
3 Metadate テンプレートに関する追加情報 NO
4 Parameters 実行時にユーザ入力を求めるパラメータ NO
5 Rules スタックの作成または更新時に入力されたパラメータ検証 NO
6 Mappings 条件パラメータ値の指定に使用 NO
7 Conditions リソースが作成または設定される条件を登録 NO
8 Transform 変換および拡張処理の呼び出しに使用 NO
9 Resources スタックを構成するリソースを定義 YES
10 Outputs スタック構築時に出力させる値(DNS名やIPアドレスなど) NO

AWSTemplateFormatVersion

最新のフォーマットバージョンは2010-09-09であり現時点で唯一有効な値

sample.yml
AWSTemplateFormatVersion: 2010-09-09

Discription

テンプレートの説明を記述する

sample.yml
Description: Sample Template

Metadate

テンプレートに関する追加情報を記述する
使用例:[AWS::CloudFormation::Interface:]を設定しパラメータの入力順序を指定

sample.yml
Description: 
 AWS::CloudFormation::Interface:
  ParameterGroups:

Parameters

・スタック作成時、ユーザに設定値を入力させたい場合に使用する
・データ型、デフォルト型、最大最小値などのプロパティを設定可能
・入力された値は、テンプレート中で”!Ref”という組み込み関数を使用する

sample.yml
Parameters: 
 パラメータ名
  Type: string
  Default: 〇〇〇

Rules

・スタックの作成またはスタックの更新時にテンプレートに渡されるパラメータまたは
 パラメータの組み合わせを検証する
・ルール条件 (オプション)では、ルールがいつ有効になるかを決定する
・アサーション (必須)では、特定のパラメータにユーザーが指定できる値を示す
使用例:検証、商用環境によって正しいインスタンスタイプが指定されているか。

Mappings

・条件によって設定値を指定したい場合に使用
使用例:リージョンごとにことなるAMIを使い分ける

sample.yml
Mappings: 
RegionMap: 
 リージョン名①: 
  "AMI": "ami-12345678901234567" 
 リージョン名②: 
  "AMI": "ami-abcdefghijklmnopq"

Conditions

・条件を宣言し、条件に当てはまった場合にのみリソースを作成する
使用例:プロビジョニングするアカウントと、CFnを実行するアカウントIDが一致する場合のみ、リソースを作成する

組み込み関数 内容 結果
Fn::And 複数の条件を評価する すべての条件が true で結果も true
Fn::Equals 2つの値が等しいこと 2 つの値が同じ場合は true
Fn::If 条件の結果がtrueかfalseによって返す値を指定する trueの場合は、〇〇を返す
Fn::Not 条件に当てはまらないこと false と評価された条件に対してはtrue
Fn::Or 1つでも条件に当てはまること いずれかが true に評価された場合は true

Transform

・スタックテンプレートの一部に対してカスタム処理を実行するためのマクロを指定する

sample.yml
Fn::Transform:
  Name : macro name
  Parameters :
    Key : value 

Resources

・スタックを構成するリソースの定義を行う
利用可能なリソースはAWS リソースおよびプロパティタイプのリファレンスを参照する

sample.yml
Resources:
  論理ID:
    Type: リソースタイプ
    Properties: リソースプロパティ 

Outputs

・インスタンスIDやIPアドレスなど、スタック構築後、使用したい情報がある場合に使用する
・Outputs(出力)のエクスポート名を介して別のスタック からリソースを参照する用途にも用いる

最後に

今回はCFnについてテンプレートのセクションの内容を中心に記載してみました。
組み込み関数やテンプレート例のすべては書けなかったですが、今まであまり触れていなかったCFnについて少し理解できたように感じています。今のところの感想はある程度テンプレートの作り方を覚えてしまえば構築が楽になるやろうけど、、覚えるまでがめっちゃ大変じゃない?です。笑
学習を継続し、がっつり理解できるようになるまで頑張っていきます!
今度は複雑なテンプレートを作成し構築することにも挑戦してみようと思います。

参考文献

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html

https://cloudnavi.nhn-techorus.com/archives/4244#:~:text=請求代行サービス-,AWS CloudFormation(cfn)とは,的に構築できます。

https://techblog.raccoon.ne.jp/archives/1601887183.html

https://zenn.dev/mjxo/articles/aacb0f43fc4a75#aws%3A%3Acloudformation%3A%3Ainit

https://zenn.dev/tmasuyama1114/articles/429a58b68efeb4

https://qiita.com/miyabiz/items/eb7b0fa1675b5199b9b7

https://dev.classmethod.jp/articles/lim-cfn-session-2-js-n/

https://qiita.com/sakai00kou/items/f562f02fe0fc8719ef65#conditionsセクションの記載

Discussion