如何使用terraform创建具有多个子网ID的多个实例?
我有两个服务test1和test2,对于每个服务我必须创建6个vm。这6个vm应该放在同一区域的3个不同区域中创建的3个子网id中 在这个服务中,test1将在私有子网中,test2将在公共子网中。因此,在创建ec2实例时,我必须传递正确的子网id 根模块: 来自子模块-专有网络、子网、ec2 我试图通过创建一个结合了服务名称、priv、公共子网id、实例计数(2)的局部变量来实现同样的目标。但问题是我无法做到这一点,因为我无法创建唯一的密钥组合如何使用terraform创建具有多个子网ID的多个实例?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有两个服务test1和test2,对于每个服务我必须创建6个vm。这6个vm应该放在同一区域的3个不同区域中创建的3个子网id中 在这个服务中,test1将在私有子网中,test2将在公共子网中。因此,在创建ec2实例时,我必须传递正确的子网id 根模块: 来自子模块-专有网络、子网、ec2 我试图通过创建一个结合了服务名称、priv、公共子网id、实例计数(2)的局部变量来实现同样的目标。但问题是我无法做到这一点,因为我无法创建唯一的密钥组合 locals { service_subnet
locals {
service_subnets = {
for pair in setproduct(var.service-names, values(var.priv-subnet-ids),values(var.pub-subnet-ids),range(var.instance_count)) :
"${pair[0]}:${pair[1].availability_zone}-${pair[3]}" => {
service_name = pair[0]
priv-subnet = pair[1]
pub-subnet = pair[2]
}
}
}
resource "aws_instance" "ecom-instances" {
for_each = local.service_subnets
ami = data.aws_ami.ecom.id
instance_type = "t3.micro"
tags = {
Name = each.value.service_name
Service = each.value.service_name
}
vpc_security_group_ids = [var.instances-sg[each.value.service_name].id]
subnet_id = "${split("-", each.value.service_name)[2] == "TEST1" ? each.value.pub-subnet.id : each.value.priv-subnet.id }"
}
我得到下面的错误
Two different items produced the key "ecom-app-TEST1:ap-south-1c-1" in this 'for' expression. If duplicates are expected, use the ellipsis (...)
│ after the value expression to enable grouping by key.
如果我加上。。。如下所示对其进行更改,然后将其转换为元组,我不确定如何从aws_实例资源中的每个.value中获取和传递值
locals {
service_subnets = {
for pair in setproduct(var.service-names, values(var.priv-subnet-ids),values(var.pub-subnet-ids),range(var.instance_count)) :
"${pair[0]}:${pair[1].availability_zone}-${pair[3]}" => {
service_name = pair[0]
priv-subnet = pair[1]
pub-subnet = pair[2]
}
... }
}
on modules/vm/main.tf line 60, in resource "aws_instance" "ecom-instances":
│ 60: subnet_id = "${split("-", each.value.service_name)[2] == "TEST1" ? each.value.pub-subnet.id : each.value.priv-subnet.id }"
│ ├────────────────
│ │ each.value is tuple with 3 elements
│
│ This value does not have any attributes.
请指导我您可以尝试将索引添加到for循环中,并使其成为您名称的一部分,这可能有助于避免省略号/元组转换
locals {
service_subnets = {
for index, pair in setproduct(var.service-names, values(var.priv-subnet-ids),values(var.pub-subnet-ids),range(var.instance_count)) :
"${pair[0]}:${pair[1].availability_zone}-${pair[3]}=${index}" => {
service_name = pair[0]
priv-subnet = pair[1]
pub-subnet = pair[2]
}
}
}
为了帮助他人帮助您,也许您应该提供您在本地定义中使用的变量的定义(var.priv-subnet-ids,等等…。@RafaP everything是单独的模块。这就是为什么我无法提供详细信息。现在我添加了root,子模块代码。也将传递每个模块的输出。请您建议我恐怕粘贴大量代码没有帮助(至少对我没有帮助,我没有时间做您的工作…)我建议您只需使用变量定义var.priv-subnet-ids和var.pub-subnet-ids,将它们插入给出错误的表达式并进行一些调试;如果仍然不工作,请再次询问
locals {
service_subnets = {
for pair in setproduct(var.service-names, values(var.priv-subnet-ids),values(var.pub-subnet-ids),range(var.instance_count)) :
"${pair[0]}:${pair[1].availability_zone}-${pair[3]}" => {
service_name = pair[0]
priv-subnet = pair[1]
pub-subnet = pair[2]
}
... }
}
on modules/vm/main.tf line 60, in resource "aws_instance" "ecom-instances":
│ 60: subnet_id = "${split("-", each.value.service_name)[2] == "TEST1" ? each.value.pub-subnet.id : each.value.priv-subnet.id }"
│ ├────────────────
│ │ each.value is tuple with 3 elements
│
│ This value does not have any attributes.
locals {
service_subnets = {
for index, pair in setproduct(var.service-names, values(var.priv-subnet-ids),values(var.pub-subnet-ids),range(var.instance_count)) :
"${pair[0]}:${pair[1].availability_zone}-${pair[3]}=${index}" => {
service_name = pair[0]
priv-subnet = pair[1]
pub-subnet = pair[2]
}
}
}