🐣

これから始める tflint

に公開1

tl;dr

  • これから tflint を始める人向け
  • 導入時の決め事について

tflint

  • terraform の構成ファイルのプラクティスにしたがって lint してくれるツール
  • こだわりどころによって揉める原因になる
  • IaC の一環として、PR 時にチェックするようにしたい
  • lint してねぇやついるぅ?いねぇよなぁ(イメージ略)

経緯

  • 基本的に構成ファイルを作成する時点でテンプレートを用いるため、それなりのコードを書く自信がある
  • もちろんそうではない人もいる
  • 前職ではそれほど必要じゃなかったし重要視していなかったので使っていなかった
  • 現職では元のコードを書いた人がいて tflint が実施されていたが、設定が肌にあわないのでできるだけ手直しすることにした
  • こういう理由でこうします、を明示的にしたかった

説明を省略すること

  • インストールはお好みでどうぞ。aqua が便利です
  • 成功時(エラー等がない時)は何も出力されないようにします

使用方法

# tflint は alias を作らない(pre-commitで処理するし明示的に処理する機会はそんなにない)

# バージョンの確認
tflint -v

# ヘルプ
tflint -h

# .tf ファイルのあるディレクトリで
tflint

設定ファイルの調整

# .tflint.hcl
config {
  format = "compact"
}

plugin "terraform" {
  enabled = true
  version = "0.13.0"
  source  = "github.com/terraform-linters/tflint-ruleset-terraform"
  # preset  = "recommended"  # default all
}

plugin "azurerm" {
  enabled = true
  version = "0.29.0"
  source  = "github.com/terraform-linters/tflint-ruleset-azurerm"
}
  • config block は出力を見やすくしたいので compact にしている(お好みで)
  • plugin "terraform" block は組み込みなので source や version を指定しなくても使えますが、明示的にしておきたいので指定
  • preset は常に all を使用する(recommended でお茶を濁さない)
  • その他の plugin (ここでは azurerm)は使用状況に応じて設定する
  • 処理自体はデフォルト設定ということ

実行

tflint -c .tflint.hcl
  • preset や plugin で enabled = false にするなどがない限り -c はなくても大丈夫

よくありそうな検討事項

  • エラーに対処する方法はいくつかある

    • 🙆‍♂️ おとなしくファイルを作るかコードを修正するか ignore する
    • 🙍‍♂️ 該当ディレクトリに別の設定を置いてよける
    • 🙅‍♂️ コマンドライン引数でルールを無効にする
  • 安易に個別に避けたりせず、すべての環境で統一した設定にしたがうのがよい

terraform_standard_module_structure

  • preset を all にしたままにすると、input variables や outputs がないルートディレクトリでもファイルがないよエラーを出してくる
  • 自作モジュールなどは問題ない(ファイルがあるのが正)が、ルートモジュールではそもそも input や output がない場合もある
  • 個人的にはコメントを書いた中身のないファイルでもあったほうがよいと考えている

main.tf, variables.tf, outputs.tf. These are the recommended filenames for a minimal module, even if they're empty. main.tf should be the primary entrypoint.
(main.tf、ariables.tf、outputs.tf はたとえ空であっても最小限のモジュールに推奨されるファイル名です。 main.tf は主要なエントリポイントである必要があります。)

required_version

  • terraform block に required_version を書いていないとエラーがでる
  • 2025 年 11 月現在なら >= 1.13.0 にしてしまうのがよい(これで問題がでるようならそのディレクトリの見直しをしたほうがよい)

terraform_typed_variables

  • input variable の type を書いてないとエラーがでる
  • terraform アンチパターン variable という記事を書いた
  • そもそも variables を使う必要があるかを検討する
  • variable を使うなら description や type くらい書いておくべき

pre-commit hook と task

- repo: https://github.com/antonbabenko/pre-commit-terraform
  rev: v1.103.0
  hooks:
    - id: terraform_tflint
      args:
        - --args=--config=__GIT_WORKING_DIR__/.tflint.hcl
  • task
tasks:
  lint:
    desc: Run tflint
    aliases:
      - l
      - lint
    vars:
      CONFIG_FILE: ".tflint.hcl"
      CONFIG_FILE_PATH: "{{relPath .USER_WORKING_DIR .TASKFILE_DIR}}/{{.CONFIG_FILE}}"
    cmds:
      - tflint -c {{.CONFIG_FILE_PATH}}
    dir: "{{.USER_WORKING_DIR}}"
    silent: false

追加のプラグイン(ルールセット)

主観

  • 書いておいてあれだけど tflint と Sentinel や OPA とかぶる部分についてどう考えるか整理できていない
  • 動くこと、丁寧であること、親切であること、統一されていること、などの優先順位や実務における時間的猶予、修正に対するアウトカムの考え方なども一概にこう、とは言い難い
  • やってないよりやってあるほうが前に進みやすい(だろう)と思っている
terraform-jp

Discussion