AWS S3 - 如何获取所有属于 GLACIER 存储类别的文件

问题描述 投票:0回答:3

我的目标是使用

aws cli s3api
将当前 GLACIER 存储类别的所有文件转换为 STANDARD。为此,我需要首先获取所有这些文件的列表,然后触发
restore
命令,最后触发
copy
命令将它们全部更改为标准。

问题是,文件数量太大(约 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

有什么解决办法吗?

amazon-web-services amazon-s3 aws-cli
3个回答
7
投票

所以我从

--starting-token
命令中发现了
list-objects
选项。因此,我编写了一个脚本来扫描 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
将所有这些文件的存储类别更改为 STANDARD。请参阅此处了解更多脚本。希望这可以帮助任何需要实现同样目标的人。


2
投票

这是一种衬垫解决方案

 aws s3api list-objects --bucket *bucket-name*| grep "StorageClass" > nonglacier.txt

然后你可以使用 grep storage class

cat nonglacier.txt | grep GLACIER | wc -l

也可以概括为

aws s3api list-objects --bucket <bucket-name>| grep "StorageClass" |  grep GLACIER | wc -l

0
投票

更好

aws s3api list-objects --bucket "foobar" --query 'Contents[?StorageClass==`GLACIER`].Key' --output text  >> allGlacier.txt

© www.soinside.com 2019 - 2024. All rights reserved.