## Custom Validation Rules In addition to Type Constraints, you can specify arbitrary custom validation rules for a particular variable using one or more `validation` block nested within the corresponding `variable` block: ```hcl 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-\"." } } ``` The `condition` argument is an expression that must use the value of the variable to return `true` if the value is valid or `false` if it is invalid. The expression can refer only to the variable that the condition applies to, and _must not_ produce errors. If the failure of an expression is the basis of the validation decision, use [the `can` function](/docs/templates/hcl_templates/functions/conversion/can) to detect such errors. For example: ```hcl variable "image_id" { type = string description = "The id of the machine image (AMI) to use for the server." validation { # regex(...) fails if it cannot find a match condition = can(regex("^ami-", var.image_id)) error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"." } } ``` If `condition` evaluates to `false`, an error message including the sentences given in `error_message` will be produced. The error message string should be at least one full sentence explaining the constraint that failed, using a sentence structure similar to the above examples. Validation also works with more complex cases: ```hcl variable "image_metadata" { default = { key: "value", something: { foo: "bar", } } validation { condition = length(var.image_metadata.key) > 4 error_message = "The image_metadata.key field must be more than 4 runes." } validation { condition = can(var.image_metadata.something.foo) error_message = "The image_metadata.something.foo field must exist." } validation { condition = substr(var.image_metadata.something.foo, 0, 3) == "bar" error_message = "The image_metadata.something.foo field must start with \"bar\"." } } ```