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_check
をtrue
にすると構文上の静的チェックだけでなく、実際に設定されている値が正しいかどうかのチェックも行なう。
追加したら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_check
をtrue
に設定時、tflintコマンド実行時に以下のエラーが発生する場合はAWSの認証設定を行なう必要がある。
~/.aws/credential
を設定したうえで環境変数AWS_PROFILE
を指定したり、環境変数AWS_ACCESS_KEY_ID
・AWS_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.hcl
にrule
ブロックを記述して除外設定ができる。
上記の例では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_check
がtrue
になっている場合は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