Terraform:传递一个安全组列表



我试图传递一个安全组列表来创建ec2实例。

variables.tf
variable "parameters" {
type = map(any)
}
terraform.tfvars.json
{
"parameters": {
"ami": "ami1234",
"vpc_security_group_ids": "sg-1234,sg-wxyz"
}
}

注意,teffaform不允许将列表用于安全组,因为它要求映射的所有元素类型都相同。所以我必须使用逗号分隔的字符串。

resource "aws_instance" "worker" {
...
vpc_security_group_ids = ["${split(",",var.parameters.vpc_security_group_ids)}"]
}

我复制了一些在线代码来分割字符串,但terraform抱怨说,只有在应用后才知道变量。

我想你已经理解了,map(any)中的any表示要求Terraform自动推断地图的元素类型,因此Terraform将研究给定的值,并自动选择一个具体类型来替换any。在这里的示例中,结果将是map(string),因为映射中的所有值都是字符串。

然而,在我看来,您在这里描述的示例更适合作为对象类型,而不是映射。映射适用于任意的键/值对,其中所有元素都表示相同的事物,因此可以是相同的类型。对象类型用于描述具有不同类型的多个不同属性的单个事物。

因此,我建议重写您的类型约束,以正确地描述您期望的数据结构,根据上下文,它似乎如下所示:

variable "parameters" {
type = object({
ami                    = string
vpc_security_group_ids = set(string)
})
}

set(string)aws_instancevpc_security_group_ids的提供程序类型约束相匹配,因为安全组在与EC2实例关联时没有任何有意义的排序,因此使用列表是没有意义的。

有了这种数据类型,您应该能够直接分配变量值,因为它们已经是预期的类型:

resource "aws_instance" "worker" {
ami                    = var.parameters.ami
vpc_security_group_ids = var.parameters.vpc_security_group_ids
}

相关内容

  • 没有找到相关文章

最新更新