BioErrorLog Tech Blog

試行錯誤の記録

Terraformのvariableで特定パターンを強制/validateする

Terraformのmodule variableで、特定パターン・条件を強制/validateする方法を整理します。

はじめに

こんにちは、@bioerrorlogです。

Terraformコードを適切な粒度のmoduleで実装するのは、保守性や再利用性の面でも重要なことでしょう。

これらTerraform moduleはvariablesを通じてmodule外部から引数を渡せますが、このvariablesにデータ型だけでなく特定のパターンを強制したくなるときがあります。

今回はそのやり方を備忘録に整理します。

# 作業環境
$ terraform --version
Terraform v1.1.9

Terraformのvariableで特定パターンを強制する

やり方

validationを使って、variablesにパターン/条件を強制することができます。

variable "validation_example" {
  type        = string
  description = "A simple example of the module variable validation."

  validation {
    condition     = length(var.validation_example) > 5
    error_message = "The validation_example value length must be > 5."
  }
}

validation句のconditionで引数に要求するパターン/条件を、error_messageでエラー時に出力するメッセージを指定します。

エラー時の出力例:

$ terraform validate
╷
│ Error: Invalid value for variable
│ 
│   on main.tf line 5, in module "child":
│    5:   validation_example = "123"
│ 
│ The validation_example value length must be > 5.
│ 
│ This was checked by the validation rule at modules/child/variables.tf:15,3-13.

活用例: AMI ID

まずはドキュメントに記載の例: AMI (Amazon Machine Images) IDをvariableに引き受ける際の実装例を紹介します。

variable "image_id" {
  type        = string
  description = "The id of the machine image (AMI) to use for the server."

  validation {
    condition     = length(var.image_id) > 4 && substr(var.image_id, 0, 4) == "ami-"
    error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"."
  }
}

このコードにより、

  • length(var.image_id) > 4: 引数が4文字以上であること
  • substr(var.image_id, 0, 4) == "ami-": 引数の冒頭4文字がami-であること

を保証できます。

活用例: S3 URI

つぎはS3 URIをvariableに引き受ける際の実装例を紹介します。

variable "s3_uri" {
  type        = string
  description = "S3 URI to use for something."

  validation {
    condition     = length(var.s3_uri) > 5 && substr(var.s3_uri, 0, 5) == "s3://" && substr(var.s3_uri, -1, -1) == "/"
    error_message = "The s3_uri value length must be starting with \"s3://\" and end with \"/\"."
  }
}

この実装例では、

  • length(var.s3_uri) > 5: 引数が5文字以上であること
  • substr(var.s3_uri, 0, 5) == "s3://": 引数の冒頭5文字がs3://であること
  • substr(var.s3_uri, -1, -1) == "/": 引数の最後の1文字が/であること

を保証しています。

※ 上記は実装例として "引数の最後の1文字が/であること" を強制していますが、S3 URI全般としては別にそうである必然性はないことには注意してください。

おわりに

以上、Terraformのmodule variableで特定パターンを強制する方法をメモしました。

Terraformには表現の豊かな機能が結構用意されているので、脳内の手札を増やしてより良いTerraformライフを送っていきたいものです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Input Variables - Configuration Language | Terraform by HashiCorp

substr - Functions - Configuration Language | Terraform by HashiCorp

Modules - Configuration Language | Terraform by HashiCorp