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ライフを送っていきたいものです。
[関連記事]
参考
Input Variables - Configuration Language | Terraform by HashiCorp
substr - Functions - Configuration Language | Terraform by HashiCorp