【AWS】CloudFormationを学ぶ~テンプレートセクション~
はじめに
こんにちは。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であり現時点で唯一有効な値
AWSTemplateFormatVersion: 2010-09-09
Discription
テンプレートの説明を記述する
Description: Sample Template
Metadate
テンプレートに関する追加情報を記述する
使用例:[AWS::CloudFormation::Interface:]を設定しパラメータの入力順序を指定
Description:
AWS::CloudFormation::Interface:
ParameterGroups:
Parameters
・スタック作成時、ユーザに設定値を入力させたい場合に使用する
・データ型、デフォルト型、最大最小値などのプロパティを設定可能
・入力された値は、テンプレート中で”!Ref”という組み込み関数を使用する
Parameters:
パラメータ名
Type: string
Default: 〇〇〇
Rules
・スタックの作成またはスタックの更新時にテンプレートに渡されるパラメータまたは
パラメータの組み合わせを検証する
・ルール条件 (オプション)では、ルールがいつ有効になるかを決定する
・アサーション (必須)では、特定のパラメータにユーザーが指定できる値を示す
使用例:検証、商用環境によって正しいインスタンスタイプが指定されているか。
Mappings
・条件によって設定値を指定したい場合に使用
使用例:リージョンごとにことなるAMIを使い分ける
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
・スタックテンプレートの一部に対してカスタム処理を実行するためのマクロを指定する
Fn::Transform:
Name : macro name
Parameters :
Key : value
Resources
・スタックを構成するリソースの定義を行う
利用可能なリソースはAWS リソースおよびプロパティタイプのリファレンスを参照する
Resources:
論理ID:
Type: リソースタイプ
Properties: リソースプロパティ
Outputs
・インスタンスIDやIPアドレスなど、スタック構築後、使用したい情報がある場合に使用する
・Outputs(出力)のエクスポート名を介して別のスタック からリソースを参照する用途にも用いる
最後に
今回はCFnについてテンプレートのセクションの内容を中心に記載してみました。
組み込み関数やテンプレート例のすべては書けなかったですが、今まであまり触れていなかったCFnについて少し理解できたように感じています。今のところの感想はある程度テンプレートの作り方を覚えてしまえば構築が楽になるやろうけど、、覚えるまでがめっちゃ大変じゃない?です。笑
学習を継続し、がっつり理解できるようになるまで頑張っていきます!
今度は複雑なテンプレートを作成し構築することにも挑戦してみようと思います。
参考文献
Discussion