2017-03-06 29 views
0

我的目標是使用aws cli s3api將當前爲GLACIER存儲類的所有文件轉換爲STANDARD。爲了做到這一點,我需要首先得到所有這些文件的列表,然後發出一個restore命令,並最終發出一個copy命令將它們全部更改爲STANDARD。AWS S3 - 如何獲取所有屬於GLACIER存儲類的文件

問題是,文件數量太大(〜500萬),如果最大項目超過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'怎麼樣?否則,我相信它正在嘗試構建一個巨大的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。希望這可以幫助任何需要實現相同目標的人。

相關問題