【问题标题】:How to fetch files from S3 bucket, which are moved from S3 bucket to Glacier?如何从 S3 存储桶中获取文件,这些文件从 S3 存储桶移动到 Glacier?
【发布时间】:2017-10-31 05:01:38
【问题描述】:

我将文件存储在 AWS S3 存储桶上,我们设置了在特定时间段(例如 6 个月)后通过 AWS 控制台将文件从 S3 存储桶移动到 Glacier 的选项。

文件已成功从 S3 移动到 Glacier。

现在,我想检索在 Glacier 上移动的文件。但我找不到任何工作方法。

我已经尝试过引用 AWS Glacier 的文档,但没有成功。

注意:我们正在尝试通过 PHP SDK 或使用 PHP 的任何其他方式来做到这一点。

【问题讨论】:

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


    【解决方案1】:

    documentation所说:

    Amazon Glacier 存储类中的对象无法立即访问:您必须先将对象的临时副本恢复到其存储桶,然后才能使用。

    您需要对存档的 (S3-Glacier) 对象启动恢复操作,这可能需要 几个小时(通常是三到五个小时)才能恢复为临时对象。如果您希望它们永久保存在 S3 存储桶中,您可以在恢复完成后在您的 S3 存储桶中创建一个副本。

    要启动恢复作业,您可以使用:

    • S3 管理控制台,请参阅here
    • AWS CLI,请参阅here
    • 调用 S3 REST API - POST Restore Object,请参阅 here
    • AWS SDK,对于 PHP 可以在 here 看到。

    要以编程方式确定恢复作业何时完成,您可以:

    • 调用 S3 REST API - HEAD Object,请参阅 here
    • AWS SDK,对于 PHP 可以在 here 看到。

    还原作业完成后,您可以在作业中设置的特定时间段内检索 S3 存储桶中的对象。

    【讨论】:

    • 我讨厌对写得很好的答案投反对票,但这里有太多不正确的陈述。 Glacier API、cli、DescribeJob 和 SNS 主题以及与 Glacier 服务的直接交互——在链接到 S3 管理控制台之后,这些都不适用于 Glacier 存储类中的 S3 对象。 S3 不会将对象存储在“您的”Glacier 帐户中。它将它们存储在自己的一个中,您无法访问。
    • 嗨@Michael,感谢您注意到这个答案。我混合了 S3 Glacier 类和 Glacier 本身。正确答案应该在docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html。将很快修复答案。再次感谢。
    • @EdwardSamuel :基于http://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html doc 我尝试恢复对象,但出现此错误。 SignatureDoesNotMatch 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
    • @EdwardSamuel:这是我使用的 AWS 签名 AccessKey:#AccessKey SecretKey:#SecretKey AWS 区域:us-east-1 服务名称:s3 这是 POST 数据 2
    • @EdwardSamuel:请在下面找到用于我的请求的标题:主机:bucketname.s3.amazonaws.com 日期:2016 年 7 月 1 日星期五 00:51:19 欧洲/柏林内容长度: 47 内容类型:应用程序/xml X-Amz 日期:20160704T093326Z 授权:AWS4-HMAC-SHA256 凭据=#AccessKey/20160704/us-east-1/s3/aws4_request,SignedHeaders=内容长度;内容类型;主机;x-amz-content-sha256;x-amz-date, Signature=16ffa6199ea59fd9e36ec0cc6cd3dda6c508536f81e41d152c542ac8aa8ef56f X-Amz-Content-Sha256 : 4327e77c95fb6aba422fe31e0a93475fb21bac2374384e24d6d064ea4315cba0
    【解决方案2】:

    如果你正在使用 PHP SDK,你可以使用这个

    $objects = $s3Client->restoreObject(array(
                    'Bucket' => 'Bucket name'
                    ,"Key"   => 'File Key which is file bath in S3 bucket'
                    //,'RequestPayer' => 'requester',
                    ,'RestoreRequest' => [
                        'Days' => 10,
                        'GlacierJobParameters' => [
                            //'Tier' => 'Standard|Bulk|Expedited', // REQUIRED
                            'Tier' => Expedited, // REQUIRED
                        ]
                    ],
                ));
    

    这里是这个的通用模板

    $result = $client->restoreObject([
        'Bucket' => '<string>', // REQUIRED
        'Key' => '<string>', // REQUIRED
        'RequestPayer' => 'requester',
        'RestoreRequest' => [
            'Days' => <integer>, // REQUIRED
            'GlacierJobParameters' => [
                'Tier' => 'Standard|Bulk|Expedited', // REQUIRED
            ],
        ],
        'VersionId' => '<string>',
    ]);
    

    【讨论】:

    • 加急不适用于我,假设总是标准,我不知道为什么......
    • @jorgeB。是的,没有 ',请记住,如果您没有购买预置的加急检索,则不能保证加急 RQ。目前预置的快速检索为 100 美元,以确保每 5 分钟至少进行 3 次快速检索,并提供高达 150 MB/s 的检索吞吐量。 aws.amazon.com/glacier/pricing
    • 但我在 AWS 控制台中尝试过,加急层工作正常。
    • 可能是它可用的时间,而不是您使用 API 的时间,正如我所说,在您购买预置的加速检索之前,它不能保证加速检索工作。相信我,我两天前也遇到了同样的问题,这是我在与 AWS 支持人员交谈 2 小时后发现的
    • 我建议,如果您使用 API,如果您在加速 RQ 时遇到错误,则使用 Standard 作为层再次运行您的 RQ。
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2016-06-22
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多