如何使用Ansible删除AWS S3存储桶中创建超过90天的对象
调整方案
你现有的aws_s3模块delobj模式不支持直接按创建时间过滤对象,需要先拉取指定前缀下的对象列表做时间筛选,再批量执行删除,完整调整后的代码如下:
# 第一步:拉取指定前缀下的所有S3对象列表 - name: fetch all objects under target prefix aws_s3: encrypt: yes aws_access_key: "{{ access_key }}" aws_secret_key: "{{ secret_key }}" bucket: "{{ bucket }}" prefix: "{{ database_name }}/" mode: list s3_url: "{{ s3_url}}" validate_certs: no register: s3_objects # 第二步:过滤出创建时间超过3个月的对象并删除 - name: delete objects older than 3 months aws_s3: encrypt: yes aws_access_key: "{{ access_key }}" aws_secret_key: "{{ secret_key }}" bucket: "{{ bucket }}" object: "{{ item.key }}" mode: delobj s3_url: "{{ s3_url}}" validate_certs: no loop: "{{ s3_objects.s3_keys | map('community.aws.s3_object_info', bucket=bucket, aws_access_key=access_key, aws_secret_key=secret_key, s3_url=s3_url, validate_certs=no) | list | selectattr('last_modified', 'lt', ('-3 months' | to_datetime)) | list }}" # 用相对时间'-3 months'做时间判断,自动适配不同月份的天数差异,比固定秒数计算更精准
注意事项
- 若你使用的Ansible版本较低,不支持
community.aws.s3_object_info过滤器,可以替换为单独调用community.aws.s3_object_info模块拉取对象元数据再过滤,逻辑完全一致。 - 正式执行删除前建议添加
--check参数做试运行,确认要删除的对象符合预期,避免误删。 - 原有代码里的
marker参数不需要保留,拉取对象列表时模块会自动处理分页逻辑。
内容的提问来源于stack exchange,提问作者Ravi Shankar
相关产品推荐
相关产品推荐

