我试图传递一个安全组列表来创建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_instance
中vpc_security_group_ids
的提供程序类型约束相匹配,因为安全组在与EC2实例关联时没有任何有意义的排序,因此使用列表是没有意义的。
有了这种数据类型,您应该能够直接分配变量值,因为它们已经是预期的类型:
resource "aws_instance" "worker" {
ami = var.parameters.ami
vpc_security_group_ids = var.parameters.vpc_security_group_ids
}