概要
AWS Solutions Architect - Associate (SAA) 対策や実務において、CloudFormationの用語や構造(セクション、プロパティ、組み込み関数)で混乱しやすかったポイントを論理的に整理したまとめノートです。
プログラミングの「変数」や「キー・バリュー」の概念、直感的な比喩(注文書モデル)を用いてメンタルモデルを構築しています。
1. テンプレートを構成する主要セクション(大見出し)
指示書(YAML)の一番左端に定義する「何を作るか・どう扱うか」のトップレベルセクションです。
| セクション | 役割 | 注文書のイメージ |
|---|---|---|
Resources |
【必須】何を作るか を定義する |
メインの商品名 (例:S3バケット、EC2インスタンス) |
Parameters |
作成時に外部から指定する設定値 を定義する |
オプション選択 (例:インスタンスタイプを t3.micro にする等、実行時に決める値) |
Outputs |
作成された結果を出力・共有する 場所 |
領収書・完了通知 (例:完成したS3バケット名やEC2のIPアドレス) |
2. セクション内で使用される要素(プロパティ)
主に各セクションの中でリソースの挙動や関係性を定義する設定項目です。
-
Export-
役割:
Outputsセクションで出力した結果に対し、外部公開マークを付与する設定。他のテンプレートから参照できる状態にする。 - イメージ: 「他の指示書でもこの値を使っていいよ」という公開マーク。
-
役割:
-
DependsOn- 役割: リソースの作成順序を明示的に制御する。
- イメージ: 「VPCが完成してからEC2を構築する」といった依存関係の指定。
-
DeletionPolicy- 役割: スタック(テンプレート)を削除した際、そのリソースをどう処理するか指定する。
-
イメージ:
DeletionPolicy: Retainと書くと、スタックを削除してもS3バケットやRDSだけは消さずに残すことができる(誤削除防止)。
3. 主要な組み込み関数(データ取得・操作)
① Ref(レフ)
用途は大きく分けて2パターンあります。
-
パターンA:
Resourcesセクションで定義したリソース関連の値を呼び出す -
パターンB:
Parametersセクションで明示的に指定した値を呼び出す(変数的な使い方)
【深掘り】パターンAの仕組み(論理名と物理名)
-
論理名の定義(ユーザー側)
テンプレート作成時点では、本物のリソース名やID(物理名)はまだ決まっていないため、ユーザーが仮の名前(論理名 / キー)を定義する。 -
物理値の割り当て(AWS側)
テンプレートを実行(デプロイ)した際、AWS側がリソースを実際に作成し、本物の名前やID(物理名 / バリュー)をその論理名に紐付ける。 -
Refによる参照
!Refは、ユーザーが定義した「論理名(キー)」を指定することで、AWSが割り当てた 「本物の名前やID(バリュー)」を取り出して呼び出す仕組み。
Resources:
# ① 論理名(キー)を定義(S3バケットの作成)
MyBucket: # ← 変数名(キー)のようなもの
Type: AWS::S3::Bucket
# ② 論理名を参照する(Refで呼び出す)
MyPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref MyBucket # ← 「MyBucket の本物の値(バリュー)を入れる!」=変数呼び出
② その他の主要組み込み関数
-
ImportValue-
役割: 別のテンプレートで
Exportされた値を読み込み、自分のテンプレート上で利用する命令。 - イメージ: 他の指示書が公開しているメモを読み取る。
-
役割: 別のテンプレートで
-
Fn::GetAtt(!GetAtt)-
役割:
Refでは取得できない、リソースの特定属性(例:S3のARN、EC2のプライベートIPなど)をピンポイントで取得する。
-
役割:
-
Fn::Sub(!Sub)-
役割: 文字列の中に変数(
${MyBucket}など)を埋め込む。
-
役割: 文字列の中に変数(
-
Fn::Join(!Join)- 役割: 指定した区切り文字を使って、複数の文字列を結合する。
4. その他重要な仕組み・機能
ドリフト検出(Drift Detection)
- 役割: テンプレートからスタックを作成後、誰かがマネジメントコンソール等から手動でパラメータ変更を行った場合に生じる**「テンプレートのコードと、実際のAWS設定のギャップ(ズレ)」**を検出する機能。
ヘルパースクリプト(cfn-init など)
- 役割: EC2インスタンスが起動した直後に、ミドルウェア(Webサーバー等)のインストールや初期セットアップを自動実行する仕組み。
-
詳細メカニズム:
- コマンドの核となるのは
cfn-initなどのプログラム(CloudFormationで構築するEC2に標準で含まれるツール群)。 - テンプレートの
Metadataセクションに初期セットアップ内容(パッケージやファイル構成)を記述。 -
UserDataからcfn-initコマンドを呼び出すことで、Metadataに記載した設計図通りの初期セットアップが自動実行される。 - やっていることはEC2の「ユーザーデータ」機能に近いが、構成管理として綺麗に構造化して書けるメリットがある。
- コマンドの核となるのは
5. まとめ:理解を上げるコツ
理解度を上げるポイントは、構文を暗記することではなく 「何をしたい時に、どの要素を使うべきか」という要件とのマッチング を把握することだと感じました。
-
値の受け渡し・出力:
Parameters(入力) /Outputs+Export➔ImportValue(外部共有) -
属性の取得・参照:
!Ref(名前やIDの基本参照) /!GetAtt(ARNやIPなど特定の属性取得) -
順序と保護:
DependsOn(作成順制御) /DeletionPolicy(スタック削除時のリソース保護) -
構成と運用:
Drift Detection(設定のズレ検出) /Metadata+cfn-init(EC2初期セットアップの構造化)
単なる用語暗記ではなく、こうした「役割の関係性」やイメージ(メンタルモデル)を整理しておくと、SAAの試験問題や実務のコードを読む際にも頭に入りやすくなると思います。同じくSAA合格を目指して学習中の方の参考になれば幸いです!