我尝试将 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/