如何用Python将Amazon Glacier对象永久迁移至S3标准存储层级
永久迁移Glacier Deep Archive对象至S3标准存储层级
你的代码仅发起了临时恢复请求(30天内可访问),并未完成永久迁移。要实现永久迁移,需先等待对象恢复至可访问状态,再通过复制操作生成Standard存储类的对象,具体逻辑和代码如下:
核心原理
Glacier Deep Archive对象无法直接转换存储类,必须先恢复到可读取状态,再通过复制操作创建一个存储类为STANDARD的新对象(可覆盖原对象或保留原对象)。
实现步骤与代码
- 发起恢复请求(设置足够天数确保复制操作完成)
- 轮询检查对象恢复状态,直到恢复完成
- 复制对象并指定存储类为
STANDARD - (可选)删除原Glacier层级的对象
import boto3 import time def restore_and_migrate_object(latest_object): s3 = boto3.resource('s3') my_bucket = s3.Bucket('bucket_name') for bucket_object in my_bucket.objects.all(): object_key = bucket_object.key # 仅处理目标对象且存储类为Glacier Deep Archive if bucket_object.storage_class == "GLACIER_DEEP_ARCHIVE" and object_key in latest_object: # 1. 发起恢复请求(设置7天有效期,足够完成复制) if not bucket_object.restore: # 避免重复发起恢复请求 print(f"发起恢复请求: {object_key}") bucket_object.restore_object( RestoreRequest={ 'Days': 7, 'Tier': 'Standard' } ) # 2. 轮询等待恢复完成(Glacier Deep Archive标准恢复需约12小时) while True: obj = s3.Object('bucket_name', object_key) obj.load() # 刷新对象状态 restore_status = obj.restore if restore_status and "ongoing-request=\"false\"" in restore_status: print(f"{object_key} 恢复完成") break print(f"等待恢复中: {object_key}") time.sleep(300) # 每5分钟检查一次状态 # 3. 复制对象并设置为Standard存储类(覆盖原对象) print(f"开始迁移 {object_key} 至Standard存储类") s3.meta.client.copy_object( Bucket='bucket_name', Key=object_key, CopySource={'Bucket': 'bucket_name', 'Key': object_key}, StorageClass='STANDARD' ) # 4. 可选:删除原Glacier对象(若无需保留归档副本) # obj.delete() print(f"{object_key} 迁移完成")
关键注意事项
- 恢复等待时长:Glacier Deep Archive的Standard恢复 tier通常需要12小时左右,因此轮询间隔设置为5分钟较为合理
- 复制逻辑:使用相同Key复制会覆盖原对象,新对象存储类为Standard;若需保留原归档对象,可指定新的Key
- 成本说明:恢复操作会产生数据检索费用,复制操作会产生存储和请求费用,需留意AWS账单
内容的提问来源于stack exchange,提问作者Tony Frank
相关产品推荐
相关产品推荐

