如何通过aws_lb数据源为带指定标签的LB批量配置aws_shield_protection
完全可以通过Terraform的AWS数据源实现自动筛选符合标签要求的负载均衡器,无需手动维护ARN映射表,以下是具体实现方案:
方案1:兼容所有版本AWS Provider(通用方案)
先拉取全量负载均衡器信息,再通过标签过滤符合要求的资源:
# 拉取当前区域所有负载均衡器的ARN列表 data "aws_lbs" "all" {} # 遍历所有ARN获取每个负载均衡器的完整属性(含标签) data "aws_lb" "each_lb" { for_each = toset(data.aws_lbs.all.arns) arn = each.value } # 筛选标签为`Shield protection = ON`的负载均衡器,生成供for_each使用的映射结构 locals { shield_protected_lbs = { for arn, lb in data.aws_lb.each_lb : lb.name => arn # try函数处理无对应标签的负载均衡器,避免执行报错 if try(lb.tags["Shield protection"], "OFF") == "ON" } } # 自动为筛选出的负载均衡器创建Shield防护 resource "aws_shield_protection" "this" { for_each = local.shield_protected_lbs name = "shield-protection-${each.key}" resource_arn = each.value }
方案2:AWS Provider >= 3.74.0 专用高效方案
直接在aws_lbs数据源层面对标签做过滤,无需遍历查询每个负载均衡器的详情,执行效率更高:
# 直接拉取当前区域所有带有`Shield protection = ON`标签的负载均衡器ARN data "aws_lbs" "filtered" { tags = { "Shield protection" = "ON" } } # 从ARN中提取负载均衡器名称作为key,生成供for_each使用的映射结构 locals { shield_protected_lbs = { for arn in data.aws_lbs.filtered.arns : regex("([^/]+)$", arn)[0] => arn } } # 自动为筛选出的负载均衡器创建Shield防护 resource "aws_shield_protection" "this" { for_each = local.shield_protected_lbs name = "shield-protection-${each.key}" resource_arn = each.value }
注意事项
- 需确保Terraform执行身份拥有
elasticloadbalancing:DescribeLoadBalancers、elasticloadbalancing:DescribeTags权限 - 若需要跨区域筛选负载均衡器,需要为每个区域单独配置AWS Provider实例,重复上述逻辑
aws_shield_protection对应AWS Shield Advanced防护,你的账号需要先开通Shield Advanced才能正常创建该资源- 后续新增符合标签要求的负载均衡器后,执行
terraform apply会自动为其创建防护,无需手动修改配置 - 你原有代码中的
name = "shield protection".each.key存在语法错误,上述示例已修正为正确的字符串拼接写法
内容的提问来源于stack exchange,提问作者Zuntoo
相关产品推荐
相关产品推荐

