Terraform批量为多个AWS负载均衡器创建同配置监听器方法
批量创建同配置AWS LB监听器的实现方式
不需要为每台负载均衡器重复编写相同的aws_lb_listener配置块,使用Terraform的for_each元参数即可实现单次配置批量生成所有对应监听器。
核心逻辑
- 将所有需要绑定监听器的负载均衡器整理为map类型集合,作为遍历数据源
- 在
aws_lb_listener资源块上配置for_each参数传入上述集合 load_balancer_arn字段通过遍历取值动态关联对应LB,端口、协议、default_action等通用配置仅需编写一次,会自动应用到所有生成的监听器资源
对应你场景的配置示例
针对你示例中单独定义的3台LB,可直接参考如下写法:
# 原有3台LB的定义保持不变 resource "aws_lb" "front_end" { # ... } resource "aws_lb" "front_end_2" { # ... } resource "aws_lb" "front_end_3" { # ... } # 仅需编写一次监听器配置,自动为3台LB分别生成对应监听器 resource "aws_lb_listener" "front_end" { for_each = { front_end = aws_lb.front_end.arn front_end_2 = aws_lb.front_end_2.arn front_end_3 = aws_lb.front_end_3.arn } load_balancer_arn = each.value port = "443" protocol = "HTTPS" default_action { # 原有default_action配置全部保留即可 .... } }
优化写法
如果你的LB本身就是通过for_each批量创建的,不需要手动拼接LB的ARN映射表,直接将LB资源集合传入监听器的for_each参数即可,代码更简洁:
# 批量创建LB示例 resource "aws_lb" "front_end" { for_each = toset(["front_end", "front_end_2", "front_end_3"]) name = each.value # ... 其余LB配置 } # 直接遍历LB资源批量生成监听器 resource "aws_lb_listener" "front_end" { for_each = aws_lb.front_end load_balancer_arn = each.value.arn port = "443" protocol = "HTTPS" default_action { .... } }
注意:不建议用
count参数实现这类批量资源创建,一旦调整LB的排列顺序,会引发监听器资源的意外重建或删除;for_each以唯一key标识资源,不存在这类问题。
内容的提问来源于stack exchange,提问作者Aswath
相关产品推荐
相关产品推荐

