使用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
相关产品推荐
相关产品推荐

