2016-03-25 12 views
1

私のワークフローにはS3からダウンロードしたtarファイルがあり、展開して氷河のボールトにアップロードすることもできます。 S3バケットに他のファイルがあることを考えると、私はライフサイクル管理を使いたくないです。私はこれをすべてbotoの下で動作させていて、ゆっくりとboto3にアップグレードしていますboto3文字列を氷河ファイルにアップロード

私は最近、オンディスクファイルにダウンロードするのではなく、文字列オブジェクトにダウンロードして操作することで、私はディスクに触れる必要がないので、より高速です。

s3 = boto3.client('s3') 
response = s3.get_object(Bucket=bucket,Key=path) 
my_file = tarfile.open(fileobj=(StringIO(response['Body'].read()))) 
my_file.extractall(path="EXTRACTPATH") 

私はboto3経由氷河にアップロードしたい場合は、ここで私が持っているものです。

glacier = boto3.client('glacier', region_name='MYREGION') 
archive = glacier.upload_archive(vaultName='MYVAULT', archiveDescription=filename, body=response['Body'].read()) 

そして、それは私をネット:

botocore.exceptions.ClientError: An error occurred (InvalidParameterValueException) when calling the UploadArchive operation: Invalid Content-Length: 0 

任意の考えは?

+0

同じ身体を2回読んでいますか? 'StreamingBody'はソケットからストリーミングされるため、一度しか読み込めません。 –

+0

よろしくお願いします。私は 'response ['Body']。read()'の結果を2つの場所で使用していたので、動作するようです。それを答えてください。 – mkomarinski

答えて

1

StreamingBodyはシーク不可能なストリームであり、ソケットから直接読み取るので、1つだけreadが得られます。複数の場所で使用する場合は、バイトを保存する必要があります。

関連する問題