2017-03-06 2 views
0

Mein Ziel ist es, alle Dateien, die derzeit GLACIER-Speicherklasse sind, unter Verwendung von aws cli s3api in STANDARD zu konvertieren. Um dies zu tun, muss ich zunächst eine Liste aller dieser Dateien abrufen und dann einen restore Befehl und schließlich einen copy Befehl auslösen, um alle auf STANDARD zu ändern.AWS S3 - So erhalten Sie alle Dateien, die GLACIER-Speicherklasse sind

Das Problem ist, die Anzahl der Dateien sind zu groß (~ 5 Millionen), was schließlich in core dump segmentation fault Fehler führt, wenn der maximale Artikel 600k bis 700k überschreitet. Wenn ich den --max-item Parameter nicht liefern würde, würde ich den gleichen Fehler erhalten. So konnte ich keine Dateien unter 700k Schwelle bekommen. Hier ist der Befehl, den ich verwendet habe:

aws s3api list-objects --bucket my-bucket --query 'Contents[?StorageClass==`GLACIER`]' --max-item 700000 > glacier.txt 

Gibt es eine Umgehungslösung?

+0

Wie wäre es mit '--output text'? Ansonsten glaube ich, dass es versucht, ein riesiges JSON-Objekt zu bauen. –

+0

Das Skript speichert nur die Objekte, die die GLACIER-Speicherklasse sind. – Casper

+0

Okay, aber ich verstehe nicht, wie das mit dem Ändern des Ausgabeformats von aws-cli zusammenhängt. Ich schlage vor, dass Sie * diese Option hinzufügen und die anderen beibehalten. Funktioniert das nicht? –

Antwort

1

So entdeckte ich die Option --starting-token von list-objects Befehl. Also schrieb ich ein Skript, um alle Objekte im Batch von 100k Objekten zu scannen. Dieses Skript gibt eine Datei aus, die den S3-Schlüssel aller GLACIER-Objekte enthält.

#!/bin/bash 
BUCKET="s3-bucket-name" 
PREFIX="foldername" 
PROFILE="awscliprofile" 
MAX_ITEM=100000 

var=0 
NEXT_TOKEN=0 
while true; do 

    var=$((var+1)) 

    echo "Iteration #$var - Next token: $NEXT_TOKEN" 

    aws s3api list-objects \ 
    --bucket $BUCKET \ 
    --prefix $PREFIX \ 
    --profile $PROFILE \ 
    --max-item $MAX_ITEM \ 
    --starting-token $NEXT_TOKEN > temp 

    awk '/GLACIER/{getline; print}' temp >> glacier.txt 

    NEXT_TOKEN=$(cat temp | grep NextToken | awk '{print $2}' | sed 's/\("\|",\)//g') 
    if [ ${#NEXT_TOKEN} -le 5 ]; then 
     echo "No more files..." 
     echo "Next token: $NEXT_TOKEN" 
     break 
     rm temp 
    fi 
    rm temp 
done 
echo "Exiting." 

Danach kann ich restore-object und schließlich copy-object die Speicherklasse aller dieser Dateien auf STANDARD ändern. Weitere Skripts finden Sie unter here. Hoffe, das hilft jedem, der dasselbe erreichen muss.

Verwandte Themen