【问题标题】:Terraform create multiple ec2 instances in multiple subnetsTerraform 在多个子网中创建多个 ec2 实例
【发布时间】:2022-02-11 12:31:05
【问题描述】:

我正在尝试创建多个可访问多个子网的 ec2 实例。

我发现了单独做这些事情的问题和答案,但没有合并。

首先,我创建一个私有子网和一个公共子网,然后设置一个本地来存储创建后的 ID:

locals {
  subnets =  [ aws_subnet.public_subnet.id, aws_subnet.private_subnet.id ]
}

接下来,我可以使用for_each 和以下内容在private_subnet 中创建可变数量的服务器:

servers = [ "s1", "s2" ]
resource "aws_instance" "system" {
  for_each                    = var.servers 
  ami                         = var.aws_ami
  instance_type               = var.instance_type
  #subnet_id                  = aws_subnet.private_subnet.id
  count = 2
  subnet_id                   = element(local.subs, count.index)
}

我想要的是,服务器可以访问两个子网(据我所知,它不存在,但相当于subnet_ids = [aws_subnet.public_subnet.id, aws_subnet.private_subnet.id])。

我通过创建两个 NIC (Terraform one EC2 instance with two subnets) 找到了一个适用于特定实例的不错答案,但是我需要这样做 var.servers 次,因此很难用我当前的 aws_instance 硬编码 var.servers * 2 NIC设置(我在组合 for_eachcount 时绊倒了)。

有人可以指点我正确的方向吗?

【问题讨论】:

  • 你的问题不清楚。单个子网中的服务器可以访问同一 VPC 中的所有子网。那么你到底想做什么呢?
  • 在一个子网中,我有两个实例。我希望一个实例可以从 Internet 入站访问(使用 Internet 网关),而另一个实例只能具有出站 Internet 访问权限(使用 nat 网关)。我认为最好的方法是拥有一个公共和私有子网 - 有没有更好的方法?
  • 没错,所以将 s1 放在公有子网中,将 s2 放在私有子网中。所以你的问题是关于那个?
  • 感谢 Marcin,我理解理论并且可以在控制台 (docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html) 中“手动”完成,但尝试使用 Terraform 自动化该过程。我想创建可变数量的 ec2 实例,它们在公共子网和私有子网中都有 NIC。
  • 为什么每个实例需要两个 NIC?您的描述并未表明需要两个 NIC。两个实例,每个实例一个 NIC,应该足够了。

标签: amazon-ec2 terraform subnet


【解决方案1】:

两个在私有(两台服务器)和公共(两台服务器)子网中创建多个服务器(在您的情况下总共 4 个),您可以使用count

resource "aws_instance" "system" {
  count                    = length(var.servers) * length(local.subnets)
  ami                         = var.aws_ami
  instance_type               = var.instance_type
  subnet_id                   = element(local.subnets, count.index)
}

【讨论】:

    【解决方案2】:

    对于那些希望有类似设置的人,有几个步骤(假设子网和路由表已经存在):

    • 在单个子网上创建机器
    • 创建额外的网络接口
    • 将网络接口附加到“其他”子网(对于现有机器)

    为机器创建一个变量:

    domains = [
      "asd.com",
      "asd2.com"
    ]
    

    在单个子网上创建机器:

    resource "aws_instance" "domain" {
      for_each                    = var.domains
      ami                         = var.aws_ami
      subnet_id                   = aws_subnet.public_subnet.id
      associate_public_ip_address = true
      tags = {
        Name           = "Instance - ${each.key}"
      }
    }
    

    为“其他”子网创建附加接口:

    resource "aws_network_interface" "nics" {
      for_each          = var.domains
      subnet_id         = aws_subnet.private_subnet.id
      tags = {
        Name           = "NIC - ${each.key}"
      }
    }
    

    将网络接口附加到“其他”子网(对于现有机器):

    resource "aws_network_interface_attachment" "attach_nics" {
      for_each              = var.domains
      instance_id           = aws_instance.domain[each.key].id
      network_interface_id  = aws_network_interface.nics[each.key].id
      device_index          = 1 # public_subnet = 0
    }
    

    这里的“技巧”(我不知道)是了解您可以根据现有脚本(在aws_network_interface_attachment 组件中使用)中的名称访问已创建资源中的数据。

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2019-05-07
      • 2021-08-09
      • 2018-07-29
      • 2020-06-28
      • 1970-01-01
      • 2021-05-27
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多