Terraform の validation を使ってみた

Terraform の validation を使ってみた

Clock Icon2025.04.30

こんにちは!コンサルティング部のくろすけです!

今回は Terraform の variable ブロックで使える validation(バリデーション)機能について、実際に使ってみた感想や注意点をまとめてみました。

Terraform を使っていて「この変数、変な値が入らないようにしたいな」と思ったことはありませんか?
そんなときに便利なのが validation です。

validation とは?

Terraform では、variable ブロックの中で validation を使うことで、
変数に対して条件を設定し、間違った値が入らないように制限することができます。

Input Variables - Configuration Language | Terraform | HashiCorp Developer

実際に使ってみた

例として、ECRリポジトリに validation を使ってみました。
nameimage_tag_mutability に、下記の validation を設定しました。

  • name: 命名規則にマッチした入力のみに制限
  • image_tag_mutability: 入力を IMMUTABLE に制限
variable "ecr_repository" {
  description = "The ECR repository configuration"
  type = object({
    # Required
    name = string

    # Optional settings
    encryption_configuration = optional(object({
      encryption_type = optional(string)
      kms_key         = optional(string)
    }))
    force_delete         = optional(bool, true)
    image_tag_mutability = optional(string, "IMMUTABLE")
    image_scanning_configuration = optional(object({
      scan_on_push = bool
    }))
    tags = optional(map(string))
  })

  validation {
    condition     = can(regex("^[a-z0-9-_]+-(prd|stg|dev|pvt[1-9][0-9]{0,2})-repository$", var.ecr_repository.name))
    error_message = "The ECR repository name must follow the pattern: {sys_name}-{env}-repository. The env must be one of prd, stg, dev, or pvt[1-9][0-9]{0,2}."
  }

  validation {
    condition     = var.ecr_repository.image_tag_mutability == null || var.ecr_repository.image_tag_mutability == "IMMUTABLE"
    error_message = "The image_tag_mutability value must be \"IMMUTABLE\" only."
  }
}

実際に terraform plan を実行して、許可されていない値を指定すると、それぞれ次のようなエラーメッセージが表示されます。

│ Error: Invalid value for variable

│ on main.tf line 3, in module "lambda":
│ 3: ecr_repository = {
│ 4: name = "{var.sys_name}-{var.env}-reposit"
│ 5: description = "ECR repository for ${var.sys_name} in ${var.env}"
│ 6: }
│ ├────────────────
│ │ var.ecr_repository.name is "template-lambda-pvt1-reposit"

│ The ECR repository name must follow the pattern: {sys_name}-{env}-repository. The env must
│ be one of prd, stg, dev, or pvt[1-9][0-9]{0,2}.

│ This was checked by the validation rule at ../../../modules/lambda/variables.tf:23,3-13.

│ Error: Invalid value for variable

│ on main.tf line 3, in module "lambda":
│ 3: ecr_repository = {
│ 4: name = "{var.sys_name}-{var.env}-reposit"
│ 5: description = "ECR repository for ${var.sys_name} in ${var.env}"
│ 6: image_tag_mutability = "MUTABLE"
│ 7: }
│ ├────────────────
│ │ var.ecr_repository.image_tag_mutability is "MUTABLE"

│ The image_tag_mutability value must be "IMMUTABLE" only.

│ This was checked by the validation rule at ../../../modules/lambda/variables.tf:28,3-13.

注意点

validation の中では、他の変数の値を参照することができません
たとえば、bucket_name の先頭が env 変数の値と一致するかどうかをチェックしたい場合でも、それはできません。
ただし、変数ではなく正規表現を使用して値のチェックをすることは可能です。

ユースケース

以下のようなケースで validation は有効かなと思いました。

  • 組織固有の理由で値を制限したい場合:リソースの命名規則やリージョンの制限など
  • モジュール固有の理由で値を制限したい場合:コンテナイメージ専用のLambdaモジュールやインスタンスタイプの制限など
  • 特定の入力に対して、terraform plan 実行時に必ずエラー出力したい場合
    resource 側で入力制限がある場合でも、パラメータによっては terraform plan ではエラー検出されない場合があります。
    よって、大規模な開発において、特に terraform plan 実行時に入力値チェックを必ずヒットさせたいなどの場合は有効かもしれません。
    ただし、validation を増やすと管理が煩雑なってくるため、無闇に validation を増やすのはおすすめしません。

あとがき

Terraform の validation は、ちょっとした入力ミスを防ぐのにとても便利だと感じました。
初めに少し作り込みが必要かもしれませんが、その後のミスを防げるので個人的には積極的にモジュール開発に活用したいと考えています。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.