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

使用Terraform为CloudFront IP自动创建SG关联ALB报错如何解决

错误原因

chunklist() 函数会将输入的一维列表按指定长度切割为嵌套列表,local.chunks_v4 的每个元素本身就是包含最多60个CloudFront IPv4 CIDR的字符串列表。你之前的写法[local.chunks_v4[count.index]]额外给列表套了一层方括号,导致传入cidr_blocks的参数变为[[CIDR1, CIDR2...]]的嵌套列表,不符合该参数要求的「字符串列表」类型,因此触发类型错误。

你猜测的[count.index][0到59]遍历逻辑不需要手动实现,local.chunks_v4[count.index]本身就已经包含了对应分块的所有60个CIDR,可直接传入。

修正后完整代码

data "aws_ip_ranges" "cloudfront" {
  regions  = ["global"]
  services = ["cloudfront"]
}

locals {
  # 按单条安全组规则最多支持60个CIDR的配额拆分
  chunks_v4 = chunklist(data.aws_ip_ranges.cloudfront.cidr_blocks, 60)
  # 如需支持CloudFront IPv6段可取消注释下行
  # chunks_v6 = chunklist(data.aws_ip_ranges.cloudfront.ipv6_cidr_blocks, 60)
}

resource "aws_security_group" "cloudfront" {
  count = length(local.chunks_v4)
  name  = "cloudfront-access-sg-${count.index}"

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = local.chunks_v4[count.index]
  }

  # 如需支持IPv6可取消注释下行规则
  # ingress {
  #   from_port        = 443
  #   to_port          = 443
  #   protocol         = "tcp"
  #   ipv6_cidr_blocks = local.chunks_v6[count.index]
  # }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
    # 如需支持IPv6可取消注释下行
    # ipv6_cidr_blocks = ["::/0"]
  }

  lifecycle {
    create_before_destroy = true
  }
}

使用说明

执行terraform apply后会生成多个安全组,将所有生成的安全组都关联到你的ALB即可实现仅允许CloudFront IP段访问ALB 443端口的需求。后续AWS更新CloudFront IP段时,重新执行apply即可自动同步更新安全组规则,无需手动修改。


内容的提问来源于stack exchange,提问作者Kaguei Nakueka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:48:01