使用 Boto 从 AWS Glacier 下载大型档案
Downloading a large archive from AWS Glacier using Boto
我正在尝试使用 Python 软件包 Boto 从 Glacier 下载大型存档(~ 1 TB)。我使用的当前方法如下所示:
import os
import boto.glacier
import boto
import time
ACCESS_KEY_ID = 'XXXXX'
SECRET_ACCESS_KEY = 'XXXXX'
VAULT_NAME = 'XXXXX'
ARCHIVE_ID = 'XXXXX'
OUTPUT = 'XXXXX'
layer2 = boto.connect_glacier(aws_access_key_id = ACCESS_KEY_ID,
aws_secret_access_key = SECRET_ACCESS_KEY)
gv = layer2.get_vault(VAULT_NAME)
job = gv.retrieve_archive(ARCHIVE_ID)
job_id = job.id
while not job.completed:
time.sleep(10)
job = gv.get_job(job_id)
if job.completed:
print "Downloading archive"
job.download_to_file(OUTPUT)
问题是作业 ID 会在 24 小时后过期,这段时间不足以检索整个档案。我需要将下载分成至少 4 个部分。我该怎么做并将输出写入单个文件?
好像调用job.download_to_file
时直接指定chunk_size
参数就可以了:
if job.completed:
print "Downloading archive"
job.download_to_file(OUTPUT, chunk_size=1024*1024)
但是,如果你不能在 24 小时内下载所有的块,我认为你不能选择只下载你使用 layer2 错过的那个。
第一种方法
使用 layer1 你可以简单地使用方法 get_job_output 并指定你想要下载的字节范围。
看起来像这样:
file_size = check_file_size(OUTPUT)
if job.completed:
print "Downloading archive"
with open(OUTPUT, 'wb') as output_file:
i = 0
while True:
response = gv.get_job_output(VAULT_NAME, job_id, (file_size + 1024 * 1024 * i, file_size + 1024 * 1024 * (i + 1)))
output_file.write(response)
if len(response) < 1024 * 1024:
break
i += 1
使用此脚本,您应该能够在脚本失败时重新运行该脚本,并继续从您离开的位置下载您的存档。
第二种方法
通过挖掘 boto 代码,我在作业 class 中找到了一个 "private" 方法,您也可以使用它:_download_byte_range。使用此方法您仍然可以使用 layer2.
file_size = check_file_size(OUTPUT)
if job.completed:
print "Downloading archive"
with open(OUTPUT, 'wb') as output_file:
i = 0
while True:
response = job._download_byte_range(file_size + 1024 * 1024 * i, file_size + 1024 * 1024 * (i + 1)))
output_file.write(response)
if len(response) < 1024 * 1024:
break
i += 1
您必须在 boto.connect_glacier
函数中添加 region_name,如下所示:
layer2 = boto.connect_glacier(aws_access_key_id = ACCESS_KEY_ID,
aws_secret_access_key = SECRET_ACCESS_KEY,
region_name = 'your region name')
我正在尝试使用 Python 软件包 Boto 从 Glacier 下载大型存档(~ 1 TB)。我使用的当前方法如下所示:
import os
import boto.glacier
import boto
import time
ACCESS_KEY_ID = 'XXXXX'
SECRET_ACCESS_KEY = 'XXXXX'
VAULT_NAME = 'XXXXX'
ARCHIVE_ID = 'XXXXX'
OUTPUT = 'XXXXX'
layer2 = boto.connect_glacier(aws_access_key_id = ACCESS_KEY_ID,
aws_secret_access_key = SECRET_ACCESS_KEY)
gv = layer2.get_vault(VAULT_NAME)
job = gv.retrieve_archive(ARCHIVE_ID)
job_id = job.id
while not job.completed:
time.sleep(10)
job = gv.get_job(job_id)
if job.completed:
print "Downloading archive"
job.download_to_file(OUTPUT)
问题是作业 ID 会在 24 小时后过期,这段时间不足以检索整个档案。我需要将下载分成至少 4 个部分。我该怎么做并将输出写入单个文件?
好像调用job.download_to_file
时直接指定chunk_size
参数就可以了:
if job.completed:
print "Downloading archive"
job.download_to_file(OUTPUT, chunk_size=1024*1024)
但是,如果你不能在 24 小时内下载所有的块,我认为你不能选择只下载你使用 layer2 错过的那个。
第一种方法
使用 layer1 你可以简单地使用方法 get_job_output 并指定你想要下载的字节范围。
看起来像这样:
file_size = check_file_size(OUTPUT)
if job.completed:
print "Downloading archive"
with open(OUTPUT, 'wb') as output_file:
i = 0
while True:
response = gv.get_job_output(VAULT_NAME, job_id, (file_size + 1024 * 1024 * i, file_size + 1024 * 1024 * (i + 1)))
output_file.write(response)
if len(response) < 1024 * 1024:
break
i += 1
使用此脚本,您应该能够在脚本失败时重新运行该脚本,并继续从您离开的位置下载您的存档。
第二种方法
通过挖掘 boto 代码,我在作业 class 中找到了一个 "private" 方法,您也可以使用它:_download_byte_range。使用此方法您仍然可以使用 layer2.
file_size = check_file_size(OUTPUT)
if job.completed:
print "Downloading archive"
with open(OUTPUT, 'wb') as output_file:
i = 0
while True:
response = job._download_byte_range(file_size + 1024 * 1024 * i, file_size + 1024 * 1024 * (i + 1)))
output_file.write(response)
if len(response) < 1024 * 1024:
break
i += 1
您必须在 boto.connect_glacier
函数中添加 region_name,如下所示:
layer2 = boto.connect_glacier(aws_access_key_id = ACCESS_KEY_ID,
aws_secret_access_key = SECRET_ACCESS_KEY,
region_name = 'your region name')