如何用AWS CLI的--query选项筛选含指定别名的CloudFront分发
AWS CloudFront CLI 查询:筛选包含特定别名的分发
问题描述
使用aws cloudfront list-distributions获取CloudFront分发列表时,尝试通过--query选项筛选出别名中同时包含sandbox和domain.com的分发,执行以下命令时出现错误:
aws cloudfront list-distributions --query 'DistributionList.Items[?contains(Aliases.Items[*], `sandbox`) && contains(Aliases.Items[*], `domain.com`)].[{Id:Id}]' --output json
错误信息:
In function contains(), invalid type for value: None, expected one of: ['array', 'string'], received: "null"
错误原因
- 空别名导致的null值:部分分发未配置自定义别名,此时
Aliases.Items为null,直接传入contains()函数会触发类型错误(contains()要求参数为数组或字符串)。 - 数组遍历语法错误:
contains(Aliases.Items[*], 'sandbox')的写法不符合JMESPath规范,无法正确遍历数组元素检查子串。
正确命令
根据需求分为两种场景:
场景1:别名列表中同时存在含sandbox和domain.com的别名(可不同别名)
aws cloudfront list-distributions --query 'DistributionList.Items[?Aliases.Items != null && (any(Aliases.Items[], contains(@, `sandbox`)) && any(Aliases.Items[], contains(@, `domain.com`)))].[{Id:Id}]' --output json
场景2:存在单个别名同时包含sandbox和domain.com
aws cloudfront list-distributions --query 'DistributionList.Items[?Aliases.Items != null && any(Aliases.Items[], contains(@, `sandbox`) && contains(@, `domain.com`))].[{Id:Id}]' --output json
语法说明
Aliases.Items != null:先过滤掉无自定义别名的分发,避免null值引发错误。any(Aliases.Items[], contains(@, 'xxx')):使用JMESPath的any()函数遍历别名数组,@代表当前遍历的数组元素,检查是否有任意元素包含指定子串。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

