Python调用S3 restore_object转归档对象到STANDARD遇MalformedXML错误求助
解决AWS S3归档类对象转STANDARD存储类的问题
问题分析
你用restore_object带OutputLocation参数报错,是因为这个参数的作用是将恢复的归档对象导出到指定的S3位置,并非修改原对象的存储类。你的参数里把Prefix设为完整的对象key,不符合API的XML schema要求,所以触发MalformedXML错误。
另外,仅用days参数的临时恢复不会永久改变存储类,这确实不是你要的效果。
正确实现步骤
要永久将GLACIER/DEEP_ARCHIVE对象转为STANDARD,需要分两步:
- 提交恢复请求,等待归档对象变为可访问状态
- 将恢复后的对象复制到同一个key,通过
copy操作修改存储类(S3允许同桶同key复制,会覆盖原对象并更新存储类)
代码示例
import boto3 import time # 初始化S3客户端 session = boto3.Session(...) # 填入你的凭证/配置 s3_client = session.client('s3') bucket_name = 'my-bucket-name' object_key = 'file.txt' # 提交恢复请求 def restore_archived_object(bucket, key): try: s3_client.restore_object( Bucket=bucket, Key=key, RestoreRequest={ 'Days': 7, # 临时保留恢复状态的天数,按需设置 'GlacierJobParameters': { 'Tier': 'Expedited' # 恢复优先级,可选Expedited/Standard/Bulk } } ) print(f"恢复请求已提交,等待对象变为可用状态...") except Exception as e: if 'ObjectRestoreInProgress' in str(e): print(f"对象已在恢复中") else: raise e # 检查对象是否恢复完成 def is_object_restored(bucket, key): obj = s3_client.head_object(Bucket=bucket, Key=key) return 'Restore' in obj and obj['Restore'] == 'ongoing-request="false"' # 执行恢复并等待完成 restore_archived_object(bucket_name, object_key) while not is_object_restored(bucket_name, object_key): time.sleep(60) # 每分钟检查一次,根据恢复层级调整等待时间 print("对象已恢复完成") # 复制对象到同一个key,修改存储类为STANDARD s3_client.copy_object( Bucket=bucket_name, Key=object_key, CopySource={'Bucket': bucket_name, 'Key': object_key}, StorageClass='STANDARD', MetadataDirective='COPY' # 复制原对象的元数据 ) print(f"对象{object_key}已成功转为STANDARD存储类")
关键说明
- 恢复层级:
Expedited最快(1-5分钟)但费用最高,Standard3-5小时,Bulk5-12小时,根据你的需求选择 - 复制操作:同key复制会自动替换原对象,同时将存储类更新为STANDARD,这是永久修改
- 恢复状态检查:通过
head_object的Restore字段判断是否恢复完成,ongoing-request="false"表示恢复完成
内容的提问来源于stack exchange,提问作者Sotosoul
相关产品推荐
相关产品推荐

