問題点
TFLintのチェックはたしかに強力だが、以下のようなコードでは意図した検査をしてくれないことがある。
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
# (以下略)
}
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可とすべきだろう。
チームで変数利用におけるルールをちゃんと定義して、シンプルに全ルートを通せるようにしておくのが重要だろう(分岐のパターンが増えれば増えるほど検査に必要な数が増える)
#!/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