LoginSignup
22
7

More than 5 years have passed since last update.

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

Posted at

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 と被せたのはわざとなのかどうなのか... 

22
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
7