【问题标题】:AWS S3 Glacier - Programmatically Initiate RestoreAWS S3 Glacier - 以编程方式启动还原
【发布时间】:2013-09-24 16:53:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-glacier


    【解决方案1】:

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

    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 恢复超过分配的免费恢复量/期限。如果您过快恢复过多数据,费用可能会成倍增加。

    【讨论】:

    • 我使用cut -b 32-300 代替 awk 来容纳文件名中的空格。还需要在for之前添加IFS=$'\n'
    • 我通过这种方法得到An error occurred (404) when calling the RestoreObject operation: Not Found,但如果打印$x并将其单独传递给命令(不在循环中)它可以工作。
    【解决方案2】:

    我写了一些非常相似的东西。我无法使用任何 PHP api,但是有一个简单的 http POST that kicks off glacier restoration。

    由于这是异步发生的(最多需要 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多