You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:15:01