Terraform - 为 CloudFront IP 自动创建 SG

Posted

技术标签:

【中文标题】Terraform - 为 CloudFront IP 自动创建 SG【英文标题】:Terraform - Automatically create SGs for CloudFront IPs 【发布时间】:2021-12-02 12:24:42 【问题描述】:

我正在尝试为 CloudFront IP 自动创建 SG,以便将它们关联到我的 ALB。

This article 非常了解如何实现它,但不幸的是它不适用于我的环境。

这是代码:

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


locals 
  chunks_v4 = chunklist(data.aws_ip_ranges.cloudfront.cidr_blocks, 60)


resource "aws_security_group" "cloudfront" 
    count = length(local.chunks_v4)

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

    egress 
        from_port = 0
        to_port   = 0
        protocol  = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    

    lifecycle 
        create_before_destroy = true
    

这就是错误信息:

╷
│ Error: Incorrect attribute value type
│ 
│   on main.tf line 34, in resource "aws_security_group" "cloudfront":
│   34:         cidr_blocks = [local.chunks_v4[count.index]]
│     ├────────────────
│     │ count.index is a number, known only after apply
│     │ local.chunks_v4 is a list of list of dynamic, known only after apply
│ 
│ Inappropriate value for attribute "cidr_blocks": element 0: string required.
╵

不应该是这样的:

local.chunks_v4[count.index][0 to 59???]

如何使用 Terraform 实现它?

【问题讨论】:

好吧,我的错!我让 PyC​​harm 转换了旧语法,并在此处保留了括号: ["$local.chunks_v4[count.index]"] 【参考方案1】:

编辑:由于有 60 个 CIDR 块的硬性限制,我们需要将其分成块,感谢@Marcin 的提醒!

locals 
  chunks_v4 = chunklist(data.aws_ip_ranges.cloudfront.cidr_blocks, 60)


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


resource "aws_security_group" "cloudfront" 
  count = length(local.chunks_v4)

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

  egress 
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  

  lifecycle 
    create_before_destroy = true
  

【讨论】:

您确信这会奏效吗?我认为你可能会达到 SG 限制,因为我预计 Cloudfront 有很多 IP 范围。因此,OP 试图通过将data.aws_ip_ranges.cloudfront.cidr_blocks 拆分为小块来克服限制。 我只是运行它来仔细检查。我得到“规则:RulesPerSecurityGroupLimitExceeded:已达到每个安全组的最大规则数”,data.aws_ip_ranges.cloudfront.cidr_blocks 中有多少元素? 没有理由删除。我认为它的好答案。也许只是关于限制的一个小注释会很有用。 我得到了同样的结果,但没有错误,terraform 运行良好。 Inbound rules (76) 我会记下这个限制。感谢@Marcin 的帮助! @没问题。看起来不错。

以上是关于Terraform - 为 CloudFront IP 自动创建 SG的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 使 AWS CloudFront Distribution 缓存失效?

aws_cloudfront_distribution forwarded_values (Terraform) 中标头的语法是啥?

Terraform 错误更新 CloudFront Distribution InvalidLambdaFunctionAssociation: 该函数不能有环境变量

Terraform无法使用静态S3网站端点创建CloudFront的原点

Cloudfront 的 Terraform:InvalidHeadersForS3Origin,但我没有将 [*] 传递给任何 S3 源

如何强制 Cloudfront 将来自源的所有请求强制为 HTTPS?