如何通过AWS CLI查询早于指定日期的ElastiCache快照名称
解决ElastiCache快照查询返回空的问题
你的查询返回空主要有3个核心问题,逐一修正后就能拿到目标快照名称:
问题1:时间类型不匹配
API返回的SnapshotCreateTime是毫秒级时间戳(比如示例里的1667246439000对应2022-10-31),你直接用字符串日期2022-10-01比较会完全不匹配。需要先把目标日期转成毫秒时间戳,或者用JMESPath的日期转换函数处理后再比较。
问题2:过滤逻辑搞反
你要的是早于指定日期的快照,但原查询用了>(大于),应该改成<(小于)。
问题3:结构遍历错误
原查询里的[?not_null(node)]完全无效(没有node字段),而且你需要的是上层的SnapshotName,不是NodeSnapshots的子字段,得用嵌套遍历同时关联快照名称。
修正后的完整命令
方法1:直接用毫秒时间戳(推荐,性能更好)
先把2022-10-01 00:00:00转成毫秒时间戳1664582400000,直接用这个值查询:
aws elasticache describe-snapshots \ --region ap-southeast-1 \ --query 'Snapshots[?SnapshotSource==`manual`].{Name:SnapshotName, NodeSnapshots:NodeSnapshots[?SnapshotCreateTime < `1664582400000`]} | [?NodeSnapshots != `[]`].Name'
方法2:用JMESPath日期转换函数(更直观)
如果不想手动转时间戳,可以用to_date_time()把毫秒时间戳转成日期对象再比较:
aws elasticache describe-snapshots \ --region ap-southeast-1 \ --query 'Snapshots[?SnapshotSource==`manual`].{Name:SnapshotName, NodeSnapshots:NodeSnapshots[?to_date_time(SnapshotCreateTime/1000) < to_date_time(`2022-10-01`)]} | [?NodeSnapshots != `[]`].Name'
额外说明
- 如果需要包含自动快照,去掉
--snapshot-source "manual"参数,或者删除查询里的SnapshotSource==manual``条件。 - 示例返回的快照是
automated类型,原命令用--snapshot-source "manual"会直接过滤掉它,这也是返回空的原因之一。
内容的提问来源于stack exchange,提问作者Sharan Chhibber
相关产品推荐
相关产品推荐

