【问题标题】:Convert from Tuple of strings to strings in terraform从字符串元组转换为 terraform 中的字符串
【发布时间】:2022-11-04 06:40:42
【问题描述】:

我有一个问题,我想将 vpc_ids 列表传递给aws_route53_zone,同时从几个模块调用中获取 id 并从状态文件中对其进行迭代。

我使用的输出格式是:

output "development_vpc_id" {
  value       = [for vpc in values(module.layout)[*] : vpc.id if vpc.environment == "development"]
  description = "VPC id for development env"
}

我在哪里得到如下输出:

  "development_vpc_id": {
      "value": [
        "xxxx"
      ],
      "type": [
        "tuple",
        [
          "string"
        ]
      ]
    },

相反,我想实现以下目标:

  "developmemt_vpc_id": {
      "value": "xxx",
      "type": "string"
    },

有人可以帮助我吗?

【问题讨论】:

  • 我猜这可能是因为您正在从模块中获取所有输出。您也可以将模块输出添加到问题中吗?
  • 从字符串序列生成字符串需要确定您想使用什么语法来表示列表,因为字符串只能包含未区分的字符序列。你想用一些分隔符(比如每个字符串之间的逗号)将字符串连接在一起吗?还是您想生成一个包含 JSON 数组的字符串?或者是其他东西?
  • 如果您假设此列表中只能有一项(因为 environment 值在您的所有 VPC 中是唯一的),那么您可以使用 one 从该列表中提取单个元素并将其返回。

标签: terraform


【解决方案1】:

没有任何自动方法可以将字符串序列“转换”为单个字符串,因为一旦将多个单独的字符串缩减为单个字符串,您就需要决定如何表示它。

一种解决方案是应用 JSON 编码,以便您的输出值是包含 JSON 数组语法的字符串:

output "development_vpc_id" {
  value = jsonencode([
    for vpc in values(module.layout)[*] : vpc.id
    if vpc.environment == "development"
  ])
}

另一种可能性是将所有字符串与特定字符连接在一起作为标记来分隔每个字符串,例如逗号:

output "development_vpc_id" {
  value = join(",", [
    for vpc in values(module.layout)[*] : vpc.id
    if vpc.environment == "development"
  ])
}

如果你希望这个列表总是只包含一个项目——也就是说,如果你的每个对象都有一个唯一的 environment 值——那么你也可以使用 the one function 告诉 Terraform 这个假设:

output "development_vpc_id" {
  value = one([
    for vpc in values(module.layout)[*] : vpc.id
    if vpc.environment == "development"
  ])
}

在这种情况下,Terraform 要么返回此序列的一个元素,要么引发错误,指出序列中的项目太多。因此,one 函数充当一个断言来帮助您检测是否存在导致此列表中存在多个项目的错误,而不是只是默默地丢弃一些项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多