EBS快照是否成功迁移至Glacier?及归档检索问题咨询
问题分析与解决方案
一、EBS快照未正确迁移至Glacier的原因
你遇到的存储大小不匹配问题,核心原因是你的脚本根本没上传快照的实际数据,只是把快照ID字符串传到了Glacier!
看这段关键代码:
for snap in snapshots: response_vault = client.upload_archive( vaultName='myvault', archiveDescription='sampe description', body=snap )
这里的body=snap传入的是snap-xxxxxx这类短字符串(比如snap-0dc11fa8b39147491),而非快照的二进制内容。所以Glacier里的归档只是这些几十字节的字符串,自然大小远小于10GB的快照。
正确的迁移步骤
EBS快照不能直接通过Glacier客户端上传,必须先导出到S3再迁移:
- 导出快照到S3:使用EC2的
create_snapshot_export_taskAPI,把快照导出到指定S3桶(需提前配置好桶权限、IAM角色等)。
示例代码:ec2 = session.client('ec2', region_name='ap-south-1') export_response = ec2.create_snapshot_export_task( SnapshotId='snap-xxxxxx', Description='Export snapshot to S3', DestinationBucket='your-target-s3-bucket', DestinationPrefix='exported-snapshots/' ) - 迁移到Glacier:推荐用S3生命周期规则,把导出的快照对象自动转换到Glacier存储类;也可以下载S3对象后再用Glacier客户端上传,但前者更高效。
另外,AWS原生的**EBS快照归档(Snapshot Archive)**功能可以直接把快照归档到Glacier层,不需要手动导出到S3,操作更省心,你可以优先考虑。
二、未指定S3桶时如何获取归档内容
当你发起archive-retrieval任务却没指定S3桶时,AWS会暂存检索后的内容,按以下步骤即可获取:
等待检索任务完成:
- 你已经配置了SNS主题,任务完成时会收到包含Job ID的通知。
- 也可以轮询
describe_jobAPI检查状态:import time job_id = response['jobId'] while True: job_status = client.describe_job(vaultName='myvault', jobId=job_id) if job_status['Completed']: break time.sleep(3600) # 标准检索通常需3-5小时,每小时轮询一次即可
读取并保存归档内容:
任务完成后,调用get_job_output获取StreamingBody,再按块读取保存到本地:response = client.get_job_output( vaultName='myvault', jobId=job_id ) streaming_body = response['body'] # 保存到本地文件 with open('retrieved_archive.data', 'wb') as f: for chunk in streaming_body.iter_chunks(chunk_size=1024*1024): f.write(chunk)StreamingBody是可迭代对象,按块读取能避免内存溢出。
内容的提问来源于stack exchange,提问作者py_py
相关产品推荐
相关产品推荐

