2016-02-23 7 views
4

Je souhaite utiliser l'outil CLI pour récupérer l'ID de distribution d'une distribution CloudFront avec un nom/alias spécifique.AWS CLI et JMESPath

C'est ce que je suis venu avec:

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

Je ne suis pas un expert en JMESPath, et je ne comprends pas pourquoi ma requête ne retourne pas de résultat. Une distribution avec le domaine spécifié en tant qu'alias existe.

Répondre

9

Vous êtes très proche! Quelques choses cependant:

  • null n'est pas 'null'
  • Après la conduite que vous allez travailler avec les résultats de la première expression
  • comme null, true n'est pas une chaîne (== true est également redondant)

jmespath.org A un éditeur en direct que vous pouvez utiliser pour tester des expressions. Voici une JSON simplifiée que nous pouvons utiliser pour tester ce cas:

{ 
    "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 
       } 
      } 
     ] 
    } 
} 

Commençons par la première partie de l'expression. La seule solution dont vous avez besoin est de prendre les citations de null:

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

qui filtrera avec succès des éléments sans Items sous Alias. Voici ce que vous revenez si vous me suis arrêté là, et ce que vous aurez à travailler avec le tuyau après:

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

Notez qu'il n'y a pas DistributionList.Items plus.

Alors maintenant, nous voulons filtrer pour un CNAME spécifique. Laissons de côté la tautologie == true.

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

Ainsi, la pleine expression est maintenant:

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

Et le résultat est la liste filtrée avec succès:

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

Maintenant, si vous voulez que les numéros d'identification des éléments correspondants, il suffit d'ajouter .Id à cette dernière expression. Si vous savez qu'il n'y en aura qu'un, vous pouvez simplement sélectionner cet élément avec un autre tuyau et [0].

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

Et vous obtenez l'Id que vous voulez!

"foo" 
+2

Merci pour cette explication très claire! :-) –