json - 用 JQ 将字符串数组转换为字典?

标签 json amazon-web-services terraform jq terraform-provider-aws

我尝试将 AWS 公共(public) IP 范围转换为可与 Terraform 外部 数据提供程序一起使用的格式,以便我可以根据 AWS 公共(public) CIDR 创建安全组规则。提供程序需要具有以下格式的单个 JSON 对象:

{"string": "string"}

Here是公共(public)范围 JSON 文档的片段:

{
  "syncToken": "1589917992",
  "createDate": "2020-05-19-19-53-12",
  "prefixes": [
    {
      "ip_prefix": "35.180.0.0/16",
      "region": "eu-west-3",
      "service": "AMAZON",
      "network_border_group": "eu-west-3"
    },
    {
      "ip_prefix": "52.94.76.0/22",
      "region": "us-west-2",
      "service": "AMAZON",
      "network_border_group": "us-west-2"
    },
    // ...
]

我可以用这个成功提取我关心的范围,[.prefixes[] | select(.region == "us-west-2") | 选择(.region == "us-west-2") | .ip_前缀] |排序|独特的,它给了我这个:

[
  "100.20.0.0/14",
  "108.166.224.0/21",
  "108.166.240.0/21",
  "13.248.112.0/24",
  ...
]

我不知道如何使用 jq 将其转换为任意键对象。为了正确使用数组对象,我需要将其转换为字典,例如 {"任意键": "100.20.0.0/14"},以便我可以在像这样的地形:

data "external" "amazon-ranges" {
  program = [
    "cat",
    "${path.cwd}/aws-ranges.json"
    ]
}

resource "aws_default_security_group" "allow-mysql" {
  vpc_id = aws_vpc.main.id

  ingress {
    description = "MySQL"
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = [
      values(data.external.amazon-ranges.result)
    ]
  }
}

将 AWS 公共(public) IP 范围文档提取到具有任意 key 的单个对象中的最有效方法是什么?

最佳答案

以下脚本使用 .ip_prefix 作为键,因此可能不需要 sort|unique。它产生:

{
  "35.180.0.0/16": "35.180.0.0/16",
  "52.94.76.0/22": "52.94.76.0/22"
}

脚本

#!/bin/bash

function data {
    cat <<EOF
{
  "syncToken": "1589917992",
  "createDate": "2020-05-19-19-53-12",
  "prefixes": [
    {
      "ip_prefix": "35.180.0.0/16",
      "region": "eu-west-3",
      "service": "AMAZON",
      "network_border_group": "eu-west-3"
    },
    {
      "ip_prefix": "52.94.76.0/22",
      "region": "us-west-2",
      "service": "AMAZON",
      "network_border_group": "us-west-2"
    }
    ]
}
EOF
}

data | jq '
  .prefixes 
  | map(select(.region | test("west"))
        | {(.ip_prefix): .ip_prefix} )
  | add '

关于json - 用 JQ 将字符串数组转换为字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61940049/

相关文章:

azure - Terraform - 根据本地字符串列表验证传递的字符串列表

terraform 还原 RDS 备份

ubuntu - 如何让用户数据在自定义 Ubuntu 18.04 AMI 上执行?

javascript - 如何使用 javascript 对从文档库中获取的列表项进行排序?

python - 在 python 中,有没有办法提取嵌入的 json 字符串?

amazon-web-services - AWS Lambda 可以接收入站 TCP 连接吗?

python - AWS LAMBDA "errorMessage": "[Errno 30] Read-only file system: ' drive-python-quickstart. json'"

java - 如何从响应json中获取用户的id

jquery - 使用 FullCalendar 和 removeEvents 方法过滤 onclick 事件

javascript - (nodeJS) S3 对象的内容类型 : manually set to 'image/jpeg' but in S3 console comes up as 'application/octet'