cloudpack あら便利カレンダー 2018の記事です。

tl;dr

CloudFormation テンプレート用の JSON Schema を作ったので、これを使って CFn テンプレートを書いてみてほしいです。

y13i/cfn-schema: JSON Schema for AWS CloudFormation templates.

CloudFormation って

テンプレートを書いてる時間の大半がリファレンス読みだと感じていて、

  • アレを作るにはどのリソースタイプを使ったらいいのか
  • アレを設定するにはどのプロパティを使ったらいいのか

というのを調べる時間がほとんどだと思うんですね。

で、いざ書いたので実行してみようとするとどこか間違ってて蹴られたり。もうちょっとエディタで書いてる段階で補助がほしい。

JSON Schema って

Understanding JSON Schema — Understanding JSON Schema 1.0 documentation

が一番わかりやすいと思います。要は JSON で表現できるデータに対する、 JSON で表現された型定義です。

型定義があることで、あるデータがその型にちゃんと合っているかを検証すること(Validation)ができます。

複雑な条件に対する記法もかなり充実しているので、 CloudFormation テンプレートのような特定形式のオブジェクトを使った関数表現なども定義することが可能です。

なぜ作った

同様の試みは何件か既存のものを見つけたのですが、 Fn:: 関数への対応がイマイチだったり、メンテされてなかったり、一度 clone して手元でビルドしないといけなくて面倒だったりするので自作しました。

使い方

Visual Studio Code で使うのが一番簡単だと思います。

GitHub Pages に JSON Schema を置いてあるので、 Ctrl/⌘ + , でプロジェクトの設定を開き、

.vscode/settings.json

{
"json.schemas": [
{
"fileMatch": ["*.cfn.json"],
"url": "https://y13i.github.io/cfn-schema/us-west-2.min.json"
}
]
}

という感じで JSON Schema を使う設定をしてあげればおわりです。

この場合は .cfn.json で終わる名前のファイルに対して https://y13i.github.io/cfn-schema/us-west-2.min.json を適用するという設定になります。 us-west-2 の部分はお使いの AWS リージョンに合わせて設定してください。

あとは foobar.cfn.json などのファイルでテンプレートを書き始めることができます。プロパティ名の補完や、プロパティにマウスオーバーしたときのツールチップ表示、正しくない指定に対するエラーなどが確認できると思います。

YAML で使う場合は VSCode 本体でのサポートはまだない(as of 2018-07)ので、 Redhat が作っている拡張を使いましょう。オプションの指定方法が JSON の場合とちょっと違うので注意。

どうやって作った?

Fn:: 関数などを含むベースの JSON Schema は、手動でがんばって書きました。

各リソースの定義は流石に数が多すぎて人類には無理です。しかし、 AWS が独自フォーマットの定義を公開しています。これを拾ってきてパースしてベーススキーマに足すスクリプトを JavaScript で書きました。

元記事はこちら

JSON Schema で快適に CloudFormation テンプレートを書く