问题描述
在创建 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.tf
和 vars.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 模块能够正确配置和运行。如有其他问题或疑问,请随时提问或寻求进一步的帮助。