如何删除创建时间超过30天的AWS AMI
实现保留30天的AMI备份清理策略
核心步骤说明
要从“删除前一天AMI”切换到“删除30天前的AMI”,需要分两步:生成30天前的标准日期,再通过JMESPath查询筛选出符合条件的AMI ID。
1. 生成30天前的UTC格式日期
AWS的AMI创建日期(CreationDate)采用UTC时区的ISO 8601格式(例如2024-05-20T08:30:00.000Z),先通过date命令生成对应的日期字符串:
THIRTY_DAYS_AGO=$(date -d "-30 days" --utc +%Y-%m-%dT%H:%M:%SZ)
2. 查询并获取30天前的AMI ID
修改原有的describe-images命令,使用JMESPath的条件筛选语法,只返回创建时间早于等于30天前的AMI ID:
OLD_AMI_IDs=$(/usr/bin/aws ec2 describe-images \ --owners ########## \ --filters "Name=tag:Backup,Values=TRUE" "Name=tag:InstanceID,Values=$I_ID" \ --query "Images[?CreationDate <= '$THIRTY_DAYS_AGO'].ImageId" \ --output text)
--query参数里的[?CreationDate <= '$THIRTY_DAYS_AGO']用于筛选符合日期条件的AMI,再提取ImageId字段- 保留原有的标签过滤条件,确保只清理目标实例的备份AMI
3. 批量删除旧AMI及关联快照
获取到旧AMI ID后,循环执行注销AMI和删除关联快照的操作(AMI注销后快照不会自动删除,需手动清理):
for ami_id in $OLD_AMI_IDs; do # 注销AMI aws ec2 deregister-image --image-id "$ami_id" # 获取关联的快照ID并删除 snapshot_id=$(aws ec2 describe-images --image-id "$ami_id" --query "Images[0].BlockDeviceMappings[0].Ebs.SnapshotId" --output text) aws ec2 delete-snapshot --snapshot-id "$snapshot_id" done
为什么之前的尝试无效?
你之前使用--query="Images[*].{date:CreationDate}"仅返回了创建日期,但没有结合日期对比条件筛选,也没有关联到需要删除的AMI ID。只有先生成标准对比日期,再通过JMESPath的条件表达式筛选,才能精准定位到需要清理的旧AMI。
内容的提问来源于stack exchange,提问作者Alan Cunnane
相关产品推荐
相关产品推荐

