Terraform验证复杂类型的地图对象

58次阅读
没有评论

问题描述

在使用Terraform时,遇到了一个关于验证复杂类型地图对象的问题。他定义了一个名为ecs_config_map的变量,它是一个地图(Map)对象,包含多个子对象,每个子对象具有不同的属性(例如:cpumemorydesiredcapabilitieslaunch_type等)。用户希望对这个变量进行基本验证,以确保其中的launch_type属性值仅允许是预定义的一组值(”EC2″、”FARGATE”、”EXTERNAL”)之一。用户尝试了一些验证方法,但遇到了语法问题和错误提示。

解决方案

请注意以下操作可能存在版本差异,请在实际操作前先进行备份。

用户的问题在于对复杂类型地图对象进行验证,特别是在验证子对象中的launch_type属性值时。为了实现这个目标,我们可以使用Terraform的一些内置函数和表达式。下面是解决方案的步骤:

  1. 提取launch_type:首先,我们需要从ecs_config_map中提取所有子对象的launch_type属性值,以便后续的验证。我们可以使用for表达式来提取这些值。
  2. 验证launch_type:一旦提取了launch_type值,我们需要验证这些值是否都在预定义的允许值列表(”EC2″、”FARGATE”、”EXTERNAL”)中。我们可以使用contains函数来进行验证。
  3. 输出错误信息:如果有任何一个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属性的验证需求,确保只有指定的值被允许。

正文完