Amazon ec2 将不同的安全组连接到不同的EC2

Amazon ec2 将不同的安全组连接到不同的EC2,amazon-ec2,terraform,terraform-provider-aws,aws-security-group,terraform0.12+,Amazon Ec2,Terraform,Terraform Provider Aws,Aws Security Group,Terraform0.12+,要求:- 我有多组(比如说两组)EC2,每组包含6个EC2。我必须为每个组附加不同的SG。 示例:- 组1包含:-头1,子:EC2-1,EC2-2…6,需要连接SG1 组2包含:-头2,子:EC2-3,EC2-4…6,需要连接SG2 我不想编写单独的资源“aws\u实例” 头部模块 resource "aws_security_group" "sg" { count = var.ec2_instance_count name

要求:- 我有多组(比如说两组)EC2,每组包含6个EC2。我必须为每个组附加不同的SG。
示例:-
组1包含:-头1,子:EC2-1,EC2-2…6,需要连接SG1
组2包含:-头2,子:EC2-3,EC2-4…6,需要连接SG2

我不想编写单独的资源“aws\u实例” 头部模块

    resource "aws_security_group" "sg" {
    count       = var.ec2_instance_count
  name        = "${local.account}${count.index}"
  vpc_id      = local.vpc_id
}

  resource "aws_instance" "ec2_instance" {
  count           = var.ec2_instance_count
  security_groups = [element(aws_security_group.sg.*.id, count.index)]
}
子模块:

  data "aws_security_groups" "data_security_group" {
      filter {
        name   = "group-name"
        values =  ["${local.account}${count.index}"]
      }
    }
   resource "aws_instance" "ec2_child" {
  count           = var.ec2_instance_count*var.numberofchild
  security_groups = [element(aws_security_group.data_security_group.*.id, count.index)]
}
错误:启动源实例时出错:InvalidGroup.NotFound:安全组“terraform-2020082” 4151444795600000001'在专有网络“VPC-ghhje85abcy”中不存在 状态代码:400,请求id:9260fd88-a03a-4c46-b67c-3287594cdab5

在main.tf行的资源“aws_instance”“ec2_instance”中: 68:资源“aws_实例”“ec2_实例”{

注意:我使用的是
数据“aws\u security\u groups”
而不是
数据“aws\u security\u groups”
。如果我使用后一个,我知道我将只能在数据资源中获得一个SG,这会给我带来一个错误:匹配了多个安全组;通过使用
数据“aws\u security\u groups”,我有点前进了
此错误消失。但我面临的最新错误是:InvalidGroup.NotFound,如上所述


更新:我能够使用数据资源,并且能够将不同的SG连接到不同的EC2。唯一的问题是随机排序。对于组1的所有6个EC2,我希望他们分配第一个SG,依此类推。

不要使用数据,而是使用与
资源类似的计数创建
资源“aws\u安全组”
“aws_实例”
这样您就可以直接引用它们

resource "aws_security_group" "sg" {
  count       = var.ec2_instance_count
  name        = "${local.account}${count.index}"
  vpc_id      = local.vpc_id
}

resource "aws_instance" "ec2_instance" {
  count           = var.ec2_instance_count
  security_groups = [element(aws_security_group.sg.*.id, count.index)]
}

感谢Helder,我用count创建了资源。这不是庞大的基础设施,而是相当复杂的基础设施。8个组(每个组有1个父组和6个子组EC2) 所有家长都有一个外部SG,每组有8个内部SG)。 我必须遵循一系列的配置,因为要求将“父主机名”传递给“Childs User data”中的相应Childs组,所以我必须将它们保存在单独的模块中,并使用“数据”资源进行重用

父模块:

resource "aws_instance" "ec2_instance" {
  count                   = tonumber(var.mycount)
 vpc_security_group_ids  = [data.aws_security_group.external_security_group.id, element(data.aws_security_group.internal_security_group.*.id, count.index)]
...
}
resource "aws_security_group" "internal_security_group" {
  count       = tonumber(var.mycount)
  name        = "${var.internalSGname}${count.index}"
}

resource "aws_security_group" "external_security_group" {
  name        = ${var.external_sg_name}"
}
ChildModule:使用数据资源,并使用动态映射将SG分配给适当的EC2组

data "aws_security_group" "internal_security_group" {
  count = tonumber(var.mycount)
  filter {
    name   = "group-name"
    values = "${var.internalSGname}${count.index}"]
  }
}
resource "aws_instance" "ec2_child" {
  count                   = local.child_count * tonumber(var.mycount)
  vpc_security_group_ids  = ["${element(data.aws_security_group.internal_security_group.*.id, "${lookup(local.SG_lookup, count.index, 99)}")}"]

variable.tf
locals{
 SG_lookup = {
    for n in range(0, (local.child_count * tonumber(var.mycount))) :
    n => "${floor(((n) / local.child_count))}"
  }
 }
}

谢谢!有道理。我可以试试。但是,由于在创建EC2之前我的SG正在使用的其他资源的顺序,目前我的代码在不同的文件中被分离出来。@kamlendra是的,您可以在多个文件中分离出来,这不应该是一个问题@Helder,有一个场景(头部节点)在这里,我可以将SG和EC2保存在同一个文件(模块)中,这对我很有用,谢谢!现在,由于新的需求,有了第二个场景(子节点)其中,我需要使用创建头部节点时创建的SG。因此,SG和子节点需要在单独的模块中。我可以使用“数据”使其工作,但唯一的问题是随机排序。