2017-03-06 9 views
0

私の目標は、現在GLACIERストレージクラスのすべてのファイルをaws cli s3apiを使用してSTANDARDに変換することです。これを行うには、まずこれらすべてのファイルのリストを取得してから、restoreコマンドを実行し、最後にcopyコマンドを実行して、それらをすべて標準に変更する必要があります。AWS S3 - GLACIERストレージクラスのすべてのファイルを取得する方法

ファイルの数が大きすぎる(5百万回)ため、最大アイテムが600k〜700kを超えると最終的にcore dump segmentation faultというエラーが発生します。 --max-itemパラメータを指定しないと、同じエラーが発生します。だから私はもう700kのしきい値以下のファイルを得ることができませんでした。私が使用したコマンドは次のとおりです。

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

回避策はありますか?

+0

'--output text'についてはどうですか?それ以外の場合は、1つの巨大なJSONオブジェクトを作成しようとしていると思います。 –

+0

スクリプトは、GLACIERストレージクラスであるオブジェクトのみを保存します。 – Casper

+0

これはaws-cliの出力形式を変更することにどのように関連しているのか分かりません。他のものを保持して、そのオプションを追加することをお勧めします。それは動作しませんか? –

答えて

1

list-objectsコマンドから--starting-tokenというオプションが見つかりました。だから私は100kオブジェクトのバッチ内のすべてのアイテムをスキャンするスクリプトを書いた。このスクリプトはすべてのGLACIERオブジェクトのS3キーを含むファイルを出力します。

#!/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." 

その後、私はrestore-object使用することができ、最終的にcopy-object規格にすべてのこれらのファイルのストレージ・クラスを変更します。より多くのスクリプトhereを参照してください。これは、同じことを達成する必要のある人に役立ちます。

関連する問題