如何使用terraform创建具有多个子网ID的多个实例?

如何使用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

我有两个服务test1和test2,对于每个服务我必须创建6个vm。这6个vm应该放在同一区域的3个不同区域中创建的3个子网id中

在这个服务中,test1将在私有子网中,test2将在公共子网中。因此,在创建ec2实例时,我必须传递正确的子网id

根模块: 来自子模块-专有网络、子网、ec2 我试图通过创建一个结合了服务名称、priv、公共子网id、实例计数(2)的局部变量来实现同样的目标。但问题是我无法做到这一点,因为我无法创建唯一的密钥组合

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]
    }
  }
}