如果我提前知道相关标签的值,我如何捕获 VpcId?

How can I catch VpcId if I know a related tag's value ahead?

我有以下 aws ec2 describe-vpcs 的输出:

{
    "Vpcs": [
        {
            "VpcId": "vpc-1f0e197d",
            "InstanceTenancy": "default",
            "Tags": [
                {
                    "Value": "Product-Production",
                    "Key": "Name"
                }
            ],
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-f3c5509a",
                    "CidrBlock": "172.19.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "State": "available",
            "DhcpOptionsId": "dopt-37fd5550",
            "CidrBlock": "172.19.0.0/16",
            "IsDefault": false
        },
        {
         another vpc...
        }
    ]
}

如果

我正在使用 jq 捕捉 "VpcId"
.Tags[].Value==Product-Production

但是无论我怎么尝试,我都无法得到正确的语法,如何实现?

你很接近但不是很正确的过滤器。你需要在这里使用一个select表达式来匹配匹配你的字符串条件的对象并过滤掉它的值。

jq '.Vpcs[] | select( .Tags[].Value| contains("Product-Production")) | .VpcId'

如果你分解过滤器,

  1. .Vpcs[] 部分列出了我们应用条件的数组中的所有元素。
  2. 我们过滤那个 .Value 包含您在这里需要的字符串的对象。因此,在第一个管道输出的末尾,您从数组中的元素列表中获取实际元素,匹配定义的条件。
  3. 从返回的对象中,您只需使用最后一个管道打印出 .VpcId

如果您以前没有使用过 jqplay.org,您应该尝试一下,让您的过滤器生效并在线解决。