BETA

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

投稿日:2018-11-16
最終更新:2018-11-16
※この記事は外部サイト(https://qiita.com/yasuhiroki/items/f4a2871...)からのクロス投稿です

Vimmer ですか? AWS CloudFormation を書いてますか? では alecfn-python-lint を使いましょう

どう便利なの?

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

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

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

[^2]: コマンド名も cfn-lint なのだけど Node.js製の 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 を使えるようにしたのは私です ちなみにその直後、 cfn-python-lint を最新版にすると動かないからと修正されました

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@yasuhirokiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!