7

我一直在编写一个使用 s3 进行存储和 glacier 进行备份的网络应用程序。所以我设置了生命周期策略来存档它。现在我想编写一个列出存档文件的 web 应用程序,用户应该能够从中启动恢复,然后在恢复完成后收到一封电子邮件。

现在我遇到的麻烦是我找不到可以发出来启动恢复的 php sdk 命令。然后,如果它在恢复完成时通知 SNS,那就太好了,SNS 会将 JSON 推送到 SQS,我会轮询 SQS,最后在轮询检测到完全恢复时向用户发送电子邮件。

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

4

2 回答 2

9

您也可以像这样使用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

关于您对通知的渴望,如果请求已经启动,CLI 工具将报告“发生客户端错误 (RestoreAlreadyInProgress):对象恢复已在进行中”,并且在恢复后可能会显示不同的消息。您可以多次运行此恢复命令,查找“恢复完成”错误/消息。当然很老套;AWS CLI 工具可能有更好的方法。

警告:小心超过分配的免费恢复量/期限的 Glacier 恢复。如果您过快地恢复太多数据,费用可能会成倍增加。

于 2013-12-05T19:31:51.140 回答
3

我写了一些非常相似的东西。我无法与任何 PHP api 交谈,但是有一个简单的http POST 可以启动 glacier restore

由于这是异步发生的(最多需要 5 个小时),因此您必须设置一个进程来轮询正在通过对对象发出HEAD请求来恢复的文件,该对象将在x-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
于 2013-09-30T15:55:48.770 回答