Vimmer ですか?
AWS CloudFormation を書いてますか?
では ale と cfn-python-lint を使いましょう ![]()
どう便利なの?
見た方が早いと思うので、試しに壊れたCloudFormationテンプレートファイルを vim で開いてみます。
AWSTemplateFormatVersion: 2010-09-09
Description: Sample template for ale.vim and cfn-python-lint
Parameters:
# このパラメータは使われてない
ThisIsNotUsed:
Type: String
Resources:
EC2Instance:
Type: 'AWS::EC2::Instance'
# 必須パラメータが未定義
Properties:
# AvailabilityZone のハードコーディングは避けるべし
# ≒ Parameterや Fn::GetAZs を使おう
AvailabilityZone: 'us-west-2a'
Tags:
- Key: Name
# 未定義パラメータを使用している
Value: !Sub "${UndefinedParameter}"
Outputs:
Sample:
# 未定義リソースを使用している
Value: !Ref NoExistResoure
私の vim だと次のような表示になります。
>> とか -- のある行にカーソルを合わせると vim のステータスラインにメッセージが表示されます。
ImageId か LaunchTemplate が必須だよ、と教えてくれています。ありがとう。
ale とは
ale は Vim(8.0以上)/NeoVim 向けの Asynchronous Lint Engine プラグインです。
rubocop や eslint など各種 Linter と連携して Lint の結果を Vim 上に表示することができます。
似たプラグインに syntastic がありますが、 ale は vim8 の job に対応しているので非同期処理される・neovim にも対応している・vador によるテストが充実している、などと後発らしい特徴があります。
同じく後発のプラグインとして neomake もあるようですが、私は ale しか使ったことがないので詳しく知りません...。
cfn-python-lint とは
cfn-python-lint は awslabs で作られているPython製のCloudFormation Linter です。 2018/04 に公開されたばかりのできたてホヤホヤです。
既存の Linter としては、 NodeJS製の [cfn-lint](https://github.com/martysweet/cfn-lint) がありましたが、こちらは出力結果がとても人間に優しく、そして機械には優しくない(パースしづらい)ものでした。
cfn-python-lint は ansible-lint を参考にして実装されているようで 1 機械にも優しい出力ができるようになっています。
設定方法
私の環境
筆者の環境は次の通りです。
- OS: macOs HighSierra 10.13.5
- Vim: 8.1.10 (macvim)
- Python: 3.6.5
- cfn-lint: 0.4.1
[python] cfn-python-lint をインストールする
cfn-python-lint は pip でインストールできます。
GitHub上のリポジトリは cfn-python-lint だけど pip でインストールする時は cfn-lint なことに注意です。2
pip install cfn-lint
[vim] ale をインストールする
ale をインストールします。
例えば dein.vim でプラグインを管理しているなら、
call dein#add("w0rp/ale")
といった感じです。
私は TOML を利用しているので、
[[plugins]]
repo = "w0rp/ale"
という具合です。
[vim] filetype=cloudformation を設定する
cfn-python-lint を ale で利用するには filetype を cloudformation にする必要があります。
filetype が cloudformation なら ale は自動的に cfn-python-lint を使います。
私の場合は、 xxxx.template.yaml というファイル名にすることが多いので ~/.vim/ftdetect/cloudformation.vim に次のように設定しています。
au BufRead,BufNewFile *.template.yaml set ft=cloudformation.yaml
yaml をベースにしつつ fieltype を cloudformation にすることで、 yaml のシンタックスハイライトを利用しつつ ale で cfn-python-lint を使うことができるようになります。
備考
ちなみに ale で cfn-python-lint を使えるようにしたのは私です ![]()
ちなみにその直後、 cfn-python-lint を最新版にすると動かないからと修正されました ![]()
-
コマンド名も
cfn-lintなのだけど Node.js製のcfn-lintと被せたのはわざとなのかどうなのか... ↩


