首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证对象映射

验证对象映射
EN

DevOps用户
提问于 2022-05-08 05:15:05
回答 1查看 2.8K关注 0票数 1

我试图验证输入如下的对象的映射:

代码语言:javascript
复制
variable "ecs_config_map" {
  type = map(object({
    cpu     = number
    memory  = number
    desired = number

    capabilities = list(string)
    launch_type  = string
  }))
}

变量的值如下所示:

代码语言:javascript
复制
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"
  }
}

现在,我想执行一些基本的验证,但我似乎无法正确地理解语法。

代码语言:javascript
复制
 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上调试描述了:

代码语言:javascript
复制
> 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表达式来执行验证。

代码语言:javascript
复制
 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也不起作用。

我是不是搞砸了验证的语法?还是我试图验证一个复杂的类型,对地形的要求太高了?

EN

回答 1

DevOps用户

回答已采纳

发布于 2022-05-08 19:06:13

可以使用以下表达式验证变量:

代码语言:javascript
复制
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中提取启动类型:

代码语言:javascript
复制
output "launch_types" {
  value = [for launch_type in values(var.ecs_config_map)[*].launch_type : launch_type]
}

这样做的输出如下:

代码语言:javascript
复制
launch_types = [
  "FARGATE",
  "FARGATE",
]

接下来,我们将筛选出那些不在允许的类型数组(["EC2", "FARGATE", "EXTERNAL"])中的启动类型。我们可以这样做:

代码语言:javascript
复制
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,则输入无效。

票数 1
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/15930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档