Posted at

VimmerがCloudFormationを書くなら ale + cfn-python-lint が便利!

More than 1 year has passed since last update.

Vimmer ですか?

AWS CloudFormation を書いてますか?

では alecfn-python-lint を使いましょう :thumbsup:


どう便利なの?

見た方が早いと思うので、試しに壊れた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 だと次のような表示になります。

image.png

>> とか -- のある行にカーソルを合わせると vim のステータスラインにメッセージが表示されます。

image.png

image.png

ImageIdLaunchTemplate が必須だよ、と教えてくれています。ありがとう。


ale とは

ale は Vim(8.0以上)/NeoVim 向けの Asynchronous Lint Engine プラグインです。

rubocopeslint など各種 Linter と連携して Lint の結果を Vim 上に表示することができます。

似たプラグインに syntastic がありますが、 alevim8job に対応しているので非同期処理される・neovim にも対応している・vador によるテストが充実している、などと後発らしい特徴があります。

同じく後発のプラグインとして neomake もあるようですが、私は ale しか使ったことがないので詳しく知りません...。


cfn-python-lint とは

cfn-python-lintawslabs で作られているPython製のCloudFormation Linter です。 2018/04 に公開されたばかりのできたてホヤホヤです。

既存の Linter としては、 NodeJS製の [cfn-lint](https://github.com/martysweet/cfn-lint) がありましたが、こちらは出力結果がとても人間に優しく、そして機械には優しくない(パースしづらい)ものでした。

cfn-python-lintansible-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-lintpip でインストールできます。

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-lintale で利用するには filetypecloudformation にする必要があります。

filetypecloudformation なら ale は自動的に cfn-python-lint を使います。

私の場合は、 xxxx.template.yaml というファイル名にすることが多いので ~/.vim/ftdetect/cloudformation.vim に次のように設定しています。

au BufRead,BufNewFile *.template.yaml set ft=cloudformation.yaml

yaml をベースにしつつ fieltypecloudformation にすることで、 yaml のシンタックスハイライトを利用しつつ alecfn-python-lint を使うことができるようになります。


備考

ちなみに alecfn-python-lint を使えるようにしたのは私です :smirk:

ちなみにその直後、 cfn-python-lint を最新版にすると動かないからと修正されました :innocent:





  1. https://github.com/awslabs/cfn-python-lint#credit 



  2. コマンド名も cfn-lint なのだけど Node.js製の cfn-lint と被せたのはわざとなのかどうなのか...