[小ネタ] Vimからcfn-python-lintを使ってみた

2020.02.20

はじめに

Cloud Formationのテンプレートを書く際、普段使っているVimで構文エラーチェックができると便利です。
そこで、Vimの非同期LinterプラットフォームであるALEを使い、Cloud FormationのLinter(cfn-python-lint)をVimから呼び出す設定について調べてみました。
(最後にcfn-python-lint自体の設定についても触れています。)

検証環境

以下、手元の検証環境です。

  • Vim
    $ vim --version | head -n 1  
    VIM - Vi IMproved 8.1  (以下略)
    

  • cfn-python-lint

    $ cfn-lint --version
    cfn-lint 0.27.4
    

準備

下記ページを参考にcfn-python-lintをインストールします。
GitHub - aws-cloudformation / cfn-python-lint

$ pip install cfn-lint

コマンド名はcfn-lintですが、npmのcfn-lintとは別物である点にご注意下さい。

ALE自体の導入方法は、ここではvim-plugを使った例のみ記載しておきます。詳細は以下をご確認下さい。
GitHub - dense-analysis / Asynchronous Lint Engine

Plug 'w0rp/ale'

設定

まず、ALEでcfn-lintを使用する設定を.vimrcなど設定ファイルに記載します。特にパス等の設定は必要ありません。

let g:ale_linters = {
            \   'template.yml': ['cfn-lint'],
            \}

続いて、suffixがtemplate.yml/yamlのファイルをCloud Formationのテンプレートファイルであると認識させるための設定です。
ft(File Type)にcloudformation.yamlをsetします。

augroup cfn-template
    autocmd!
    autocmd BufRead,BufNewFile *.template.yml,*template.yaml set ft=cloudformation.yaml
augroup end

以下の項目は任意です。 ALEのオプションは複数ありますが、お好みで設定して下さい。マッピングも任意のものにご変更下さい。

let g:ale_lint_on_enter = 0       " 起動時に非同期での実行をOFF
let g:ale_set_quickfix = 1        " Quickfixリストを使用する
nmap <silent>, <plug>(ale_toggle) " ALEのON/OFF切替を「,」キーにマッピング

また、cfn-python-lint自体の設定(Error/Warningの除外設定)は.cfnlintrcをhomeに作成し以下のように記述します。
(例) 「プロパティをBoolean型で書くべき」というエラー表示を抑制します。

configure_rules:
  E3012:
    strict: False

ルールの詳細についてはdocの中のrules.mdをご参照下さい。
GitHub - aws-cloudformation / cfn-python-lint Rules

  • 設定後のVim画面イメージ
    Enabledをあえてコメントアウトし、エラーを表示させています。

    ※複数のプラグインや設定も同時に多く使用しており、このページで紹介した設定だけでは上記の画面と同一の表示にはなりません。

おまけ

YAMLファイルをVimで扱う際におすすめなタブの設定について、ご紹介します。
Vimを最近使い始めた方は、上記と併せて試して頂ければと思います。

set expandtab smarttab
augroup yaml-tab
    autocmd!
    autocmd BufRead,BufNewFile *.yml,*.yaml setlocal tabstop=2 shiftwidth=2 softtabstop=2
augroup end

オプションは相互に関連した部分もあるため、厳密な説明は参考文献3(非常に分かりやすいです!)をご参照ください。 ここでは天下り的な説明になりますが、
YAMLファイルをバッファで開いた時に、tabキーを押すと2文字分のスペースが挿入される
設定です。とりあえず今回のALEの設定を試してみたい、という場合には良いと思います。

さいごに

ちなみにVS Codeのプラグインを見てみると、cform-VSCodeも比較的多く使われているようです。 デプロイ前の確認に際しては、もちろんvalidate-templateも有用ですが、いくつかのツールで確認してから実行することで、より効率よく作業できると思われます。
どなたかに届けば幸いです。

参考文献

  1. Linterを使ってCloudFormationの間違いに爆速で気づく
  2. VimmerがCloudFormationを書くなら ale + cfn-python-lint が便利!
  3. Vim の 5 つのタブとスペース関連のややややこしいオプションをできるだけ簡単に解説するよ
  4. A new AWS CloudFormation linter – cfn-python-lint