如何从Glacier将文件夹(或整个存储桶)还原到Amazon S3?

Tyl*_*erW 37 amazon-s3 amazon-web-services amazon-glacier

我在Amazon S3上更改了一堆我的存储桶的生命周期,因此他们的存储类设置为Glacier.我是使用在线AWS控制台完成的.我现在再次需要这些文件.

我知道如何将它们恢复到每个文件的S3.但我的桶有数千个文件.我想看看是否有办法将整个桶恢复到S3,就像有办法将整个桶送到Glacier一样?

我猜有一种编程解决方案的方法.但我想知道是否有办法在控制台中执行此操作.还是用另一个程序?或者其他我可能会失踪的东西?

Nat*_*Fox 59

如果您使用,s3cmd您可以使用它轻松地递归恢复:

s3cmd restore --recursive s3://mybucketname/ 
Run Code Online (Sandbox Code Playgroud)

我也用它来恢复文件夹:

s3cmd restore --recursive s3://mybucketname/folder/
Run Code Online (Sandbox Code Playgroud)

  • 您还可以按照[here](http://s3tools.org/usage)的说明,通过添加`--restore-priority = bulk`来为“ restore”命令指定归档检索选项(快速,标准,批量)。 (3认同)
  • 对于MacOS X用户,只需下载s3cmd,解压缩并运行“ sudo python setup.py install”。要将IAM(AWS)密钥包含在命令中,请运行... s3cmd restore --recursive --access_key = {您的访问密钥在这里} --secret_key = {您的秘密密钥在这里} s3:// ms4pro / (2认同)
  • `-D NUM,--restore-days = NUM​​`保持恢复文件可用的天数(仅适用于'restore'命令)。 (2认同)

小智 33

如果您正在使用AWS CLI工具(这很好,您应该),您可以这样做:

aws s3 ls s3://<bucket_name> | awk '{print $4}' | xargs -L 1 aws s3api restore-object --restore-request Days=<days> --bucket <bucket_name> --key
Run Code Online (Sandbox Code Playgroud)

替换<bucket_name>为您想要的存储桶名称.

替换<days>为要还原对象的天数.

  • 感谢您的回答。我要补充的是,此解决方案仅在键中没有空格时才有效!为了处理空格,您需要将 awk 命令替换为 awk '{print substr($0, index($0, $4))}' 感谢 http://stackoverflow.com/questions/13446255/how-to-remove -the-first-two-columns-in-a-file-using-shell-awk-sed-whatever (2认同)
  • 你需要使用xargs -I %%% -L 1 aws s3api restore-object --restore-request Days = <days> --bucket <bucket_name> --key"%%%"以便引用包含的字符串空格作为restore命令的一部分. (2认同)

Dom*_* D. 14

上面的答案对我来说效果不好,因为我的水桶与冰川上的物体混合在一起,有些则没有.对我来说最简单的事情是创建存储桶中所有 GLACIER对象的列表,然后尝试单独还原每个对象,忽略任何错误(如已在进行中,而不是对象等).

  1. 获取存储桶中所有GLACIER文件(密钥)的列表

    aws s3api list-objects-v2 --bucket <bucketName> --query "Contents[?StorageClass=='GLACIER']" --output text | awk '{print $2}' > glacier-restore.txt

  2. 创建一个shell脚本并运行它,替换"bucketName".

    #!/bin/sh
    
    for x in `cat glacier-restore.txt`
      do
        echo "Begin restoring $x"
        aws s3api restore-object --restore-request Days=7 --bucket <bucketName> --key "$x"
        echo "Done restoring $x"
      done
    
    Run Code Online (Sandbox Code Playgroud)

幸得乔希在http://capnjosh.com/blog/a-client-error-invalidobjectstate-occurred-when-calling-the-copyobject-operation-operation-is-not-valid-for-the-source-objects -storage-class /,我在尝试上述一些解决方案后找到的资源.

  • 需要使用“DEEP_ARCHIVE”而不是“GLACIER”来捕获深层冰川中的文件。 (3认同)
  • 尝试 `awk 'BEGIN {FS="\t"}; {print $2}'` 来处理其中包含空格的文件 (2认同)
  • 恕我直言,这是最好的答案,在执行昂贵的操作之前检查(可能很大的)对象列表也很好 (2认同)
  • 文件恢复后,可以通过使用 `aws s3 cp "s3://&lt;bucket&gt;/$x" "s3://&lt;bucket&gt;/$x 再次运行 for 循环,将它们切换回标准存储类“--存储级别标准` (2认同)

Mic*_*bot 11

没有内置工具.S3中的"文件夹"是人类方便的幻觉,基于对象键(路径/文件名)中的正斜杠,迁移到冰川的每个对象都必须单独恢复,尽管......

当然,您可以编写一个脚本来遍历层次结构,并使用您选择的编程语言中的SDK或REST API发送这些恢复请求.

在继续之前,请务必了解从冰川恢复到S3的工作原理.它始终只是一个临时恢复,您可以选择每个对象在S3中保留的天数,然后再恢复为仅存储在冰川中.

此外,您希望确定您了解在短时间内恢复过多冰川数据的罚款,或者您可能会花费一些意外费用.根据紧急程度,您可能希望在几天或几周内将恢复操作分散开来.

  • AWS修订了Glacier修复费用; 现在这是一个简单的每GB技术恢复成本(基于紧急程度或缺乏三层). (4认同)
  • 感谢您的评论,注意成本 - 几乎在那里犯了一个严重的错误. (2认同)

SR.*_*SR. 5

我最近需要还原整个存储桶及其所有文件和文件夹。您将需要使用凭据配置的s3cmd和aws cli工具来运行此工具。

我发现这非常强大,可以处理可能已经有还原请求的存储桶中特定对象的错误。

#!/bin/sh

# This will give you a nice list of all objects in the bucket with the bucket name stripped out
s3cmd ls -r s3://<your-bucket-name> | awk '{print $4}' | sed 's#s3://<your-bucket-name>/##' > glacier-restore.txt

for x in `cat glacier-restore.txt`
do
    echo "restoring $x"
    aws s3api restore-object --restore-request Days=7 --bucket <your-bucket-name> --profile <your-aws-credentials-profile> --key "$x"
done
Run Code Online (Sandbox Code Playgroud)


Sta*_*lav 5

这是我的界面版本aws cli以及如何从冰川恢复数据。我修改了上面的一些示例,以便在要恢复的文件的密钥包含空格时起作用。

# Parameters
BUCKET="my-bucket" # the bucket you want to restore, no s3:// no slashes
BPATH="path/in/bucket/" # the objects prefix you wish to restore (mind the `/`) 
DAYS=1 # For how many days you wish to restore the data.

# Restore the objects
aws s3 ls s3://${BUCKET}/${BPATH} --recursive | \
awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}'| \
xargs -I {} aws s3api restore-object --restore-request Days=${DAYS} \
--bucket ${BUCKET} --key "{}"
Run Code Online (Sandbox Code Playgroud)