AWS S3 Glacier - 以编程方式启动还原

Ram*_*muk 6 amazon-s3 amazon-web-services amazon-glacier

我一直在使用s3编写一个web应用程序用于存储和冰川备份.所以我设置了生命周期策略来存档它.现在我想编写一个列出已归档文件的webapp,用户应该可以从此启动还原,然后在还原完成后收到电子邮件.

现在我遇到的麻烦是我找不到我可以发出启动恢复的php sdk命令.如果它在恢复完成后通知SNS会很好,SNS会将JSON推送到SQS并且我会轮询SQS并最终在轮询检测到完全恢复时通过电子邮件发送给用户.

任何帮助或建议都会很好.谢谢.

Dol*_*cci 8

您也可以像这样使用AWS CLI工具(这里我假设您要恢复一个目录中的所有文件):

aws s3 ls s3://myBucket/myDir/ | awk '{if ($4) print $4}' > myFiles.txt
for x in `cat myFiles.txt`
do
    echo "restoring $x"
    aws s3api restore-object \
        --bucket myBucket \
        --key "myDir/$x" \
        --restore-request '{"Days":30}'
done
Run Code Online (Sandbox Code Playgroud)

关于您的通知需求,CLI工具将报告"发生了客户端错误(RestoreAlreadyInProgress):如果请求已经启动,则对象还原已在进行中",并且一旦恢复,可能会显示不同的消息.您可以多次运行此restore命令,查找"restore done"错误/消息.当然很漂亮; 使用AWS CLI工具可能有更好的方法.

警告:小心超过分配的自由恢复量/周期的冰川恢复.如果您过快地恢复过多数据,则收费会呈指数级增长.


小智 3

我写过一些相当相似的东西。我无法与任何 PHP api 对话,但是有一个简单的http POST 可以启动冰川恢复

由于这种情况是异步发生的(最多需要 5 小时),因此您必须设置一个进程来通过对对象发出HEADx-amz-restore请求来轮询正在恢复的文件,该对象将在标头中包含恢复状态信息。

如果有帮助的话,我用于解析此标头的 ruby​​ 代码如下所示:

    if restore = headers['x-amz-restore']
      if restore.first =~ /ongoing-request="(.+?)", expiry-date="(.+?)"/
        restoring = $1 == "true"
        restore_date = DateTime.parse($2)
      elsif restore.first =~ /ongoing-request="(.+?)"/
        restoring = $1 == "true"
      end
    end
Run Code Online (Sandbox Code Playgroud)