techblog

TFLintでTerraformを静的解析

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

TFLintでTerraformを静的解析

目次

  1. はじめに
  2. TFLintとは
  3. 前提事項
  4. 設定ファイルの解説(.tflint.hcl)
  5. TFLintの具体的な利用方法
  6. Terraformコード例
  7. TFLint静的検査結果
  8. まとめ

はじめに

普段、TerraformをVS Codeで利用する場合、Terraform公式拡張機能と合わせてリアルタイム構文チェックなどのエコシステムが利用可能です。

これらと合わせてチェックをより強化できるTFLintと呼ばれる静的検査ツールがあり、簡単に紹介できればと思っています。

TFLintとは

主要クラウドプロバイダー(AWS/Azure/GCP)に関する警告やエラーについて、Terraformコードを解析し、知らせてくれるフレームワークとなっており、各機能はプラグインによって提供される仕組みとなっているツールになっています。

廃止された構文や未使用変数、ベストプラクティスに沿ったルールセットが含まれています。

AWSのルールセットは、公式プラグイン「TFLint Ruleset for terraform-provider-aws」として提供されています。

実際の設定ファイルやチェックした結果を紹介します。

前提事項

設定ファイルの解説(.tflint.hcl)

項目設定値
enabledTFLintを有効にするか否かを 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のキーペア名)の不整合や、未使用変数のような保守性を下げる記述を早い段階で洗い出せることを確認しました。