【问题标题】:Terraform - Multiple subnets with same aws_instance resourceTerraform - 具有相同 aws_instance 资源的多个子网
【发布时间】:2018-07-09 19:32:36
【问题描述】:

我正在尝试部署多个 EC2 实例,每个实例在不同的子网中使用相同的 aws_instance 资源块。

当我将 count 参数设置为多个服务器时,它会将它们全部建立在同一个子网中。

有没有办法通过 Terraform 实现这一点?

您会在下面找到我的 Terraform 块:

resource "aws_instance" "ec2-instance" {
  ami                    = "${var.ec2_ami}"
  instance_type          = "${var.instance_type}"
  key_name               = "${var.key_name}"
  vpc_security_group_ids = ["${var.security_group}"]

  subnet_id = "${var.subnet_id}"
  count     = "${var.count}"

  root_block_device {
    volume_size = "${var.root_volume_size}"
    volume_type = "${var.root_volume_type}"
  }

  tags {
    Name = "${var.app_name}"
  }
}

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    在您的 terraform 示例中,您使用 count 创建资源的多个实例,但为每个实例指定相同的子网 (var.subnet_id)。

    您可以使用计数索引为每个实例将资源属性设置为不同的值。例如,您可以将子网列表定义为变量,然后使用element() 根据计数索引选择一个。

    variable "subnet_ids" {
      default =  [ "s1", "s2", "s3" ]
    }
    
    resource "aws_instance" "ec2-instance"
    {
      count = "${var.count}"
      subnet_id = "${element(var.subnet_ids, count.index)}"
    
     # rest of config as before...
    }
    

    【讨论】:

    • 我现在可能会推荐list[index] 语法而不是element(list, index),但这绝对是正确的方法。将其与 aws_subnet_ids 数据源结合使用会更好!
    • list[index] 语法似乎不能处理索引大于列表长度的情况,而element() 可以,所以我认为这可能仍然是可取的。
    【解决方案2】:

    您必须定义另一个 aws_instance 块来实现这一点。 AWS API 也不支持这一点。当您使用 RunInstances API 创建 EC2 实例时,它将启动同一子网中的所有实例(作为单个请求的一部分)。

    【讨论】:

    • 感谢您的及时回复!有没有办法使用运行相同 aws_instance 块但只有不同子网 ID 的 Terraform 进行循环或类似的事情?
    【解决方案3】:

    我正在尝试使用相同的 aws_instance 资源块部署多个 EC2 实例,每个实例位于不同的子网中。

    您可以使用以下解决方法

    data aws_subnet_ids current {
       vpc_id = var.vpc_id
    }
    
    resource "aws_instance" "ec2-instance" {
       count     = "${var.count}"
       subnet_id = tolist(data.aws_subnet_ids.current.ids)[count.index % length(data.aws_subnet_ids.current.ids)]
    
       # rest of config as before...
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多