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

Cas*_*per 3 amazon-s3 amazon-web-services aws-cli

我的目标是使用aws cli s3api. 为了做到这一点,我需要首先获得所有这些文件的列表,然后发出一个restore命令,最后发出一个copy将它们全部更改为 STANDARD的命令。

问题是,文件数量太大(~500 万),core dump segmentation fault如果最大项目超过 600k 到 700k ,最终会导致错误。如果我不提供--max-item参数,我会得到同样的错误。所以我无法获得低于 700k 阈值的文件。这是我使用的命令:

aws s3api list-objects --bucket my-bucket --query 'Contents[?StorageClass==`GLACIER`]' --max-item 700000 > glacier.txt
Run Code Online (Sandbox Code Playgroud)

有什么解决方法吗?

Cas*_*per 7

所以我--starting-tokenlist-objects命令中发现了这个选项。所以我写了一个脚本来扫描 10 万个对象的所有项目。该脚本将输出一个包含所有 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."
Run Code Online (Sandbox Code Playgroud)

之后,我可以使用restore-object并最终copy-object将所有这些文件的存储类别更改为标准。在此处查看更多脚本。希望这可以帮助任何需要实现相同目标的人。