Help us understand the problem. What is going on with this article?

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

yasuhiroki
CircleCI, GitHub Actions, Jenkins, Vim, Ruby, Ruby on Rails, ShellScript,
https://yasuhiroki.github.io
a10lab
三日坊主防止アプリ「みんチャレ」の運用会社エーテンラボ株式会社です
https://a10lab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away