如何按创建时间过滤AWS EBS卷并删除闲置1小时以上的可用卷
AWS EBS可用卷按创建时间筛选问题排查与解决方案
问题原因
- 筛选无返回结果的原因:你生成的比较时间仅精确到天(格式为
%Y-%m-%d),而AWS返回的CreateTime是带时分秒的ISO 8601格式字符串,jq默认按字典序比较字符串,只要卷是当天创建的,CreateTime的字符串前缀就和你生成的日期一致,后续字符更大,导致比较结果永远为假,自然没有返回。另外如果未指定UTC时区生成比较时间,也会因为时区偏差导致筛选错误。 - 不存在字段仍返回结果的原因:jq中读取不存在的字段会返回
null,而null在比较运算中永远小于任意字符串,因此select(.blabla < "任意字符串")的判断结果永远为真,会返回所有匹配前置过滤条件的卷,不会触发报错。
正确实现方法
推荐使用时间戳比较的方式,规避字符串字典序和时区问题:
# 仅筛选出创建超过1小时的可用卷ID aws ec2 describe-volumes --filters Name=status,Values=available | jq --arg cutoff "$(date -u --date='-1 hour' +%s)" '.Volumes[] | select(.CreateTime | fromdateiso8601 < ($cutoff | tonumber)) | .VolumeId'
如果需要直接批量删除符合条件的卷,使用以下命令:
# 批量删除创建超过1小时的可用EBS卷 aws ec2 describe-volumes --filters Name=status,Values=available | jq -r --arg cutoff "$(date -u --date='-1 hour' +%s)" '.Volumes[] | select(.CreateTime | fromdateiso8601 < ($cutoff | tonumber)) | .VolumeId' | xargs -I {} aws ec2 delete-volume --volume-id {}
命令说明:
date -u指定生成UTC时间,和AWS返回的CreateTime时区保持一致fromdateiso8601是jq内置函数,将ISO 8601格式的时间字符串转换为秒级时间戳-r参数让jq输出纯文本的卷ID,不需要引号包裹,方便后续管道传递给删除命令
内容的提问来源于stack exchange,提问作者NZL
相关产品推荐
相关产品推荐

