AWS CloudFormation を開発・テストする際に役立つツール纏め

#はじめに#

CloudFormation テンプレートを作成する際に、一から作成するのではなく、

- [日本の APN プレミアティアパートナー](https://aws.amazon.com/jp/partners/premier/) のやってみた系。
- [AWS公式のCloudFormationユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
- GitHubなどでパブリックで公開されているもの。
- [AWS CloudFormation デザイナー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html)

などを利用し、独自にカスタマイズし作成するかと思います。

ただし、このような問題に

- 作ってみたはいいけど、必要なリソースや必須のパラメータが足りなく、いざデプロイしようとしたら、動かない。
- そもそもあまり理解していない、触ったことないサービスなのに、いきないテンプレートで作成するのには、レベルが高い。

などといったことがあると思います。


#開発#

##エディタ##

個人的に利用しているエディタは、**Visual Studio Code** です。
以降は、VS Code を利用する前提で書いていきます。

https://code.visualstudio.com/

なお、事前準備としてデフォルトのままだと!Sub, !RefなどのCloudFormation固有のスキーマがYAMLの構文エラーとなるため、`settings.json` に次の記事の設定をしておくと構文エラーとならずに済みます。

https://qiita.com/yoskeoka/items/6528571a45cd69f93deb

##cfn-lint##

cfn-lint は入力した値の整合性をチェックし、不要なパラメータがある、必須のパラメータの定義がされていない場合に warning や error で検出してくれます。

https://github.com/aws-cloudformation/cfn-python-lint

導入手順は⬇︎の記事に書かれていたので、割愛します。

https://qiita.com/Kouichi_Itagaki/items/31d640d708925c0ae838#4-cloudformation-linter%E3%81%AEpath%E3%82%92%E5%A4%89%E6%9B%B4

次の例では、存在しないセクションがあると、エラーを出してくれています。
![スクリーンショット 2021-04-07 22.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/540bd4ba-34a6-a6dc-be70-34d77187caed.png)

開発時に適宜確認できた方が効率が上がると思います。

##自動補完##

CloudFormation template schema を利用することで、自動補完してくれます。
入力のミスも防いでくれますし、必須のパラメータもわかるのでとても便利かと思います。
このような拡張機能を利用していかないと一から作成するには時間がかかりますし、そもそも無理です。

https://github.com/aws-cloudformation/aws-cloudformation-template-schema

拡張機能からインストールすることが可能であり、反映にはVS Codeを再起動する必要があります。

![スクリーンショット 2021-04-07 20.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/f556bb87-1675-610c-141b-a38154876714.png)

利用方法は簡単。例えば、`vpc` と打ち、vpc を選択すると、

![スクリーンショット 2021-04-07 20.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9989a3a8-40c6-ece2-61e9-352502cdf578.png)

vpc のパラメータを表示してくれます。

![スクリーンショット 2021-04-07 20.46.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a05bdd60-11d5-50e6-4a38-abd37d04c7b5.png)

#テスト#

##cfn-nag##

テンプレートのセキュリティ的な問題を開発プロセスの初期段階で気づくことができるサードパーティのOSSツールです。

https://github.com/stelligent/cfn_nag

インストール手順は⬆︎のGitHubに公開されている通りです。

例えばMACの場合は、brewで必要なものをインストールする。


```
brew install ruby brew-gem
brew gem install cfn-nag
```

`cfn_nag_scan` で実行した結果、⬇︎の通り VPC Flow log が添付されている必要があるという Warnings が表示されました。

```
$ cfn_nag_scan --input-path vpc.yaml
------------------------------------------------------------
vpc.yaml
------------------------------------------------------------------------------------------------------------------------
| WARN W60
|
| Resources: ["myVPC"]
| Line Numbers: [9]
|
| VPC should have a flow log attached

Failures count: 0
Warnings count: 1
```

##CloudFormation Guard##

独自にルールを定義し、ポリシーへの適合性をチェックするツールです。

https://github.com/aws-cloudformation/cloudformation-guard#how-it-works

試されて見たい方は、classmethodさんが試して見たシリーズを書かれている様なので、そちらから。
以下2つのルールを定義しているようです。

- EBSボリュームで暗号化がされていること
- ボリュームサイズが100GB以下であること

https://dev.classmethod.jp/articles/cloudformation-guard-ga/

##TaskCat##

複数リージョンに同じテンプレートでデプロイする際に簡単にテストできるツールです。
1つのテンプレートやスタックをテストしたのではわからない問題を検知することができます。

https://github.com/aws-quickstart/taskcat

こちらも試されて見たい方は、classmethodさんが試して見たシリーズを書かれている様なので、そちらから。

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

#その他#

##former2##

既存のリソースをテンプレート化してくれる大変優秀なツールです。
※AWS公式のツールではありませんが、blackbeltの資料ややreinvent などの登壇でも紹介されています。

テンプレートを一から作成するのはハードルが高い！
動作確認のためにコンソールから作成して、動作確認が取れたら一からテンプレートを作成するのには手間がかかる。
といったケースに向いていると思います。

https://github.com/iann0036/former2

former2のサイトにアクセスする。

https://former2.com/

**1.Introduction**
Setup >> Introduction より、利用するブラウザの拡張をインストールする。（私は今回、Chrome を利用しました。）

![former2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/52cc035b-965a-ca53-9de8-6c7bcfc1e68c.png)

**2.Credentials**
`ReadOnlyAccess` を付与したIAMユーザを準備して認証情報を取得しておき、credentials を設定します。

下記2つを設定しておけば、動作はします。

 - Access Key
 - Secret Access Key

今回設定はしていませんが、[一時的なセキュリティ認証情報](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#using-temp-creds-sdk-cli)を埋め込むといったことも可能なようです。

 - Session Token
 - Assumed Role ARN

![スクリーンショット 2021-04-09 19.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cebce813-241b-6a5b-e8cf-021db18bb3f6.png)

**3.Parameters**
今回は特別設定していません。
要するにCloudFormation の　`Parameters` セクションです。

**4.Settings**
今回はデフォルトの状態から、`Enable Related Resources`を on の状態にしました。
![スクリーンショット 2021-04-10 16.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e4a1fc6a-351d-972c-5a65-51dc4e79556d.png)

テンプレート化したいリソースを選択すると、先程`Enable Related Resources`を on にしたことより、関連するリソースも拾ってくれるので、「Add Selected」 で追加し、「Generate」をクリックします。
![スクリーンショット 2021-04-10 17.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1fc1a14b-9a94-4df1-93a0-044a1a748a7d.png)

もう見ての通りですが、これでテンプレート化してくれるだけです。
![スクリーンショット 2021-04-10 17.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c4d2d49b-ed74-07a6-5a3c-aec88e664e6b.png)

また、[組み込み関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)や[擬似パラメータ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html)にしたほうがいい箇所やいい感じに出力してくれる点が便利です。

```
"arn:aws:ec2:ap-northeast-1:123456789012:vpc/${MyVPC}"
```
⬇︎

```
"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${MyVPC}"
```