Terraform 一个具有两个子网的 EC2 实例

Posted

技术标签:

【中文标题】Terraform 一个具有两个子网的 EC2 实例【英文标题】:Terraform one EC2 instance with two subnets 【发布时间】:2021-05-27 09:50:52 【问题描述】:

我需要创建一个 EC2 并将 2 个子网关联到它。

variables.tf

variable "aws_subnet_id_this" 
  description = "Subnet ID"
  default = ["subnet-09df122a4faee8882", "subnet-2fcc756f02ddb4b62"]

ma​​in.tf

resource "aws_instance" "test" 
  ami                         = var.ami_id
  instance_type               = var.ec2_instance_type
  subnet_id                   = var.aws_subnet_id_this
  key_name                    = var.pki_name
  vpc_security_group_ids      = [aws_security_group.Allow_SSH_in.id]

错误:

错误:属性值类型不正确

在 main_count_data.tf 第 57 行,在资源“aws_instance”“test”中: 57:subnet_id = var.aws_subnet_id_this |---------------- | var.aws_subnet_id_eks 是具有 2 个元素的元组

属性“subnet_id”的值不合适:需要字符串。

所以我尝试了这个:

ma​​in.tf

resource "aws_instance" "prueba" 
  ami                         = var.ami_id
  instance_type               = var.ec2_instance_type
  #subnet_id                   = var.aws_subnet_id_this
  count = 2
  subnet_id = "$element(var.aws_subnet_id_this, count.index)"
  key_name                    = var.pki_name
  vpc_security_group_ids      = [aws_security_group.Allow_SSH_in.id]
  

但是这最后一部分代码尝试使用第二个子网创建一个新的 EC2 实例,这并不是我期望的困难。

总结一下:我需要 1 个 EC2,其中包含 variables.tf 文件中定义的 2 个子网。

我该怎么做?

【问题讨论】:

所以您希望 1 个实例具有两个 NIC?其中一个 nic 应该与实例位于不同的子网中? @Marcin,正确。 我修改了答案。 【参考方案1】:

下面是一个示例,说明如何在不同的子网中创建一个具有两个 NIC 的实例。 NIC 必须在同一个 AZ 中。所以实例可以在不同的子网中有两个网卡,只要它们在同一个 AZ:

variable "aws_subnet_id_this" 
  description = "Subnet ID"
  default = ["subnet-09df122a4faee8882", "subnet-2fcc756f02ddb4b62"]


resource "aws_network_interface" "nic1" 
  subnet_id       = var.aws_subnet_id_this[0]


resource "aws_network_interface" "nic2" 
  subnet_id       = var.aws_subnet_id_this[1]



resource "aws_instance" "prueba" 
  ami                         = var.ami_id
  instance_type               = var.ec2_instance_type
  key_name                    = var.pki_name

  network_interface 
      device_index = 0
      network_interface_id = aws_network_interface.nic1.id
  
        
  network_interface 
      device_index = 1
      network_interface_id = aws_network_interface.nic2.id
    
  


【讨论】:

好吧,你可以有一个有 2 个网卡的服务器,每个网卡都在自己的子网上。常见案例示例?充当 2 个子网之间的路由器的服务器。您启用 ip_forwarding 并完成。 (我不想要一个强硬的路由器,我只需要我的实例能够在不同的子网上交谈。 @pedro 是的。 Nic 可以在不同的子网中。但是实例仍然只有一个。请更新您的问题,以明确您要求的是 nics,而不是实例。或者有两个 nics 的实例。 谢谢您,先生,您的代码就像一个魅力!我必须处理的唯一一件事——但它成功了——就是增加了一个 SG。因此必须将:“security_groups = [aws_security_group.Allow_SSH_in.id]”添加到“aws_network_interface”资源中,然后稍后在“network_interface”参数子块中引用它。 @pedro 没问题。在这种情况下,SG 用于 NIC,而不是实例本身。

以上是关于Terraform 一个具有两个子网的 EC2 实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 Terraform 的 AWS VPC 中的两个子网之间进行路由?

Terraform 重新部署 EC2 实例

Terraform AWS subnet_id 列表被视为 ec2 实例的单值字符串

同一子网中具有相同安全组的 2 个 ec2 实例,但 1 个不可访问

Terraform 模块 - 输出变量作为另一个模块的输入

EC2 实例的输出子网