Terraform 动态块中的列表问题解决方案

45次阅读
没有评论

问题描述

在创建 AWS CloudFront 模块时遇到了一些问题,因为有一些 CloudFront 参数也是“动态/可选”的。当尝试运行 $ terraform validate 命令时,出现了以下错误信息:

on ../../../../../terraform-aws-modules/cloudfront_distribution/main.tf line 24, in resource "aws_cloudfront_distribution" "cdn":
24:   dynamic "custom_origin_config" {
Blocks of type "custom_origin_config" are not expected here.

用户提供了自己的模块 main.tfvars.tf 的内容,并尝试过修改,但仍然遇到了问题。

解决方案

根据用户提供的信息,问题似乎涉及 Terraform 中动态块的使用,以及与 CloudFront 参数的配置相关。根据用户提供的数据,以下是可能的解决方案:

解决方案 1

注意:以下操作可能涉及版本差异,确保在进行修改之前做好备份。

问题出现在动态块 custom_origin_config 的使用上,它不被正确地识别。为了解决这个问题,你可以尝试对动态块进行适当的调整,确保其正确嵌套在 origin 动态块内。

main.tf 中,根据用户提供的代码,你可以尝试如下修改:

dynamic "origin" {
  for_each = var.origin
  content {
    domain_name = origin.value.domain_name
    origin_id   = origin.value.origin_id

    dynamic "custom_origin_config" {
      for_each = var.custom_origin_config
      content {
        http_port                = custom_origin_config.value.http_port
        https_port               = custom_origin_config.value.https_port
        origin_protocol_policy   = custom_origin_config.value.origin_protocol_policy
        origin_ssl_protocols     = custom_origin_config.value.origin_ssl_protocols
        origin_keepalive_timeout = custom_origin_config.value.origin_keepalive_timeout
        origin_read_timeout      = custom_origin_config.value.origin_read_timeout
      }
    }
  }
}

同样,在 vars.tf 中,你可以使用类似的方式对变量类型进行定义:

variable "origin" {
  type        = list(object({
    domain_name              = string,
    origin_id                = string,
    custom_origin_config     = list(object({
      http_port                = number,
      https_port               = number,
      origin_protocol_policy   = string,
      origin_ssl_protocols     = list(string),
      origin_keepalive_timeout = number,
      origin_read_timeout      = number
    }))
  }))
  description = "One or more origins for this distribution (multiples allowed)."
}

解决方案 2

从问题描述中可以看出,问题可能与变量类型和动态块的嵌套有关。如果解决方案 1 无法解决问题,你还可以考虑进行其他调整。在这种情况下,可以尝试与社区或其他有相关经验的人交流,以获得更多帮助。

总结

Terraform 的动态块和参数配置是模块化架构中的重要组成部分。在遇到问题时,首先检查动态块的使用方式、变量类型和嵌套关系,确保它们与文档中的要求一致。如果问题仍然存在,可以考虑向社区或相关领域的专家寻求帮助,以获得更详细的解决方案。

希望本文能够帮助你解决 Terraform 动态块中的问题,使你的 AWS CloudFront 模块能够正确配置和运行。如有其他问题或疑问,请随时提问或寻求进一步的帮助。

正文完