我想使用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的专家,我也不明白为什么我的查询不返回结果。存在以指定域为别名的发行版。
发布于 2016-02-24 16:07:47
你离我很近!不过,有几件事:
null不是'null'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
}
}
]
}
}让我们从表达式的第一部分开始。唯一需要的修复方法是去掉null的引号:
DistributionList.Items[?Aliases.Items!=null]它将成功地过滤掉在Alias下不使用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]你拿到了你想要的身份证!
"foo"发布于 2021-06-03 07:21:52
加一句,我是在没有管子的情况下发现的。
aws cloudfront list-distributions --query "DistributionList.Items[?contains(Aliases.Items, 'cname.cdn.mycompany.com')].Id" --output text
https://stackoverflow.com/questions/35573727
复制相似问题