【问题标题】:Attaching AWS security group to multiple EC2 instances将 AWS 安全组附加到多个 EC2 实例
【发布时间】:2020-08-25 16:23:01
【问题描述】:

我正在启动多个 Amazon EC2 实例并且需要附加一个安全组。我能够为一个 EC2 实例实现它,但正在寻找多个 EC2 的解决方案。我正在使用 TerraForm 0.12。请让我知道如何使用数据资源:- data "aws_instances" (s)。

这是我尝试为多个 EC2 转换的单个 EC2 的代码:

    resource "aws_instance" "ec2_instance" {
      count                = "${var.ec2_instance_count}"
      ami                  = "${data.aws_ami.app_qrm_ami.id}"
    ...
    }
    data "aws_instances" "ec2_instances" {
  count      = "${var.ec2_instance_count}"
  filter {
    name = "instance-id"
    values = ["${aws_instance.ec2_instance.*.id[count.index]}"]
  }
    }
    resource "aws_network_interface_sg_attachment" "sg_attachment" {
      security_group_id    = "${data.aws_security_group.security_group.id}"
      network_interface_id = "${data.aws_instance.ec2_instance[count.index].network_interface_id}" //facing issues here.
    }

我想使用数据“aws_instances”#notice (s) 来实现这一点。提前致谢。

【问题讨论】:

    标签: amazon-ec2 terraform terraform-provider-aws aws-security-group terraform0.12+


    【解决方案1】:

    要移除 ec2 AMI 的硬编码,您可以使用以下数据提供程序:-

      data "aws_ami" "amazon_linux" {
      count       = "${var.ec2_instance_count}"
      most_recent = true
      owners      = ["amazon"]
    
      filter {
        name = "name"
        values = [
          "amzn-ami-hvm-*-x86_64-gp2",
        ]
      }
    
      filter {
        name = "owner-alias"
        values = [
          "amazon",
        ]
      }
    }
    

    用于渲染 ami id:-

    resource "aws_instance" "ec2_instance" {
      count             = "${var.ec2_instance_count}"
      ami               = "${data.aws_ami.amazon_linux[count.index].id}"
      network_interface = 
    

    获取network_interface_id:-

    resource "aws_network_interface" "ec2_nic" {
      count           = "${var.ec2_instance_count}"
      subnet_id       = "${aws_subnet.public_a.id}"
      private_ips     = ["10.0.0.50"]
      security_groups = ["${aws_security_group.web.id}"]
    
      attachment {
        instance     = "${aws_instance.ec2_instance[count.index].id}"
      }
    }
    
    resource "aws_network_interface_sg_attachment" "sg_attachment" {
      security_group_id    = "${data.aws_security_group.security_group.id}"
      network_interface_id = "${aws_network_interface.ec2_ami[count.index].id}"
    }
    

    【讨论】:

    • 谢谢卡兰。但是,我的代码中没有 ami 的硬编码,ami 很好。它在“aws_instance”的“数据”部分中带有 instance_id,我需要有关让多个 Ec2_instance 循环以连接安全组的帮助。
    • @kamlendra 尝试在您的数据资源中使用 instance_id = aws_instance.ec2_instance[count.imdex].id
    • 我试过了,但没有运气。实际上一切正常,但在 Terraform 升级到 0.12 后,我开始遇到错误。很遗憾 terraform 不向后兼容。我在这里更新了旧代码。 stackoverflow.com/questions/61727500/…
    【解决方案2】:

    感谢卡兰,您的回答为我解决了这个问题。后来基础设施变得相当复杂,我找到了一种不同的更聪明的方法来解决它。我想与其他人分享未来可能对 TF 社区有所帮助的人。

    多个内部 SG {internal 0-7} 和一个外部 SG,用于创建不同的 swarm 组,允许内部通信和选择性外部通信。主要用于 Microsoft HPC 网格。

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

    }

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2017-01-14
      • 2018-12-29
      • 2021-07-13
      • 2020-09-02
      • 2021-05-29
      • 2021-11-26
      • 1970-01-01
      • 2021-03-28
      相关资源
      最近更新 更多