【问题标题】:unexpected type error after terraform 0.12 migrationterraform 0.12 迁移后出现意外类型错误
【发布时间】:2019-07-31 07:54:31
【问题描述】:

我正在将我的 terraform 0.11 配置迁移到 terraform 0.12.5。

迁移(使用0.12upgrade)比较顺利,但是在接下来的计划中遇到了这个错误

Error: Invalid value for module argument

  on main.tf line 72, in module "foo":
  72:   subnet_ids  = module.vpc.subnet_ids

The given value is not suitable for child module variable "subnet_ids"
defined at ../../modules/foo/main.tf:10,1-30: element 0: string
required.

模块foo 有一个(迁移的)变量声明subnet_ids,如下所示:

variable "subnet_ids" {
  type = list(string)
}

vpc 模块有一个输出声明,声明如下:

output "subnet_ids" {
  value = [aws_subnet.private.*.id]
}

看来,如果我放宽 foo 模块的类型约束,错误就会消失。

但是,这是正确的做法吗?毕竟,vpc 模块的输出实际上不就是一个字符串列表吗?如何查看 vpc 输出变量的类型?

更新:放宽类型约束允许验证的第一部分成功,但当根据此输出应用变量时,只会导致消费模块出现问题

Error: Incorrect attribute value type

  on ../../modules/foo/main.tf line 350, in resource "aws_ecs_service" "api":
 350: subnets         = var.subnet_ids

Inappropriate value for attribute "subnets": incorrect set element type:
string required.

所以问题是:我在定义输出值时做错了什么?如何确保输出值是字符串列表,这样我就不会收到原始错误?如何检查vpc.subnet_ids的类型?

【问题讨论】:

    标签: module terraform


    【解决方案1】:

    事实证明,我需要改变这个:

    output "subnet_ids" {
      value = [aws_subnet.private.*.id]
    }
    

    到这里:

    output "subnet_ids" {
      value = aws_subnet.private[*].id
    }
    

    【讨论】:

    • aws_subnet.private.*.id 也可以工作......重要的是.*.id 已经返回了一个列表,所以额外的括号会产生一个列表列表。不幸的是,在这种情况下,输出值创建了一个间接性,使错误出现在远离原因的某个地方。
    • @MartinAtkins 感谢您的解释
    【解决方案2】:

    如果你有subnet_ids 的列表,你需要像下面这样添加

    subnet_ids = flatten([module.vpc.public_subnets, module.vpc.private_subnets])
    

    也检查这个answer

    【讨论】:

      【解决方案3】:

      在变量文件中提到“subnet_ids”作为列表。

      variable "subnet_ids" {
        type = list
        default = []
      }
      

      然后在你的模块中获取子网列表如下

      subnet_ids = [var.subnet_ids[0], var.subnet_ids[1]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 2021-02-02
        • 2018-12-29
        相关资源
        最近更新 更多