AWS CLI和JMESPath

Jer*_*obs 7 amazon-web-services amazon-cloudfront aws-cli jmespath

我想使用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}"
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*ips 13

你非常接近!但有几点:

  • 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
                }
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们从表达式的第一部分开始.您需要的唯一修复是将引号关闭为null:

DistributionList.Items[?Aliases.Items!=null]
Run Code Online (Sandbox Code Playgroud)

这将成功地过滤掉不元素ItemsAlias.如果你停在这里,你会得到什么,以及在管道之后你需要做些什么:

[
  {
    "Id": "foo",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.mycompany.com"
      ]
    }
  },
  {
    "Id": "bar",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.othercompany.com"
      ]
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

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

所以现在我们想要过滤特定的CNAME.让我们忽略同义反复== true.

[?contains(Aliases.Items, 'cname.cdn.mycompany.com')]
Run Code Online (Sandbox Code Playgroud)

所以现在的完整表达是:

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

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

[
  {
    "Id": "foo",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.mycompany.com"
      ]
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

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

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

你得到你想要的Id!

"foo"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你这个非常明确的解释!:-) (3认同)