🐇

tflint の仕様や使い方についてのメモ

2023/10/30に公開

これは何?

Terraform の lint ツールである tflint について、いろいろ調べたりした結果をまとめたメモ。(2023/6時点)

tflint とは

Terraform のコードの書き方を、設定したルールに沿っているかチェックしてくれるツール。
例えばTerraformを動かすのに必要な要素が足りているかどうかや、宣言したけど使ってない変数がないかとか、パラメータとして無効な値が渡されていないか、など。

具体的に何を、どうチェックしてくれるのか

デフォルトの機能としてはTerraformの観点からコードをチェックする機能がある。
追加機能として、

  • AWS 観点でTerraformのコードに問題がないか
  • Azure 観点でTerraformのコードに問題がないか
  • GCP 観点でTerraformのコードに問題がないか

をチェックできるプラグインが用意されている。

プラグインにはコードをチェックのためにルールセットと呼ばれるものが存在する。複数のルールを集めたものであり、そこに含まれるルールに沿ってコードをチェックをしてくれる。
プラグインを使う = ルールセットを使うなので、プラグイン ≒ ルールセットと捉えて差し支えないと思う。

ルールセットに含まれる個別のルールは有効 / 無効 を設定できるので、自身の環境では
ルールは自作することも出来るが今回は触れない。

どのように使用するのか

公式のgithubにインストール方法は記載されているように、
提供されているインストールスクリプトを使用するか、
Dockerイメージが配布されているのでそちらを使用するか、がある。
https://github.com/terraform-linters/tflint#installation

または、リリースページに行けばOSに合わせたzip形式のファイルが配布されているので、そちらを使用するでもよい。(https://github.com/terraform-linters/tflint/releases)

後ほど記載するかもしれないが、CIに組み込むときは、こちらのzipをダウンロードして使う処理を使うこともあるかもしれない。

設定はどこでするのか。

.tflint.hcl というファイルを用意し、そこに設定を書き込んでいく。
https://github.com/terraform-linters/tflint/blob/master/docs/user-guide/config.md

先ほど記載したプラグインの設定もここに記載する。

プラグインの設定について

tflintの核となるプラグインの設定について記載する。
.tflint.hcl ファイル内に、pluginブロックを用意し、

plugin "foo" {
  enabled = true
  version = "0.1.0"
  source  = "github.com/org/tflint-ruleset-foo"

のように、

  • 有効にするかどうか
  • version
  • ルールセットをどこから持ってくるか

を記述するとそのプラグインとルールセットが使えるようになる。
https://github.com/terraform-linters/tflint/blob/master/docs/user-guide/plugins.md#configuring-plugins

After declaring the version and source, tflint --init can automatically install the plugin.

とあるように、プラグインの設定を追加、変更した際には、tflint --init で初期化をする必要がある。基本的にはinitを実行したディレクトリにある.tflint.hclを読み込むが、tflint --init --config=/path/to/file で明示的にどのファイルを読み込ませるか指定することもできる。
https://github.com/terraform-linters/tflint#usage

上記基本設定はどのプラグインでも共通して設定するものだが、プラグインによっては固有のオプション的な設定項目があるので、詳細は各プラグイン(ルールセット)のリポジトリにあるドキュメントを参照するほうが良い。

Terraformプラグイン

【リポジトリTop】https://github.com/terraform-linters/tflint-ruleset-terraform/tree/v0.2.0

https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.2.0/docs/configuration.md

AWSプラグイン

【リポジトリTop】https://github.com/terraform-linters/tflint-ruleset-aws

https://github.com/terraform-linters/tflint-ruleset-aws/blob/master/docs/configuration.md

Azureプラグイン

【リポジトリTop】https://github.com/terraform-linters/tflint-ruleset-azurerm

GCPプラグイン

【リポジトリTop】https://github.com/terraform-linters/tflint-ruleset-google

https://github.com/terraform-linters/tflint-ruleset-google/blob/master/docs/configuration.md

※ Azureだけconfiguration.mdがなかった。(2023/6/10 時点)

注1.

なお、Terraformのプラグインおよびルールセットは標準で既にセットされており、明示的に.tflint.hclファイルにpluginブロックを記載してインストールしなくても使用は可能だが、プラグインに対する設定をしていきたい場合は結局のところ記載する必要がある。
https://github.com/terraform-linters/tflint/blob/master/docs/user-guide/plugins.md#bundled-plugin

注2.

tflintを使用するにはDockerイメージもあると記載したが、Dockerイメージにも2種類ある。

バンドル版については、aws, azure, gcp用追加プラグインが既にインストールされている状態なので、pluginブロックにversionやsourceを記載する必要はなく、
enabled = true のパラメータを.tflint.hclに記載するだけでよい。
https://github.com/terraform-linters/tflint-bundle/pkgs/container/tflint-bundle#tflint-bundle

ただし、tflint --init をしないと追加プラグインは有効にならない(と思われる)ため、使用する際はtflint --init を忘れないこと。init をしないと標準のTerraformプラグインだけが有効な状態で使用することになる(はず)。

Docker版のtflintにどうやって.tflint.hclファイルを読み込ませるかについては、公式の手順でdocker run をするときに、コンテナにホスト側のパスをマウントしているので、そのホスト側のパスに.tflint.hclファイルを置いておけばよい。
https://github.com/terraform-linters/tflint#docker

他の主な設定について

追記するかも?

--module オプションについて

tflint には --module というオプションがある。
https://github.com/terraform-linters/tflint/blob/master/docs/user-guide/config.md#module

これはモジュールの中身をチェックする機能ではなく、
下記のような呼び出し元のmodule ブロックに対してチェックを行う機能となる。

module "xxxxx" { 
   xxxxx = yyyyy
   ...

https://github.com/terraform-linters/tflint/blob/master/docs/user-guide/module-inspection.md

モジュールの中身に対して再帰的にコードチェックする機能ではないので注意。

モジュールそのものをチェックしたいのであれば、tflint実行時に--chdir= オプションでチェック対象のディレクトリを指定するか、対象のディレクトリ配下でtflintを実行する必要がある。

Terraform プラグインの preset について

Terraform プラグインの設定の中に「preset」という項目がある。設定できる値としては、

  • all
  • recommended

の2種類があるが、これはルールセットのall=すべてのルールを使うのか、recommended=おススメのルールを厳選して使うのか、という分かれ方をする。

Terraformプラグイン(ルールセット)にどんなルールがあって、どのルールがrecommended扱いなのかは、Terraformプラグインのrulesのページに記載されている。
https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.2.0/docs/rules/README.md

presetのデフォルトの設定は、

  • 標準で元から組み込まれているTerraformプラグインを使用し、pluginブロックを.tflint.hclに記載していない場合はrecommended
  • pluginブロックを.tflint.hclに記載し、presetパラメータを設定していない場合はall
    となると思われる。

【引用】

Default: all (recommended for the bundled plugin)

https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.2.0/docs/configuration.md#preset

Discussion