2016-03-25 13 views
1

Mein Workflow hat eine TAR-Datei von S3 heruntergeladen, erweitert, dann möchte ich sie optional in einen Gletschertresor hochladen. Da im S3-Bucket noch andere Dateien vorhanden sind, möchte ich das Lebenszyklusmanagement nicht verwenden. Ich habe all dies funktioniert unter boto3boto3 eine Zeichenkette in die Gletscherdatei hochladen

Ich habe vor kurzem festgestellt, dass, anstatt in eine Datei auf der Festplatte herunterladen kann ich in ein String-Objekt herunterladen und darauf arbeiten, die das Dekomprimieren macht viel schneller, da ich die Platte nicht berühren muss.

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") 

Wenn ich Gletscher über boto3 hochladen möchten, ist hier, was ich habe:

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

Und das fängt mich:

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

Irgendwelche Gedanken?

+0

Liest du den gleichen Körper zweimal? Ein 'StreamingBody' streamt von einem Socket und kann daher nur einmal gelesen werden. –

+0

Guter Anruf. Ich habe die Ergebnisse von 'response [' Body ']. Read() 'gespeichert und dann an den zwei Stellen verwendet, und es scheint zu funktionieren. Mach das zur Antwort. – mkomarinski

Antwort

1

Die StreamingBody ist ein nicht suchbarer Stream, es liest direkt aus der Steckdose, so dass Sie nur eine read erhalten. Sie müssen die Bytes speichern, wenn Sie sie an mehreren Orten verwenden möchten.

Verwandte Themen