CloudFormationを学びたい方へ 個人的学習法・テンプレート書き方まとめ

CloudFormationを自己学習していて、こう学習するのがいいだろうとか、
テンプレート書く時はこうするとやりやすい、という自分なりの学習法をまとめてみました。
CloudFormationの勉強をされる方の参考になれば幸いです。

# 0. 動作環境
動作環境は以下になります。

- Windows10
- python 3.9.7
- Visual Studio Code 1.62.0

# 1. 前置き
## 1.1. CloudFormationとは
AWSリソースの設定内容を記載したテキストファイル（テンプレートといいます）を作成することで、AWSリソースを自動作成するサービスです。
Infrastructure as Code を実現し、同じ環境をすぐに作成、一括管理できます。

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

## 1.2. CloudFormationを学んでよかったと思うこと
- テンプレートを作成したAWSサービスに詳しくなる。
  - AWSサービスがどんなAWSリソースの組み合わせでできているのか知れる。
  - AWSリソースに設定できる内容に目を通せる。
- 一度テンプレートを作成してしまえば、環境構築・環境削除がすごく楽。  
  - 手動のクリック操作が格段に減る。
  - 環境を一括削除できて、消し忘れによる意図しない課金も減る。

## 1.3. CloudFormationテンプレート作成の難しいところ
CloudFormationのテンプレートを書く時に苦労するのが、以下のような点かと思います。
以下を踏まえ、自分なりにやりやすいと思う学び方を記載していきます。

1. AWSリソースごとに必要な記載内容が異なる。
一つ書き方を覚えても、別のAWSリソースを書く際には学習が必要。

1. 複数種類のAWSリソースの組み合わせで成り立っているAWSサービスがある。
例えば、ECSは「ECSクラスター」「オートスケーリンググループ」「起動設定」の3つのAWSリソースで構成されており、それぞれ個別に記載が必要。目的のAWSサービスを構築するために必要なAWSリソースが何なのか知らないと書けない。

1. 構文ミス、設定ミスに気が付きにくい。
テンプレートを実行してエラーになって初めて気が付くことが多い。

# 2. おすすめの学び方
以下手順で学ぶのが良いかと思います。
　2.1. CloudFormationの概要とテンプレートの書き方の基本を理解する
　2.2. テンプレートを書くための環境を整える
　2.3. 実際にテンプレートを書いてみる
　2.4. テンプレートを実行する

以下は補足情報です。
　2.5. CloudFormationデザイナーを使ってテンプレートを作成しない

## 2.1. CloudFormationの概要とテンプレートの書き方の基本を理解する
まずはAWS Black Beltの資料を一読することをおすすめします。
Black Belt以外にも入門記事はたくさんネットに落ちているので探してみてください。

- AWS Black Belt

https://www.slideshare.net/AmazonWebServicesJapan/20200826-aws-black-belt-online-seminar-aws-cloudformation-238501102

↓ 解説動画もあります

https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-cloudformation-2020/

## 2.2. テンプレートを書くための環境を整える
エディターは何でもいいですが、CloudFormation関連のプラグインが用意されているものがよいと思います。ここではVSCodeに適用するおすすめのツール・拡張機能を記載します。

- [YAML](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml)（VSCode拡張機能）
YAMLを書く場合に便利な拡張機能です。

- [cfn-lint](https://github.com/aws-cloudformation/cfn-lint)
CloudFormationテンプレートの構文チェックをするコマンドラインツールです。後述のVSCodeの拡張機能と組み合わせることで、テンプレートを記載しながら構文エラーの箇所に警告が表示されるようになります。　※注意点：[^1] [^2] 　

- [CloudFormation Linter](https://marketplace.visualstudio.com/items?itemName=kddejong.vscode-cfn-lint)（VSCode拡張機能）
VSCode上でcfn-lintの結果（構文チェック結果）が表示されるようになります。
リソースの参照関係を図示してくれる機能もあります。　※注意点：[^1] [^2]

- [Cloudformation-template-schema](https://github.com/aws-cloudformation/cloudformation-template-schema)
リソースタイプと必須プロパティのリストを自動補完してくれます。リソースタイプのリファレンスへのリンクも表示されます。

## 2.3. 実際にテンプレートを書いてみる
初めてテンプレートを書くAWSリソースの場合、以下の流れでテンプレートを書くのがおすすめです。
　2.3.1. 参考となるテンプレートを探す
　2.3.2. AWSリソースのリファレンスを参照しながらテンプレートを書く
　2.3.3. cfn-lintで構文チェックする
　2.3.4. 作成したテンプレートをCloudFormationデザイナーにコピペして、検証＆図示

### 2.3.1. 参考となるテンプレートを探す
書きたいAWSサービスに対して、どのAWSリソースおよび設定を書けばいいのかわからない、がスタートかと思います。
なのでサンプルを探します。まずはAWS公式にないか。なければネットで検索をかけます。
AWS公式のサンプルは以下にあります。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/sample-templates-services-ap-northeast-1.html

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

見つからなかったり不十分であれば、手動でAWSリソースを作成して、作成したAWSリソースをテンプレート化します。作成済みのAWSリソースをテンプレート化するには、Former2というWebサービスを使用します。
使い方は以下記事がわかりやすいです。

https://dev.classmethod.jp/articles/former2/

### 2.3.2. AWSリソースのリファレンスを参照しながらテンプレートを書く
参考となるテンプレートを見つけたら、実際に書いていきます。
AWSリソースに設定する内容（プロパティ）はリファレンスを参照します。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-reference.html

拡張機能（Cloudformation-template-schema）を入れている場合は、以下のようにカーソルを当てるとリファレンスへのリンクが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/09869267-e0c3-b817-6f2e-ecac022e1f6e.png)

### 2.3.3. cfn-lintで構文チェックする
上述の拡張機能（CloudFormation Linter）を入れている場合は、編集しながらチェックされます（ファイル保存は必要）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/b2ea9dd7-a2c7-48aa-3b39-c0f4907c629d.png)
拡張機能を入れていない場合は、コマンドラインで実行します。

```
C:\> cfn-lint .\Template.yaml
E3003 Property DefaultActions missing at Resources/AlbListener/Properties
.\CreateALB.yaml:63:5

E3002 Invalid Property Resources/AlbListener/Properties/DefaultAction
.\CreateALB.yaml:64:7
```

### 2.3.4. 作成したテンプレートをCloudFormationデザイナーにコピペして、検証＆図示
CloudFormationデザイナーはAWSコンソールから起動できるGUIツールです。
作成したテンプレートを貼り付けて、検証ボタンを押すことでテンプレートが妥当かチェックできます。また、作成されるAWSリソースが図示されるので、想定通りか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/8346c85e-6d9b-999f-d69f-7cd4ebc5389b.png)

## 2.4. テンプレートを実行する
テンプレートが書けたのであとは実行するだけです。無事リソースが作成できたら万々歳！
テンプレートが実行できても、リソース作成中にエラーとなる場合もあります。その場合はエラー文を見てテンプレートやパラメータの値を修正します。リソース名が長すぎたり指定したプロパティの値が不正であったり、テンプレートの構文ではなくリソース作成時のエラーとなります。

## 2.5.（補足情報）CloudFormationデザイナーを使ってテンプレートを作成しない
CloudFormationデザイナーはGUIでリソースをドラッグ＆ドロップしてテンプレートを作成することができます。視覚的で分かりやすくはありますが、以下点でおすすめしません。

- GUIで編集すると、テンプレートのコメントが消える。
- CloudFormationデザイナー上で表示するためだけのメタデータがテンプレートに残る。

# 3. まとめ
以上、おすすめの学習法、テンプレートの書き方でした。
結局のところ、動作実績のあるサンプルテンプレートをいかに手に入れ、ミスなく作成するか、がポイントかと思います。紹介した手順で行っても、テンプレート実行時のエラーなどにハマることはあるので、トライアンドエラーで根気よく作成しましょう・・・！
参考になれば幸いです。

[^1]: python（2.7以上または3.5以上）がインストールされている必要がある。

[^2]: Windows環境では、日本語が含まれたテンプレート（コメント含む）は解析できない。これを防ぐにはWindowsの言語設定を変更する必要がある。[【cfn-lint】日本語を含む template.yml を開くと「cfnlint.decode - ERROR - Cannot read file conents:<ファイル名>」が発生する](https://qiita.com/shimamura_io/items/3253a4d4e0aa291da534)