You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将Amazon Glacier对象永久迁移至S3标准存储层级

永久迁移Glacier Deep Archive对象至S3标准存储层级

你的代码仅发起了临时恢复请求(30天内可访问),并未完成永久迁移。要实现永久迁移,需先等待对象恢复至可访问状态,再通过复制操作生成Standard存储类的对象,具体逻辑和代码如下:

核心原理

Glacier Deep Archive对象无法直接转换存储类,必须先恢复到可读取状态,再通过复制操作创建一个存储类为STANDARD的新对象(可覆盖原对象或保留原对象)。

实现步骤与代码

  1. 发起恢复请求(设置足够天数确保复制操作完成)
  2. 轮询检查对象恢复状态,直到恢复完成
  3. 复制对象并指定存储类为STANDARD
  4. (可选)删除原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:15:33