TFLintとは

TFLintはTerraformのコード(.hcl)をチェックするためのフレームワークを提供する。
実際のチェックルールはプラグインとして提供されている。
AWS用、Azure用、GCP用のように必要なプラグインを導入して利用する。

TFLintの使い方

TFLintのインストール

Macの場合はHomebrewでインストールできる。

$ brew install tflint

Linuxの場合はインストールスクリプトが用意されているのでそれを実行する。

$ curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash

TFLintの設定

.tflint.hclを作成し設定を記述する。
まずはTFLintにデフォルトで同梱されているterraformプラグインを利用して設定してみる。

plugin "terraform" {
  enabled = true
  preset  = "recommended"
}

設定を変更したらtflint --initコマンドを実行しておくと必要なプラグインのインストールなどが実行される。

TFLintの実行

tflintコマンドにチェックしたいTerraformコードのディレクトリで以下のように実行する。

$ tflint --recursive

--recursiveオプションをつけるとサブディレクトリも再帰的にチェックする。
カレントディレクトリ以下にのみ.hclファイルがある場合はつけなくても良い。

TFLintの結果

tflintを実行した結果、違反が検出された場合は以下のような結果が表示される。

1 issue(s) found:

Warning: [Fixable] variable "env" is declared but not used (terraform_unused_declarations)

  on ec2.tf line 1:
   1: variable "env" {

Reference: https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.4.0/docs/rules/terraform_unused_declarations.md

その時の終了ステータスコードは0以外の値となる。

$ echo $?
2

違反を修正し、検出されない場合の終了ステータスコードは0となる。

$ tflint --recursive
$ echo $?
0

AWS用のプラグインの利用

AWS用のルールを導入するには.tflint.hclに以下の記述を追加する。
≫ tflint-ruleset-aws

plugin "aws" {
  enabled = true
  deep_check = true
  version = "0.27.0"
  source  = "github.com/terraform-linters/tflint-ruleset-aws"
}

deep_checktrueにすると構文上の静的チェックだけでなく、実際に設定されている値が正しいかどうかのチェックも行なう。

追加したらtflint --initコマンドを実行しておくと必要なプラグインのインストールなどが実行される。

$ tflint --init
Installing `aws` plugin...
Installed `aws` (source: github.com/terraform-linters/tflint-ruleset-aws, version: 0.27.0)

tflintコマンドを実行するとAWS用のルールもチェックされるようになる。

$ tflint --recursive
1 issue(s) found:

Error: "t3.lerge" is an invalid value as instance_type (aws_instance_invalid_type)

  on ec2.tf line 11:
  11:   instance_type = "t3.lerge"

$ echo $?
2

上記はt3.largeを書くべきところをスペルミスでt3.lergeとしてしまっているために違反となっている。
修正すると違反なしで成功するようになる。

$ tflint --recursive
$ echo $?
0

deep_checktrueに設定時、tflintコマンド実行時に以下のエラーが発生する場合はAWSの認証設定を行なう必要がある。 ~/.aws/credentialを設定したうえで環境変数AWS_PROFILEを指定したり、環境変数AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを指定する。
設定する権限は、チェック対象のリソースを取得する権限を持つIAMロールを設定する必要がある。

$ tflint --recursive
Failed to check ruleset; no valid credential sources for tflint-ruleset-aws found.

Please see https://github.com/terraform-linters/tflint-ruleset-aws/blob/master/docs/deep_checking.md
for more information about providing credentials.

Error: NoCredentialProviders: no valid providers in chain
caused by: EnvAccessKeyNotFound: failed to find credentials in the environment.
SharedCredsLoad: failed to load profile, .
EC2RoleRequestError: no EC2 instance role found
caused by: RequestError: send request failed
caused by: Get "http://169.254.169.254/latest/meta-data/iam/security-credentials/": dial tcp 169.254.169.254:80: connect: host is down

除外設定

.tflint.hclruleブロックを記述して除外設定ができる。

上記の例ではaws_instance_invalid_typeのルールに違反していたので除外する設定を追加してみる。

plugin "aws" {
  enabled = true
  deep_check = true
  version = "0.27.0"
  source  = "github.com/terraform-linters/tflint-ruleset-aws"
}

rule "aws_instance_invalid_type" {
  enabled = false
}

再度tflintコマンドを実行すると検出されなくなる。

$ tflint --recursive
$ echo $?
0

設定ファイル(.tflint.hcl)の場所の指定(–config,-cオプション)

デフォルトではカレントディレクトリに.tflint.hclがある場合はそれを設定ファイルとして読み込む。
別の場所にある場合は--configオプション(-cオプション)で指定する。

$ tflint -c /path/to/.tflint.hcl

GitHub ActionsでTFLintを実行する

GitHub ActionsでTFLintを使えるようにするには terraform-linters/setup-tflint を利用する。terraform-linters/setup-tflintを利用するとTFLintをインストールし、後続処理でtflintコマンドが使えるようになる。

name: TFLint

on:
  pull_request:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # リポジトリをチェックアウト
    - uses: actions/checkout@v4
    # TFLintのインストール
    - name: Setup TFLint
      uses: terraform-linters/setup-tflint@v4
      with:
        tflint_version: v0.44.1
    # TFLintのプラグインのインストール
    - name: Init TFLint
      run: tflint --init
    # TFLintの実行
    - name: Run TFLint
      run: tflint --recursive -c $(pwd)/.tflint.hcl

AWS用のプラグイン有効時、deep_checktrueになっている場合はAWSの認証情報を設定する必要がある。
OIDCが設定され、利用できる場合は以下のようになる。

name: TFLint

on:
  pull_request:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # リポジトリをチェックアウト
    - uses: actions/checkout@v4
    # OIDCでAWS認証
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v4
      with:
        role-to-assume: arn:aws:iam::109650431995:role/github_actions_oidc_cbee_infra
        aws-region: ap-northeast-1
    # TFLintのインストール
    - name: Setup TFLint
      uses: terraform-linters/setup-tflint@v4
      with:
        tflint_version: v0.44.1
    # TFLintのプラグインのインストール
    - name: Init TFLint
      run: tflint --init
    # TFLintの実行
    - name: Run TFLint
      run: tflint --recursive -c $(pwd)/.tflint.hcl