CFnをYAMLで快適に書く環境をVSCodeで作成する

#はじめに

これからのクラウドエンジニアはAWSができるだけではだめで、
CloudFormation(以下CFn)を使いこなしInfrastructure as Codeを常に意識しなくてはいけないのではないか！！！
と思い立ったのでCFnをYAML形式で書き始めました。

仕事でVSCodeを使っているので(個人的に)快適な環境を構築したのでメモとして残させていただきます。
これからCFnを書き始める方々の一助になれば幸いです。

#CloudFormationってなんやねん

AWS内の構成管理をCodeで行えるという代物です。
全てをCFnで行えるわけではありませんが、多くのサービスは網羅されているようです。

同じ構成のVPCをたくさん作る必要がある
といった場合にも活躍すると思われます。

詳しくは下記を参考に...
[AWS公式](https://aws.amazon.com/jp/cloudformation/)

#なぜYAMLで書くのか

CFnはYAML/JSON形式に対応しています。
しかし、JSON形式は``` { } ```がかなり多くなってわかりにくいですし、
何よりも**コメントアウトが残せない**のがつらいです。
自分一人で書く分には問題ないのですが、
チームで書く場合や引き継ぐ場合に無駄なコストが発生するので私はYAML推しです。

#環境構築

### 動作環境

- Windows10
- 64ビット


### VSCodeのインストール

[公式サイト](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)または下記からダウンロードできます。

[VSCodeダウンロード](https://code.visualstudio.com/download)

### 拡張のインストール

1.[CloudFormation](https://marketplace.visualstudio.com/items?itemName=aws-scripting-guy.cform)

VSCodeの言語モードをYAMLに変更して```strat```と入力するだけでCFnの骨組みをざっくりと作成してくれるという便利な拡張です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450480/646d5f8f-1bf7-4f73-96be-28136d8720fe.png)
インストールして有効化するだけでOKです。

2.[cfn-lint](https://marketplace.visualstudio.com/items?itemName=kddejong.vscode-cfn-lint)

CFnのエラー等を教えてくれる便利ツールです。
入力ミス等はだいたいこれで撃退できます

 ``` pip ```を使ってインストールします。

```bash:ターミナル
pip install cfn-lint
```
※Pythonのインストールは下記を参考にしてください。
[Pythonインストール(Win10)編](https://qiita.com/New_enpitsu_15/items/ee95bde0858e9f77acf0)

settings.jsonにフルパスを追加します。
VSCodeのトップ画面で``` Ctrl + , ```右上の**Open Settings(JSON)**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450480/61c5cece-7311-786b-d9bd-d7a0fa66d45b.png)
settings.jsonに下記を追加して保存します。

```json:settings.json
{
## cfn-lint.exe へのフルパス
## (ユーザー名は適宜変更して、コメント分は削除してください)
"cfnLint.path": "C:\\Users\\ユーザー名\\AppData\\Local\\Programs\\Python\\Python38-32\\Scripts\\cfn-lint.exe"
}
```

3.[YAML](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml)

YAML構文自体のチェックを行ってくれます。
CFn特有のタグはエラーとして認識されてしまうので下記をsettings.jsonに追加します。

```json:settings.json
{
    "yaml.customTags": [
        "!Ref",
        "!Sub scalar",
        "!Sub sequence",
        "!Join sequence",
        "!FindInMap sequence",
        "!GetAtt scalar",
        "!GetAtt sequence",
        "!Base64 mapping",
        "!GetAZs",
        "!Select scalar",
        "!Select sequence",
        "!Split sequence",
        "!ImportValue",
        "!Condition",
        "!Equals sequence",
        "!And",
        "!If",
        "!Not",
        "!Or",
        "!And sequence",
        "!If sequence",
        "!Not sequence",
        "!Equals",
        "!Or sequence",
        "!FindInMap",
        "!Base64",
        "!Join",
        "!Cidr",
        "!Sub",
        "!GetAtt",
        "!ImportValue sequence",
        "!Select",
        "!Split"
    ]
}
```

4.[indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)

インデントがカラフルになって見やすいです。
拡張をインストールして有効化するだけです。この辺りはお好み次第です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450480/05ff38b5-5357-12d7-6e6d-5a7a0d9be91c.png)


5.[Indenticator](https://marketplace.visualstudio.com/items?itemName=SirTori.indenticator)

インデントの深さを強調してくれます。
こちらもインストールして有効化するだけです。お好みでどうぞ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450480/bc8d9bb9-1331-13f3-6417-c6099dcca4c3.png)

6.[Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)

これはおまけですが日本語化ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450480/984d3655-f101-8d3e-fcfa-04cce7cb4413.png)

### 動作の様子

![CFn-sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450480/ad34c6d2-f161-13fd-5b31-f6990542df8d.gif)



# まとめ

以上、CFnを書く環境構築を行ってきました。
私もまだ入門者なので他にもおすすめ等ございましたらご教授ください。
ここまで読んでいただきありがとうございました。