【问题标题】:Terraform/Terragrunt error if I don't add a default variable如果我不添加默认变量,则 Terraform/Terragrunt 错误
【发布时间】:2021-12-08 18:42:36
【问题描述】:

我是 terraform 新手。我已经为 cloudfront 编写了一个模块。我想将我的原始配置作为对象传递。当我运行 terragrunt 时,出现此错误:

Error: Invalid default value for variable

  on variables.tf line 9, in variable "origin_config":
   9:   default = {
  10:      protocol_policy = "https-only"
  11:      ssl_protocol = ["TLSv1.2"]
  12:      http_port = 80
  13:      https_port = 443
  14:   }

This default value is not compatible with the variable's type constraint:
attribute "domain_name" is required.

这是我的模块代码:

resource "aws_cloudfront_distribution" "this" {
  # origin config
  origin {
    domain_name = var.origin_config.domain_name
    origin_id   = local.origin_id
    custom_origin_config  {
        origin_protocol_policy = var.origin_config.protocol_policy
        origin_ssl_protocols = var.origin_config.ssl_protocol
        http_port = var.origin_config.http_port
        https_port = var.origin_config.https_port
    }
  }

这是我的变量.tf

variable "origin_config" {
  type = object({
    domain_name = string
    protocol_policy = string
    ssl_protocol = list(string)
    http_port = number
    https_port = number
    })
  default = {
     protocol_policy = "https-only"
     ssl_protocol = ["TLSv1.2"]
     http_port = 80
     https_port = 443
  }
}

这是我的 terraform.tfvars:

origin_config = {
    domain_name = "test.example.com"
}

如果我将变量 domain_name 添加为默认值,那么它可以工作。似乎它没有从 terraform.tvars 读取我的输入?

【问题讨论】:

    标签: amazon-web-services terraform terragrunt


    【解决方案1】:

    您的type 包含domain_name = string,这使其成为必填项。因此,如果您不想设置固定值,则必须设置一个空字符串,例如:

    variable "origin_config" {
      type = object({
        domain_name = string
        protocol_policy = string
        ssl_protocol = list(string)
        http_port = number
        https_port = number
        })
      default = {
         domain_name = ""
         protocol_policy = "https-only"
         ssl_protocol = ["TLSv1.2"]
         http_port = "80"
         https_port = "443"
      }
    }
    

    否则,请从您的 type 中删除 domain_name。还有实验性optional关键字:

    terraform {
      experiments = [module_variable_optional_attrs]
    }
    
    
    variable "origin_config" {
      type = object({
        domain_name = optional(string)
        protocol_policy = string
        ssl_protocol = list(string)
        http_port = number
        https_port = number
        })
      default = {
         protocol_policy = "https-only"
         ssl_protocol = ["TLSv1.2"]
         http_port = "80"
         https_port = "443"
      }
    }
    

    【讨论】:

      【解决方案2】:

      我的问题原来是通过尝试在我的 tfvars 中指定单个值,我覆盖了包含我的默认值的对象。

      解决方案是合并这两个对象,这样我的单个键:值输入将与默认对象合并为一个新对象。

      这里有一个很好的解释:https://binx.io/blog/2020/01/02/module-parameter-defaults-with-the-terraform-object-type/

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 2022-11-17
        • 2017-07-12
        • 2016-05-08
        相关资源
        最近更新 更多