问题描述
在Terraform中遇到了验证块的问题。他的目标是在for_each循环中对每个输入变量进行验证,但发现验证块的条件限制只能接受输入变量本身,而无法接受each.value。他想知道是否有解决办法或绕过的方法来实现这个需求。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
Terraform中的验证块确实有一些限制,但我们可以通过一些技巧来实现你的需求。首先,我们需要明确一个目标:验证列表中的所有元素是否都满足某个条件。然后,我们可以使用一个表达式来判断列表中的所有元素是否都满足条件。以下是具体步骤:
- 定义一个接受字符串列表的变量,并使用
list(string)
类型。 - 在验证块中,使用
for
表达式遍历列表中的每个元素,并使用正则表达式来判断元素是否满足条件。 - 使用
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中愉快地进行配置管理!