7

我想使用 CLI 工具来检索具有特定 cname/别名的 CloudFront 分配的分配 ID。

这就是我想出的:

aws cloudfront list-distributions --query "DistributionList.Items[?Aliases.Items!='null']|DistributionList.Items[?contains(Aliases.Items,'cname.cdn.mycompany.com') == 'true'].{Id:Id}"

我不是 JMESPath 的专家,我不明白为什么我的查询没有返回结果。存在具有指定域作为别名的分配。

4

2 回答 2

16

你很亲密!不过有几点:

  • null不是'null'
  • 在管道之后,您将使用第一个表达式的结果
  • like null,true不是字符串(== true也是多余的)

jmespath.org有一个实时编辑器,您可以使用它来测试表达式。这是我们可以用来测试这种情况的简化 json:

{
    "DistributionList": {
        "Items": [
            {
                "Id": "foo",
                "Aliases": {
                    "Quantity": 1,
                    "Items": [
                        "cname.cdn.mycompany.com"
                    ]
                }
            },
            {
                "Id": "bar",
                "Aliases": {
                    "Quantity": 1,
                    "Items": [
                        "cname.cdn.othercompany.com"
                    ]
                }
            },
            {
                "Id": "baz",
                "Aliases": {
                    "Quantity": 0
                }
            }
        ]
    }
}

让我们从表达式的第一部分开始。您需要的唯一解决方法是将引号去掉:

DistributionList.Items[?Aliases.Items!=null]

这将成功过滤掉没有Itemsunder的元素Alias。如果你在这里停下来,你会得到什么,以及在管道之后你必须处理什么:

[
  {
    "Id": "foo",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.mycompany.com"
      ]
    }
  },
  {
    "Id": "bar",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.othercompany.com"
      ]
    }
  }
]

请注意,现在没有DistributionList.Items了。

所以现在我们要过滤特定的 CNAME。让我们省略重言式== true

[?contains(Aliases.Items, 'cname.cdn.mycompany.com')]

所以现在的完整表达是:

DistributionList.Items[?Aliases.Items!=null] | [?contains(Aliases.Items, 'cname.cdn.mycompany.com')]

您的结果是成功过滤的列表:

[
  {
    "Id": "foo",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.mycompany.com"
      ]
    }
  }
]

现在,如果您想要匹配元素的 Id,只需添加.Id到最后一个表达式。如果您知道只有一个,您可以使用另一个管道选择该元素,然后[0].

DistributionList.Items[?Aliases.Items!=null] | [?contains(Aliases.Items, 'cname.cdn.mycompany.com')].Id | [0]

你得到你想要的ID!

"foo"
于 2016-02-24T16:07:47.600 回答
1

补充一下,我发现它没有管道。

aws cloudfront list-distributions --query "DistributionList.Items[?contains(Aliases.Items, 'cname.cdn.mycompany.com')].Id" --output text

于 2021-06-03T07:21:52.340 回答