Terraform 0.12 升级后出现”unsupported value for “%s” at 0: string required.”错误

72次阅读
没有评论

问题描述

在升级到 Terraform 0.12 版本后,遇到了很多类似的错误:

Error: Error in function call  on main.tf line 136, in data "template_file" "inventory": 136:       formatlist( 137: 138: 139: 140:    |----------------    | module.mongodb.instance_names is tuple with 1 element    | module.mongodb.private_ip is list of string with 1 elementCall to function "formatlist" failed: error on format iteration 0: unsupportedvalue for "%s" at 0: string required.

用户提供了相关的代码片段:

connection_strings_mongodb_standalone = join(
      "\n",
      formatlist(
        "%s ansible_host=%s ansible_user=ubuntu",
        module.mongodb.instance_names,
        module.mongodb.private_ip,
      ),

以及模块代码:

module "mongodb" {
  source                      = "../modules/mongodb"
  instance_count              = "1"
  environment                 = var.env
  instance_type               = "i3.large"
  subnet_id                   = element(tolist(data.aws_subnet_ids.private.ids), 0)
  associate_public_ip_address = false
  vpc_id                      = data.aws_vpc.vpc.id
  tags = merge(
    {
      "Environment" = var.env
    },
    var.default_tags,
  )
  iam_instance_profile = var.iam_instance_profile
  route53_zone_id      = data.aws_route53_zone.zone.zone_id
  ami                  = var.ami
}
output "mongodb_private_ip" {
  value = module.mongodb.private_ip
}
output "tags" {
  value = module.mongodb.instance_names
}

用户认为需要设置输出值的类型,但是找不到如何设置的方法,希望有人能帮助他解决这个问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据错误信息和代码片段,问题出在 module.mongodb.instance_namesmodule.mongodb.private_ip 这两个输出值的类型不匹配上。在 Terraform 0.12 中,对于列表类型的输出值,不再需要使用额外的列表包装。因此,需要将输出值的定义修改为:

output "instance_names" {
  value = data.template_file.instance_tags_name.*.rendered
}

这样就可以得到一个平铺的字符串列表,符合 formatlist 函数的要求。

方案2

Terraform 0.12 提供了一个自动配置升级工具,可以在某些情况下自动进行更改。建议使用该工具作为升级过程的起点。它可以为您进行大部分简单的重写工作,并会对一些复杂情况无法处理的情况发出警告。
具体操作步骤如下:
1. 使用自动配置升级工具进行升级。
2. 检查升级后的代码,确保输出值的定义已经修改为:

output "instance_names" {
  value = data.template_file.instance_tags_name.*.rendered
}
  1. 运行 Terraform 命令,验证是否解决了问题。

方案3

如果自动配置升级工具无法解决问题,或者您希望手动进行更改,可以按照以下步骤进行操作:
1. 修改输出值的定义,将其修改为:

output "instance_names" {
  value = data.template_file.instance_tags_name.*.rendered
}
  1. 运行 Terraform 命令,验证是否解决了问题。
    请注意,升级到 Terraform 0.12 可能会导致其他代码更改和配置调整。建议在升级之前仔细阅读官方的升级指南,并在升级过程中进行适当的测试和验证。
    以上是解决这个问题的几种方案,根据您的具体情况选择适合您的方法进行操作。

正文完