如何在for_each循环中进行迭代验证

65次阅读
没有评论

问题描述

在Terraform中遇到了验证块的问题。他的目标是在for_each循环中对每个输入变量进行验证,但发现验证块的条件限制只能接受输入变量本身,而无法接受each.value。他想知道是否有解决办法或绕过的方法来实现这个需求。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

Terraform中的验证块确实有一些限制,但我们可以通过一些技巧来实现你的需求。首先,我们需要明确一个目标:验证列表中的所有元素是否都满足某个条件。然后,我们可以使用一个表达式来判断列表中的所有元素是否都满足条件。以下是具体步骤:

  1. 定义一个接受字符串列表的变量,并使用list(string)类型。
  2. 在验证块中,使用for表达式遍历列表中的每个元素,并使用正则表达式来判断元素是否满足条件。
  3. 使用can函数捕获每个元素的验证结果,并返回最终的验证结果。

下面是一个示例代码片段,演示如何实现在for_each循环中对列表元素进行验证:

variable "mytestnames" {
  type = list(string)
  validation {
    condition = can([for v in var.mytestnames : regex("test$", v)])
    error_message = "All names must end with \"test\"."
  }
}

在上面的示例中,我们定义了一个名为mytestnames的变量,其类型为list(string)。然后,在验证块中,我们使用了for表达式遍历mytestnames列表中的每个元素(记作v),并使用正则表达式regex("test$", v)来判断每个元素是否以”test”结尾。can函数捕获每个元素的验证结果,并最终决定是否通过验证。

方案2

方案1中的方法是验证每个元素是否满足条件的一种常见做法,但如果对验证块有其他需求,也可以考虑使用自定义函数或不使用验证块,而是在模块中自行处理验证逻辑。

如果你对方案1中的解决方法不满意,也可以考虑使用自定义函数来处理验证逻辑。另外,如果在模块中进行验证更加灵活,你可以在模块的逻辑中自行处理每个元素的验证。这种方法可能会增加一些复杂性,但也能满足你的需求。

综上所述,通过合理使用Terraform的功能,你可以在for_each循环中对每个输入变量进行验证,确保满足特定的条件。无论是使用表达式判断,还是自定义函数,都可以根据你的实际需求来选择合适的验证方式。祝你在Terraform中愉快地进行配置管理!

正文完