TFLintでTerraformを静的解析
TFLintでTerraformコードをVS Codeから静的解析。AWS公式ルールセットとdeep check設定、tflint –init/–recursiveの使い方、未使用変数や無効キー名の検出例でIaC品質を高める方法を紹介。

目次
はじめに
普段、TerraformをVS Codeで利用する場合、Terraform公式拡張機能と合わせてリアルタイム構文チェックなどのエコシステムが利用可能です。
これらと合わせてチェックをより強化できるTFLintと呼ばれる静的検査ツールがあり、簡単に紹介できればと思っています。
TFLintとは
主要クラウドプロバイダー(AWS/Azure/GCP)に関する警告やエラーについて、Terraformコードを解析し、知らせてくれるフレームワークとなっており、各機能はプラグインによって提供される仕組みとなっているツールになっています。
廃止された構文や未使用変数、ベストプラクティスに沿ったルールセットが含まれています。
AWSのルールセットは、公式プラグイン「TFLint Ruleset for terraform-provider-aws」として提供されています。
実際の設定ファイルやチェックした結果を紹介します。
前提事項
- TFLintインストール方法については、次を参照してください。
- Terraformの基礎的な知識については解説しません。
設定ファイルの解説(.tflint.hcl)
| 項目 | 設定値 |
|---|---|
| enabled | TFLintを有効にするか否かを true / false で指定します。 |
| deep_check | より踏み込んだ解析(deep check)にするか否かを true / false で指定します。 |
| version | 利用するルールセットプラグインのバージョンを指定します。 AWSであれば、基本的に https://github.com/terraform-linters/tflint-ruleset-aws/releases/latest に出てくるバージョン指定で問題ありません。 |
| source | プラグインの取得元を指定します。AWSの場合、公式のtflint-ruleset-awsリポジトリを指定します。 |
以下は、設定例になります。
deep_checkを有効にする場合、AWSであれば読み取り権限が必要になります。
plugin "aws" {
enabled = true
deep_check = true
version = "0.45.0"
source = "github.com/terraform-linters/tflint-ruleset-aws"
}
TFLintの具体的な利用方法
tflintの基本的なコマンドは次の通りです。
詳細なコマンドは、GitHub公式を参照するようにしてください。
- 初期化
- tflint —initコマンドでプラグインのダウンロードが実行されます。
- 静的検査
- tflintコマンドでカレントディレクトリに対して静的検査が可能です。
- tflint —recursiveコマンドで再帰的に静的検査が可能です。
Terraformコード例
以下に示す例は、EC2インスタンス作成(AWS_instance)と、未指定を許容する任意入力変数(default = nullのvariable)の書き方をまとめて示したサンプルです。
resource "aws_instance" "example" {
ami = "ami-03d1820163e6b9f5d"
instance_type = "t3.micro"
key_name = "example-key-pair"
}
variable "scheduler_rds_identifier" {
type = string
description = "example"
default = null
}
TFLint静的検査結果
TFLintの実行結果では、EC2のkey_nameに指定したキーペア名が実在しない(または一致しない)ためエラーになっている点と、宣言したscheduler_rds_identifier変数がどこからも参照されておらず未使用として警告になっている点が確認できました。
tflint --recursive
6 issue(s) found:
Error: "example-key-pair" is invalid key name. (aws_instance_invalid_key_name)
on bastion.tf line 10:
10: key_name = "example-key-pair"
Warning: [Fixable] variable "scheduler_rds_identifier" is declared but not used (terraform_unused_declarations)
on main.tf line 147:
147: variable "scheduler_rds_identifier" {
Reference: https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.13.0/docs/rules/terraform_unused_declarations.md
また、どのようなルールセットが入っており、deep_checkで検査される項目の記載が以下、GitHubにございますので興味がある方は参照してください。
https://github.com/terraform-linters/tflint-ruleset-aws/blob/master/docs/rules/README.md
まとめ
TFLintを使ってTerraformコードを静的に検査し、環境依存値(例:EC2のキーペア名)の不整合や、未使用変数のような保守性を下げる記述を早い段階で洗い出せることを確認しました。