将不同的安全组附加到不同的 EC2

Posted

技术标签:

【中文标题】将不同的安全组附加到不同的 EC2【英文标题】:attaching different Security Groups to different EC2s 【发布时间】:2020-12-13 07:27:19 【问题描述】:

要求:- 我有多个 EC2 组(比如 2 组),其中每组包含 6 个 EC2。我必须为每个组附加不同的 SG。 示例:- Group1 包含:- Head1,子:EC2-1,EC2-2....6 并且需要附加 SG1 Group2 包含 :- Head2, child :EC2-3, EC2-4 ...6 并且需要附加 SG2

我不想编写单独的资源“aws_instance” 头模块

    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 VPC 'vpc-ghhje85abcy' 中不存在 4151444795600000001' 状态码:400,请求ID:9260fd88-a03a-4c46-b67c-3287594cdab5

在 main.tf 第 68 行,在资源“aws_instance”“ec2_instance”中: 68:资源“aws_instance”“ec2_instance”

注意:我使用的是data "aws_security_groups" 而不是data "aws_security_group"。如果我使用后一个,我知道我将只能在数据资源中获得一个 SG,它会抛出一个错误:多个安全组匹配;我通过使用data "aws_security_groups" 继续前进,这个错误消失了。但我面临的最新错误是:InvalidGroup.NotFound 如上所述。

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

【问题讨论】:

【参考方案1】:

不要使用数据,而是使用您在 resource "aws_instance" 上所做的计数创建您的 resource "aws_security_group",这样您就可以直接引用它们...

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

【讨论】:

谢谢!有道理。我可以试试。但是,由于在创建 EC2 之前使用了我的 SG 的其他资源的顺序,目前我的代码被分隔在不同的文件中。 @kamlendra 是的,您可以将其分隔在多个文件中,这应该不是问题 @Helder,有一种情况(头节点),我可以将 SG 和 EC2 保存在同一个文件(模块)中,这对我有用,谢谢!现在,由于新的要求,有第二种情况(子节点),我需要在创建头节点时使用创建的 SG。所以 SGs 和 Child 节点需要在不同的 Modules 中。我可以通过使用“数据”使其工作,但唯一的问题是随机排序【参考方案2】:

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

父模块:

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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CloudFormation 将安全组添加到现有 EC2 实例

数据库实例和EC2安全组在不同的VPC,cloudFormation错误

将安全组附加到我的 aws 实例的 Terraform 问题

安全组和子网属于不同的网络

更新层安全组

实例无法通信 - 相同的 VPC 和子网,不同的安全组