
Terraform の validation を使ってみた
こんにちは!コンサルティング部のくろすけです!
今回は Terraform の variable
ブロックで使える validation(バリデーション)機能について、実際に使ってみた感想や注意点をまとめてみました。
Terraform を使っていて「この変数、変な値が入らないようにしたいな」と思ったことはありませんか?
そんなときに便利なのが validation
です。
validation とは?
Terraform では、variable
ブロックの中で validation
を使うことで、
変数に対して条件を設定し、間違った値が入らないように制限することができます。
Input Variables - Configuration Language | Terraform | HashiCorp Developer
実際に使ってみた
例として、ECRリポジトリに validation
を使ってみました。
name
と image_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.env}-reposit" {var.sys_name}-
│ 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.env}-reposit" {var.sys_name}-
│ 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
は、ちょっとした入力ミスを防ぐのにとても便利だと感じました。
初めに少し作り込みが必要かもしれませんが、その後のミスを防げるので個人的には積極的にモジュール開発に活用したいと考えています。