Docker 運用の Terraform に TFLint を導入する

エキサイト株式会社の@mthiroshiです。

運用している Terraform に TFLint を導入してみましたので、設定の方法や lint ルールの一例について紹介します。

TFLint とは

TFLint は、Terraform の lintです。 github.com

HashiCorp 非公式のサードパーティツールですが、Terraform の公式 Style Guide の中で紹介されています。 developer.hashicorp.com

Use a linter such as TFLint to enforce your organization's own coding best practices.

TFLint の設定

運用中の Terraform プロジェクトは、Docker で Terraform を実行していました。 TFLint の導入も Docker で行いました。

Docker の設定

まず、compose.yaml を説明します。

services:
  terraform:
    image: hashicorp/terraform:1.7.5
    volumes:
      - .:/terraform-demo
    working_dir: /terraform-demo
    entrypoint: ["/bin/ash"]
    tty: true

  tflint:
    image: ghcr.io/terraform-linters/tflint
    volumes:
      - .:/terraform-demo
    working_dir: /terraform-demo
    entrypoint: ["/bin/sh"]
    tty: true

ディレクトterraform-demo/ 以下で Terraform コードを管理します。 Terraform を実行する際は、下記のコマンドで Docker 環境にログインします。

docker compose up -d terraform
docker compose exec terraform /bin/ash

TFLint の設定

続いて、TFLint を実行するために .tflint.hcl に設定を記述していきます。 公式の設定を参考にしています。

github.com

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

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

AWS を使っているプロジェクトなので、AWS 用のプラグインを有効にします。

TFLint を実行する

下記で TFLint を実行します。

docker compose run --rm tflint -c "\
    tflint --init;\
    tflint --recursive;\
"

実行結果の例です。

docker compose run --rm tflint -c "\
                tflint --init;\
                tflint --recursive;\
        "
Installing "aws" plugin...
Installed "aws" (source: github.com/terraform-linters/tflint-ruleset-aws, version: 0.31.0)

....

Warning: Missing version constraint for provider "aws" in `required_providers` (terraform_required_providers)

  on main.tf line 107:
 107: resource "aws_route53_record" "record" {

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

terraform_required_providers のルールについて警告されました。 このルールは、Provider にはバージョンを必須で指定することを求めています。 内容の詳細は、表示されたリンクから確認できます。

次に、--fix オプションをつけて実行します。 --fix オプションでは、いくつかのルールを自動で修正してくれます。

docker compose run --rm tflint -c "\
    tflint --init;\
    tflint --recursive --fix;\
"

--fix オプションで適用されたルールの例です。

  • terraform_deprecated_index
  • terraform_unused_declarations

terraform_deprecated_index のルールは、配列参照のレガシーな記法を指摘するものです。 --fix オプションでは、自動で角括弧の記法に修正します。

github.com

terraform_unused_declarations のルールは、使用されていない変数の宣言を指摘するものです。 --fix オプションでは、自動で変数の宣言を削除します。

github.com

注意点として、自動修正の内容によっては構文エラーが起きます。 例えば、 terraform_unused_declarations の場合、module で定義していた使われていない引数が削除されることがあります。module を参照していた側では、削除された引数を残したままになるため、構文エラーになります。 自動適用後の terraform plan の確認を行いましょう。

最後に

Docker 運用の Terraform プロジェクトに対する TFLint の設定と lint ルールの一例を紹介しました。 運用中のコードに対して lint を実行すると、様々な警告が指摘されると思います。 修正によってはエラーが起きていることがあるので、確認をしながら修正しましょう。

参考になれば幸いです。

採用アナウンス

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

募集職種一覧はこちらになります!(カジュアル面談もぜひ!) www.wantedly.com