如何用JMESPath按双条件筛选AWS IAM MFA设备的SerialNumber
解决方案
你可以通过JMESPath的条件表达式实现需求,核心是先判断MFA设备总数,再分支处理:
aws iam list-mfa-devices --profile xxx --query 'length(MFADevices) == 1 ? MFADevices[0].SerialNumber : (MFADevices[].SerialNumber | [?contains(@, `cli`)] | [0])'
表达式逻辑拆解
- 判断设备总数:
length(MFADevices) == 1直接检查根节点下的MFADevices数组长度 - 分支处理:
- 当设备数为1时:直接取第一个设备的SerialNumber →
MFADevices[0].SerialNumber - 当设备数大于1时:先提取所有SerialNumber,再筛选包含
cli的项,最后取第一个匹配结果 →MFADevices[].SerialNumber | [?contains(@,cli)] | [0]
- 当设备数为1时:直接取第一个设备的SerialNumber →
场景验证
- 单个MFA设备场景:命令会直接输出该设备的SerialNumber
- 多个MFA设备场景:自动筛选出带
cli标识的设备SerialNumber;若无匹配项,返回null
之前表达式报错原因
你之前的错误是因为管道过滤后,上下文切换到了SerialNumber的数组,此时MFADevices已不在当前上下文内,length(MFADevices)会返回null,触发类型错误。上面的表达式始终基于根节点判断长度,避免了这个问题。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

