2016-02-23 62 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

謝謝你這個非常明確的解釋! :-) –