0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Tips】TFLintのチェックをGit hooksで自動化するときのプラクティス

Last updated at Posted at 2022-12-11

問題点

TFLintのチェックはたしかに強力だが、以下のようなコードでは意図した検査をしてくれないことがある。

サンプル1: 三項演算子で通らないルート
locals {
  lambda_function_dev_name = "${var.prefix}-dev-function"
  lambda_function_prd_name = ""
}

resource "aws_lambda_function" "example" {
  function_name = var.environment == "dev" ? local.lambda_function_dev_name : local.lambda_function_prd_name
  filename      = data.archive_file.example.output_path
  # (以下略)
}
サンプル2: count = 0 になって通らないルート
resource "aws_lambda_function" "example" {
  count = var.environment == "dev" ? 0 : 1

  function_name = ""
  filename      = data.archive_file.example.output_path
  # (以下略)
}

いずれのケースでも、

tflint --var=environment=dev

としてもエラーにはならず、--var=environment=prdの場合のみエラーとなる

tflint --var=environment=prd
4 issue(s) found:

Error: "" does not match valid pattern ^(arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}(-gov)?-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?$ (aws_lambda_function_invalid_function_name)

  on 13_lambda.tf line 15:
  15:   function_name    = var.environment == "dev" ? local.lambda_function_dev_name : local.lambda_function_prd_name

Error: function_name must be 1 characters or higher (aws_lambda_function_invalid_function_name)

  on 13_lambda.tf line 15:
  15:   function_name    = var.environment == "dev" ? local.lambda_function_dev_name : local.lambda_function_prd_name

Error: "" does not match valid pattern ^[\.\-_/#A-Za-z0-9]+$ (aws_cloudwatch_log_group_invalid_name)

  on 13_lambda.tf line 84:
  84:   name              = ""

Error: name must be 1 characters or higher (aws_cloudwatch_log_group_invalid_name)

  on 13_lambda.tf line 84:
  84:   name              = ""

prdにマージしたときや、prdのパイプラインでTFLintを回せばエラーを検知できるだろうが、prdに行こうとした時点でエラーになる時点で、その日にやろうとしていたプロダクション環境の作業が予定通りに進まないだろう。

解決策

解決策はシンプルで、結局、Git hookのpre-commitで以下のようにして全ルートを通した時のみCommit可とすべきだろう。
チームで変数利用におけるルールをちゃんと定義して、シンプルに全ルートを通せるようにしておくのが重要だろう(分岐のパターンが増えれば増えるほど検査に必要な数が増える)

.git/hooks/pre-commit
#!/bin/sh

CMD="tflint --var=environment=dev"
echo ${CMD}
${CMD} || exit 1

CMD="tflint --var=environment=prd"
echo ${CMD}
${CMD} || exit 1

exit 0

なお、.git/hooksディレクトリ配下はremoteにpushされないため、作ったスクリプトは、リポジトリ上に配置して以下のコンフィグを入れておこう。--global しない情報は各リポジトリ単位で管理されるので、チームで共有する場合はチェックアウト時に忘れないようにしてもらおう。
※以下の例では、リポジトリのルートディレクトリ配下に.githooks/pre-commitを配置している前提とする

git config core.hooksPath .githooks
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?