我正在尝试使用Terraform创建一个网络负载均衡器,重要的是它与保护其免受破坏的弹性IP相关联 .
我有类似以下代码:
resource "aws_lb" "balancer" {
name = "${var.name}-nlb"
internal = "${var.internal}"
load_balancer_type = "network"
subnets = ["${data.aws_subnet_ids.selected.ids}"]
subnet_mapping {
subnet_id = "someid"
allocation_id = "someid"
}
subnet_mapping {
subnet_id = "someid"
allocation_id = "someid"
}
subnet_mapping {
subnet_id = "someid"
allocation_id = "someid"
}
tags = "${merge(var.tags,
map("Terraform", "true"),
map("Environment", var.environment))}"
}
我所追求的是动态生成 subnet_mapping
块,因为此代码位于模块中,我想创建依赖于传入的子网数量的映射数 . 要么是预定义的块,要么传递块 .
有没有办法做到这一点?对我来说重要的是相关的弹性IP需要坚持下去 .
2 回答
Terraform目前不允许您在资源节/子资源上使用
count
元参数 .有一个issue tracking this on Github但目前还没有任何关于AFAIK的工作 .
在该线程中回应的Hashicorp员工(apparentlymart)目前正在开发一个新版本的HCL,可能在将来支持这样的事情 .
一个非常丑陋的解决方案可能是为每个可能的AZ数量创建一个资源 . ex(代码未经测试):
然后在你的模块中输出这样的东西可能会起作用:
如何处理侦听器以及LB可能需要的其他资源:
我没有测试过前面的代码,但这里有一些我知道有用的代码 . 我有一个 Consul 模块,如果它不用于保险库,则创建一个NLB:
您可以对aws_lb_target_group以及您需要的任何其他资源使用相同的计数技巧来引用任何aws_lb资源 .