Vimmer ですか?
AWS CloudFormation を書いてますか?
では ale
と cfn-python-lint
を使いましょう
どう便利なの?
見た方が早いと思うので、試しに壊れたCloudFormationテンプレートファイルを vim で開いてみます。
AWSTemplateFormatVersion:2010-09-09Description:Sample template for ale.vim and cfn-python-lintParameters:# このパラメータは使われてないThisIsNotUsed:Type:StringResources:EC2Instance:Type:'AWS::EC2::Instance'# 必須パラメータが未定義Properties:# AvailabilityZone のハードコーディングは避けるべし# ≒ Parameterや Fn::GetAZs を使おうAvailabilityZone:'us-west-2a'Tags:-Key:Name# 未定義パラメータを使用しているValue:!Sub"${UndefinedParameter}"Outputs:Sample:# 未定義リソースを使用しているValue:!RefNoExistResoure
私の 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
に次のように設定しています。
auBufRead,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
と被せたのはわざとなのかどうなのか... ↩