5

我正在尝试使用 Terraform 将我的弹性 IP 地址与新创建的网络平衡器相关联。aws_lb我在文档中看不到像在 AWS 控制台中那样添加弹性 IP 的选项。困难在于您必须在创建 NLB 时关联弹性 IP。

编辑:他们现在在他们的文档中做了一个明确的例子!

4

2 回答 2

7

aws_lb资源有一个subnet_mapping块,允许您为网络负载均衡器所在的每个子网指定一个弹性 IP。

一个绝对最小的示例如下所示:

resource "aws_eip" "lb" {
  vpc = true
}

resource "aws_lb" "network" {
  name               = "test-lb-tf"
  load_balancer_type = "network"

  subnet_mapping {
    subnet_id     = "${var.subnet_id}"
    allocation_id = "${aws_eip.lb.id}"
  }
}

显然,您可能希望在多个子网中运行负载均衡器,因此您可能会使用以下内容:

variable "vpc" {}

data "aws_vpc" "selected" {
  tags {
    Name = "${var.vpc}"
  }
}

data "aws_subnet_ids" "public" {
  vpc_id = "${data.aws_vpc.selected.id}"

  tags {
    Tier = "public"
  }
}

resource "aws_eip" "lb" {
  count = "${length(data.aws_subnet_ids.public)}"
  vpc   = true
}

resource "aws_lb" "network" {
  name               = "test-lb-tf"
  internal           = false
  load_balancer_type = "network"

  subnet_mapping {
    subnet_id     = "${data.aws_subnet_ids.public.ids[0]}"
    allocation_id = "${aws_eip.lb.id[0]}"
  }

  subnet_mapping {
    subnet_id     = "${data.aws_subnet_ids.public.ids[1]}"
    allocation_id = "${aws_eip.lb.id[1]}"
  }

  subnet_mapping {
    subnet_id     = "${data.aws_subnet_ids.public.ids[2]}"
    allocation_id = "${aws_eip.lb.id[2]}"
  }
}

以上假设您已使用标签标记您的 VPC,并使用Name标签标记子网Tier,在这种情况下,该标签public用作任何面向外部的子网的值。然后,它为每个公共子网创建一个弹性 IP 地址,并在每个公共子网中创建一个网络负载均衡器,为每个公共子网附加一个弹性 IP。

于 2018-04-12T08:58:04.797 回答
2

上面的答案是正确的,但是现在可以使用 Terraform 0.12 中提供的动态块来简化它。这具有在具有更多或更少子网的 vpc 中工作的优势。

resource "aws_lb" "network" {
  name               = "test-lb-tf"
  internal           = false
  load_balancer_type = "network"

  dynamic "subnet_mapping" {
    for_each = data.aws.subnet_ids.public_ids
    content {
      subnet_id     = subnet_mapping.value
      allocation_id = aws_eip.lb.id[subnet_mapping.key].allocation_id
    }
  }
}
于 2019-12-13T16:09:17.857 回答