我试图验证输入如下的对象的映射:
variable "ecs_config_map" {
type = map(object({
cpu = number
memory = number
desired = number
capabilities = list(string)
launch_type = string
}))
}变量的值如下所示:
ecs_config_map = {
driver = {
cpu = 256
memory = 512
desired = 0
capabilities = ["FARGATE"]
launch_type = "FARGATE"
}
aggregator = {
cpu = 256
memory = 512
desired = 0
capabilities = ["FARGATE"]
launch_type = "FARGATE"
}
}现在,我想执行一些基本的验证,但我似乎无法正确地理解语法。
validation {
condition = contains(["EC2", "FARGATE", "EXTERNAL"], var.ecs_config_map[*]["launch_type"])
error_message = "Only EC2, FARGATE, EXTERNAL are allowed values for launch_type."
}这把Invalid value for "list" parameter: list of bool required.扔了
在terraform console上调试描述了:
> type(var.ecs_config_map)
map(
object({
capabilities: list(string),
cpu: number,
desired: number,
launch_type: string,
memory: number,
}),
)
> type(var.ecs_config_map["driver"])
object({
capabilities: list(string),
cpu: number,
desired: number,
launch_type: string,
memory: number,
})
> type(var.ecs_config_map[*])
tuple([
map(
object({
capabilities: list(string),
cpu: number,
desired: number,
launch_type: string,
memory: number,
}),
),
])这表明我的问题是因为我试图迭代变量中的所有对象。在执行var.ecs_config_map[*]时,我使用splat表达式,它将整个映射转换为对象映射的元组。
然后,我尝试使用for表达式来执行验证。
validation {
condition = can(for task in var.ecs_config_map : contains(["EC2", "FARGATE", "EXTERNAL"], task["launch_type"]))
error_message = "Only EC2, FARGATE, EXTERNAL are allowed values for launch_type."
}我被扔给了The condition for variable "ecs_config_map" can only refer to the variable itself, using var.ecs_config_map.
for_each也不起作用。
我是不是搞砸了验证的语法?还是我试图验证一个复杂的类型,对地形的要求太高了?
发布于 2022-05-08 19:06:13
可以使用以下表达式验证变量:
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."
}这看起来可能很复杂,所以让我们停止它吧。
我们可以使用以下ecs_config_map表达式从for中提取启动类型:
output "launch_types" {
value = [for launch_type in values(var.ecs_config_map)[*].launch_type : launch_type]
}这样做的输出如下:
launch_types = [
"FARGATE",
"FARGATE",
]接下来,我们将筛选出那些不在允许的类型数组(["EC2", "FARGATE", "EXTERNAL"])中的启动类型。我们可以这样做:
output "not_allowed_launch_types" {
value = [for launch_type in values(var.ecs_config_map)[*].launch_type: launch_type if !contains(["EC2", "FARGATE", "EXTERNAL"], launch_type)]
}如果输入是正确的,这应该输出一个空数组,否则我们将有不正确的启动类型作为输出。
最后一步是验证我们是否有任何不正确的发射类型。我们可以使用length函数来实现这一点,如果具有不正确的启动类型的数组的长度大于0,则输入无效。
https://devops.stackexchange.com/questions/15930
复制相似问题