问题描述
在使用Terraform时,遇到了一个关于验证复杂类型地图对象的问题。他定义了一个名为ecs_config_map
的变量,它是一个地图(Map)对象,包含多个子对象,每个子对象具有不同的属性(例如:cpu
、memory
、desired
、capabilities
、launch_type
等)。用户希望对这个变量进行基本验证,以确保其中的launch_type
属性值仅允许是预定义的一组值(”EC2″、”FARGATE”、”EXTERNAL”)之一。用户尝试了一些验证方法,但遇到了语法问题和错误提示。
解决方案
请注意以下操作可能存在版本差异,请在实际操作前先进行备份。
用户的问题在于对复杂类型地图对象进行验证,特别是在验证子对象中的launch_type
属性值时。为了实现这个目标,我们可以使用Terraform的一些内置函数和表达式。下面是解决方案的步骤:
- 提取
launch_type
值:首先,我们需要从ecs_config_map
中提取所有子对象的launch_type
属性值,以便后续的验证。我们可以使用for
表达式来提取这些值。 - 验证
launch_type
值:一旦提取了launch_type
值,我们需要验证这些值是否都在预定义的允许值列表(”EC2″、”FARGATE”、”EXTERNAL”)中。我们可以使用contains
函数来进行验证。 - 输出错误信息:如果有任何一个
launch_type
的值不在允许值列表中,我们需要输出相应的错误信息。
以下是使用Terraform的验证表达式来实现上述步骤的解决方案:
variable "ecs_config_map" {
type = map(object({
cpu = number
memory = number
desired = number
capabilities = list(string)
launch_type = string
}))
}
# 验证 launch_type
validation {
condition = length([for launch_type in values(var.ecs_config_map)[*].launch_type : launch_type if !contains(["EC2", "FARGATE", "EXTERNAL"], launch_type)]) <= 0
error_message = "Only EC2, FARGATE, EXTERNAL are allowed values for launch_type."
}
以上解决方案使用了for
表达式来提取launch_type
值,然后使用contains
函数来验证这些值是否在允许的值列表中。如果存在不在允许值列表中的launch_type
值,就会输出错误信息。
这个解决方案将帮助用户实现对复杂类型地图对象中launch_type
属性的验证需求,确保只有指定的值被允许。
正文完