Terraform - 如何将列表转换为地图(如何使用 terraform 获取 AMI 标签)

Posted

技术标签:

【中文标题】Terraform - 如何将列表转换为地图(如何使用 terraform 获取 AMI 标签)【英文标题】:Terraform - How to convert lists into map (How to fetch AMI tags using terraform) 【发布时间】:2021-04-20 04:46:57 【问题描述】:

我正在尝试使用 AWS CLI 获取 AMI 的标签,并希望重用输出中的值。 我在下面有一个 terraform 代码,它以字符串格式(可能不确定格式)返回输出,我想将其转换为地图对象。

variable "ami" 
  default = "ami-xxxx"


locals 
  tags = 
  "platform"    = lookup(data.local_file.read_tags.content, "platform", "") #Expecting to get platform from Map of read_tags
  


data "template_file" "log_name" 
  template = "$path.module/output.log"


resource "null_resource" "ami_tags" 
  provisioner "local-exec" 
    command = "aws ec2 describe-tags --filters Name=resource-id,Values=$var.ami --query Tags[*].[Key,Value] > $data.template_file.log_name.rendered"
  


data "local_file" "read_tags" 
  filename = "$data.template_file.log_name.rendered"
  depends_on = ["null_resource.ami_tags"]


output "tags" 
  value = local.tags


output "cli-output-tags" 
  value = "$concat(data.local_file.read_tags.content)"

cli-output-tags 的输出如下:

[
    [
        "ENV",
        "DEV"
    ],
    [
        "Name",
        "Base-AMI"
    ],
    [
        "platform",
        "Linux"
    ]
]

如何使用 terraform/(jq 命令) 将此输出转换为 Map,如下所示,或者是否有任何其他方法可以直接从 cli-output-tags 输出中获取所需的值:


ENV  = "DEV",
Name = "Base-AMI",
platform = "Linux"

我也尝试过如下更改 CLI 命令,但仍无法按预期获取值:

'Tags[].Key:Key,Value:Value'

结果如下:

[
    
        "Key": "ENV",
        "Value": "DEV"
    ,
    
        "Key": "Name",
        "Value": "Base-AMI"
    ,
    
        "Key": "platform",
        "Value": "Linux"
    
]

【问题讨论】:

你也可以从控制台使用terraform output -json cli-output-tags 您是否有理由不想为此使用aws_ami data source? @ydaetskcoR aws_ami 数据资源不将 AMI id 作为输入属性。 这不是真的。它可以采用filter 参数,该参数使用docs.aws.amazon.com/cli/latest/reference/ec2/… 中描述的过滤器之一,其中可以包括image-id 【参考方案1】:

你可以使用zipmap:

output "cli-output-tags" 
  value = zipmap(
        jsondecode(data.local_file.read_tags.content)[*][0],
        jsondecode(data.local_file.read_tags.content)[*][1]
      )         

代码首先将字符串数据从您的文件更改为 json,然后 获取所有第一个元素 [*][0](第二个元素 [*][1] 相同),并将它们压缩到地图中。

【讨论】:

工作完美,简直太棒了。谢谢。【参考方案2】:

我怎样才能把这个输出转换成如下图

一种方法是按如下方式使用 jq(假设 cli-output-tags 是保存 JSON 数组的文件的名称):

jq -r -f '"", (.[] | "\(.[0]) = \"\(.[1])\""), ""' cli-output-tags

【讨论】:

以上是关于Terraform - 如何将列表转换为地图(如何使用 terraform 获取 AMI 标签)的主要内容,如果未能解决你的问题,请参考以下文章

如何将地图数据转换为颤动中的对象列表?

Flutter 如何将地图从互联网 API 转换为列表?

如何使用流将列表转换为带有索引的地图 - Java 8?

如何在Dart中将列表转换为地图

Terraform:如何从对象列表创建 API 网关端点和方法?

如何将地图 List<Map<String, String>> myList 列表转换为 Java 中的 Spark Dataframe?