2016-02-23 64 views
4

我想使用CLI工具来检索具有特定cname /别名的CloudFront分配的分配标识。AWS CLI和JMESPath

这是我想出了:

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

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

回答

9

你很近!虽然有几件事情:

  • 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 
       } 
      } 
     ] 
    } 
} 

让我们先从表达式的第一部分。你唯一需要的修复正在引号断空:

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

这将成功地过滤掉不Items元素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到最后一个表达式。如果你知道只有一个,你可以用另一个管道选择该元素,并且[0]

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

而你得到你想要的ID!

"foo" 
+2

谢谢你这个非常明确的解释! :-) –