我一直在编写一个使用 s3 进行存储和 glacier 进行备份的网络应用程序。所以我设置了生命周期策略来存档它。现在我想编写一个列出存档文件的 web 应用程序,用户应该能够从中启动恢复,然后在恢复完成后收到一封电子邮件。
现在我遇到的麻烦是我找不到可以发出来启动恢复的 php sdk 命令。然后,如果它在恢复完成时通知 SNS,那就太好了,SNS 会将 JSON 推送到 SQS,我会轮询 SQS,最后在轮询检测到完全恢复时向用户发送电子邮件。
任何帮助或建议都会很好。谢谢。
我一直在编写一个使用 s3 进行存储和 glacier 进行备份的网络应用程序。所以我设置了生命周期策略来存档它。现在我想编写一个列出存档文件的 web 应用程序,用户应该能够从中启动恢复,然后在恢复完成后收到一封电子邮件。
现在我遇到的麻烦是我找不到可以发出来启动恢复的 php sdk 命令。然后,如果它在恢复完成时通知 SNS,那就太好了,SNS 会将 JSON 推送到 SQS,我会轮询 SQS,最后在轮询检测到完全恢复时向用户发送电子邮件。
任何帮助或建议都会很好。谢谢。
您也可以像这样使用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 恢复。如果您过快地恢复太多数据,费用可能会成倍增加。
我写了一些非常相似的东西。我无法与任何 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