我正在尝试使用 Terraform 将我的弹性 IP 地址与新创建的网络平衡器相关联。aws_lb
我在文档中看不到像在 AWS 控制台中那样添加弹性 IP 的选项。困难在于您必须在创建 NLB 时关联弹性 IP。
编辑:他们现在在他们的文档中做了一个明确的例子!
我正在尝试使用 Terraform 将我的弹性 IP 地址与新创建的网络平衡器相关联。aws_lb
我在文档中看不到像在 AWS 控制台中那样添加弹性 IP 的选项。困难在于您必须在创建 NLB 时关联弹性 IP。
编辑:他们现在在他们的文档中做了一个明确的例子!
该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。
上面的答案是正确的,但是现在可以使用 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
}
}
}