こんにちは!いつもブログを読んでいただき、ありがとうございます。
📌 現在進行中の学習ロードマップはこちら 👉 【AWS学習ログ①】未経験からクラウドエンジニアへ!私の学習ロードマップ
📌 前回の記事はこちら 👉 【AWS学習ログ②】CloudFormationとは?IaCを始めたら世界が変わった話【CFn入門・前編】
📝 このブログは、プログラミングスクールでAWSを学んでいる私が、学んだ内容を自分の言葉でまとめた学習記録です。
前編では「CFnの概念・IaCとは何か・JSONとYAML」について話しました。後編となる今回は、「実際にどう書くの?(テンプレートの構文)」と「どうやってAWSに反映させるの?(スタックの操作)」を整理していきます!
最初は覚えることが多くて「ウッ…」となるかもしれませんが、「Resourcesだけ書けばどうにかなる!」と覚えれば大丈夫です(笑)
CFnテンプレートは、いくつかのブロック(セクション)に分かれています。
| セクション | 役割 | 必須? |
|---|---|---|
AWSTemplateFormatVersion | バージョン指定(2010-09-09で固定) | 任意 |
Parameters | 画面から入力させる「変数」を定義 | 任意 |
Mappings | 環境ごとの設定値を「表」で定義 | 任意 |
Resources | 作成するAWSリソースを定義 | ✅ 必須 |
Outputs | 作成後のIDなどを出力・他スタックへ共有 | 任意 |
★ ここがポイント!
Resources以外は全部オプション(任意)です! 極端な話、Resourcesさえ書いてあれば動きます。
各セクションの書き方イメージ
1. Parameters(変数の定義)
スタック作成時に、ポップアップ画面で値を入力させたい時に使います。
Parameters:
EnvName:
Type: String
Default: dev
AllowedValues: [dev, stg, prod] # 選択肢を制限できる
2. Resources(最重要!)
ここが本体です。「何を作るか」を定義します。
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance # リソースの種類(何を作る?)
Properties: # 詳細設定(スペックは?)
InstanceType: t3.micro
ImageId: ami-0xxxxxxx
💡
Typeに何を書けばいい? AWS公式リファレンス(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)で調べながら書きます。全部覚える必要はありません!
3. Outputs(出力・共有)
作成されたリソースのID(VPC IDなど)を画面に表示したり、他のスタックに渡したりします。
Outputs:
InstanceID:
Value: !Ref MyEC2Instance
Export:
Name: My-EC2-ID # 他のスタックからこの名前で呼び出せる
テンプレート内では、値を動的に埋め込むための「関数」が使えます。!(ビックリマーク)で始まるのが特徴です。
よく使う関数 BEST 5
| 関数 | 書き方 | 用途 |
|---|---|---|
| Ref | !Ref 論理ID | パラメータの値や、リソースのIDを取得する |
| GetAtt | !GetAtt リソース.属性 | リソースの特定の属性値(DNS名など)を取得する |
| Sub | !Sub "文字${変数}" | 文字列の中に変数を埋め込む |
| FindInMap | !FindInMap [マップ名, キー...] | Mappingsで定義した表から値を取り出す |
| ImportValue | !ImportValue エクスポート名 | 別のスタックでOutputされた値を読み込む |
📚 AWS公式:組み込み関数リファレンス https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
⚠️ !Ref と !GetAtt の違いに注意
初心者が一番ハマるポイントです!
# !Ref → リソースの「メインのID」を返す
VpcId: !Ref MyVPC # → VPC ID(vpc-xxxxxxxxx)が返る
# !GetAtt → ID以外の「詳細情報」を取りたい時
DnsName: !GetAtt MyEC2.PublicDnsName # → パブリックDNS名が返る
★ 覚え方 「
!Refで取れない情報は!GetAttを探す」
1. スタックの作成(Create)
マネジメントコンソールにテンプレートをアップロードするだけでOKです。推奨はS3にファイルを置いて読み込ませる方法です。
📚 AWS公式:スタックの作成 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html
2. スタックの更新(Update)と「変更セット」
テンプレートを修正して再アップロードすると、リソースの設定を変更できます。この時、必ず「変更セット(Change Set)」を作成しましょう。
変更セットとは: 「これを実行すると、何が変わるか?」をプレビューする機能です。
⚠️
Replacement: True(置換)が出たら要注意! これは「リソースを一度削除して、作り直す」という意味です。 RDS(データベース)でこれが起きると、データが消えます。 必ず確認しましょう!
📚 AWS公式:変更セット https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html
3. スタックの削除(Delete)
スタックを削除すると、紐づくリソースも一括で削除されます。お片付けが超簡単です。
ただし、以下の場合はエラーで削除に失敗することがあります:
| エラーパターン | 対処方法 |
|---|---|
| S3バケットの中にファイルが残っている | バケットを先に空にしてから実行 |
| 「削除保護」が有効になっている | EC2やRDSの設定から削除保護を解除 |
| 他のスタックから参照されている | !ImportValue している側のスタックを先に削除 |
💡 実機で試しながら学びたい方へ
CFnは「書いて、エラーが出て、直す」の繰り返しで身につきます。独学だと「何が間違っているか分からない…」という壁にぶつかりがちですが、スクールなら講師に質問しながら進められます。
【PR】▶ AWSが学べるスクールはこちら
![]()
![]()
「手動で作っちゃったリソースを、後からコード管理したい…」そんな時に使える便利な機能があります。
IaCジェネレーター(2024年2月〜)
AWSの既存リソースをスキャンして、自動的にCFnテンプレートを生成してくれる機能です。
マネジメントコンソールでの使い方(3ステップ):
- CloudFormation コンソール → 左メニュー「IaCジェネレーター」をクリック
- 「新しいスキャンを開始」でアカウント内のリソースをスキャン(1,000リソースで約10分)
- スキャン結果からテンプレート化したいリソースを選択 → 「テンプレートを作成」
ゼロから書くのが辛い時は、まずこれで雛形を作るのがおすすめです!
⚠️ IaCジェネレーターの注意点(2025年時点)
- 追加料金なしで利用できますが、スキャン回数に制限(クォータ)があります
- すべてのリソースタイプに対応しているわけではありません
- 生成されたテンプレートは手動修正が必要なケースもあります
- 対応リソース一覧:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html
📚 AWS公式:IaCジェネレーター https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/generate-IaC.html
リソースインポート
既存のリソースを、CFnスタックの管理下に取り込む機能です。「インポート用のテンプレート」を用意する必要がありますが、これを使えば作り直しなしでIaC化できます。
📚 AWS公式:リソースインポート https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html
まとめ
| テーマ | 重要ポイント |
|---|---|
| テンプレート構造 | Resourcesだけが必須。他はすべて任意 |
| 組み込み関数 | !Ref(ID取得)と!GetAtt(属性取得)の使い分けが肝 |
| スタックの更新 | 変更セットでReplacement: True(データ消失リスク)を必ず確認 |
| IaCジェネレーター | 既存リソースからテンプレートを自動生成。追加料金なし |
CloudFormationが書けるようになると、インフラ構築のスピードと品質が劇的に上がります。最初はコピペからで良いので、ぜひチャレンジしてみてください!
次回は、AWSのセキュリティの要である「IAM(アイデンティティおよびアクセス管理)」について整理します。ルートユーザーとIAMユーザーの違いなど、基礎からしっかり学んでいきましょう!
皆さんにとって素敵な1日になりますように!
📚 参考:公式ドキュメント・信頼性の高い情報源
| 種別 | リンク |
|---|---|
| AWS公式:テンプレート構造 | https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-anatomy.html |
| AWS公式:リソースタイプリファレンス | https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html |
| AWS公式:組み込み関数リファレンス | https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html |
| AWS公式:変更セット | https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html |
| AWS公式:IaCジェネレーター | https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/generate-IaC.html |
| AWS公式:リソースインポート | https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html |
| DevelopersIO:IaCジェネレーター解説 | https://dev.classmethod.jp/articles/cloudformation-import-existing-resources/ |