归档到亚马逊 aws 的冰川存储并从中检索

Posted

技术标签:

【中文标题】归档到亚马逊 aws 的冰川存储并从中检索【英文标题】:Archive to and retrieval from glacier storage of amazon aws 【发布时间】:2017-06-15 07:26:04 【问题描述】:

我正在尝试在 php 中创建一个存档和检索系统。当用户点击存档按钮时,特定文件将从标准存储移动到冰川存储,当点击恢复按钮时,冰川存储中的文件将检索到标准存储。

使用 AWS php SDK 3.0 api 我已成功将文件移动到 glacier vault 并为检索启动了存档检索作业,我在 3-5 小时后获得了作业 ID,并在 5 小时后使用该作业 ID 我尝试了 getJobOutput 函数.我得到的响应与 api 文档中提到的相同,但我没有在我的 s3 存储桶中获得恢复的文件。

这是我上传到冰川并从冰川恢复的代码

public function archiveAndRestore() 

$this->s3Client = new S3Client(Configure::read('AWScredentials'));
$this->glacier = GlacierClient::factory(Configure::read('AWScredentials'));

// Upload to glacier
$this->s3Client->registerStreamWrapper();
$context = stream_context_create([
    's3' => ['seekable' => true]
]);
$result = $this->glacier->uploadArchive(array(
    'vaultName' => 'archiveTest',
    'archiveDescription' => 'File Name is archiveTest.txt ',
    'body' => fopen('s3://storage-bucket/Videos/archiveTest.txt', 'r', false, $context),
));

$archiveid = $result->get('archiveId');
$jobId = $this->glacier->initiateJob([
    'accountId' => '-',
    'vaultName' => 'archiveTest',
    'jobParameters' => [
        'Type' => 'archive-retrieval',
        'ArchiveId' => 'ORgyyyqsKwoopp110EvFoyqj3G-csmOKLyy3IJnWF9Dpd8BJfwerEhg241nxHf6y6kNUUyhUHOaY4y8QvWBGESmAopa80f6GZ9C05tyyKANhY-qfBUB6YkfTABg',
    ],
]);   


$this->s3Client->registerStreamWrapper();
$context = stream_context_create([
    's3' => ['seekable' => true]
]);
$stream = fopen('s3://storage-bucket/RetrivedFiles/test1.txt', 'w');  
$result = $this->glacier->getJobOutput([
    'accountId' => '-',
    'jobId' => '2dddfffffff9SwZIOPWxcB7TLm_3apNx--2rIiD7SgjOJjjkrerrcN1YCtivh_zsmpLyczY4br-bhyyX0Ev5B7e6-D1',
    'vaultName' => 'archiveTest',
    'saveAs' => $stream,
]);
fclose($stream);    

根据文档(aws GetJobOutput operation documentation),getJobOutput 函数的 saveAs 属性是指定操作的内容应该下载到哪里。可以是文件的路径、fopen 返回的资源或 Guzzle\Http\EntityBodyInterface 对象。因为我也在 s3 中给出了文件的路径。会有什么问题。非常感谢任何帮助。提前致谢。

这是响应 $result 中包含的结果,与文档中提到的完全相同

Aws\Result 对象 ( [data:Aws\Result:private] => 数组 ( [body] => GuzzleHttp\Psr7\Stream 对象 ( [stream:GuzzleHttp\Psr7\Stream:private] => 资源 id #25 [size:GuzzleHttp\Psr7\Stream:private] => [seekable:GuzzleHttp\Psr7\Stream:private] => 1 [可读:GuzzleHttp\Psr7\Stream:private] => 1 [可写:GuzzleHttp\Psr7\Stream: private] => 1 [uri:GuzzleHttp\Psr7\Stream:private] => php://temp [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array ()) [校验和] => c176c1843fd0c0fc662lh9bb8de916540e6f9dpk9b22020bbb8388jk6f81d1c2 [状态] = > 200 [contentRange] => [acceptRanges] => bytes [contentType] => application/octet-stream [archiveDescription] => 文件名是 children-wide.jpg [@metadata] => 数组 ([statusCode] => 200 [effectiveUri] => https://glacier.region-name.amazonaws.com/-/vaults/vaultname/jobs/gFdjAl4xhTAVEnmffgfg-Ao3-xmmjghfmqkCLOR1m34gHLQpMd0a3WKCiRRrItv2bklawwZnq9KeIch3LKs8suZoJwk2_/output [标题] =>数组([X-AMZN-的requestId] => NzAiVAfrMQbpSjj-2228iiKWK_VteDwNyFTUR7Kyu0duno [X-AMZ-SHA256树哈希] => c176c1843khfullc662f09bb8de916540e6f9dcc9b22020bbb8388de6f81d1c2 [接受范围,] =>字节[ x-amz-存档描述] => 文件名是 children-wide.jpg [content-type] => application/octet-stream [content-length] => 1452770 [date] => Tue, 31 Jan 2017 03:34:26 GMT [connection] = > 关闭)[transferStats] => 数组([http] => 数组([0] => 数组()))))))

【问题讨论】:

你为什么使用$result = ...,然后从不实际检查$result包含的内容?您似乎很可能正在丢弃有价值的信息。 嗨@Michael-sqlbot 我尝试不将值存储到 $result 然后文件也没有复制到 s3 位置。您能否详细解释一下您的意思。我认为我所做的可能是错误的。感谢您的宝贵回答 $result = $this->glacier->getJobOutput ... $result 这里有什么? @Michael-sqlbot 我已经给出了我在 $result 中得到的输出作为编辑。我认为这可能有助于您追查原因。谢谢你.. 【参考方案1】:

当您从 Glacier 恢复文件时,它不会再将 Standard 作为存储类。它仍然会显示冰川。确定文件是否来自 Glacier,

改用 GetObject,并查看结果的恢复值。并将范围设置为“bytes=0-0”以跳过检索文件本身的内容。并确保捕获异常

如果对象在 Glacier 中且未恢复,AWS 将抛出 InvalidObjectStateError,如果未捕获该错误,则脚本将终止。

这就是你将看到的项目 resored。

["Restore"] => string(68)"ongoing-request="false", expiry-date="星期四, 2017 年 10 月 12 日 00:00:00 GMT ""

如果物品仍在冰川中,这就是你会得到的

致命错误:未捕获的异常“Aws\S3\Exception\S3Exception”与 消息'执行“GetObject”时出错 “对象路径”; AWS HTTP 错误:客户端错误:GET OBJ PATH 导致403 Forbidden 响应:InvalidObjectStateThe 操作对于(截断的...)InvalidObjectState 无效 (客户端):该操作对对象的存储类无效- InvalidObjectState 操作对对象的存储无效 class879A42BDC3939282VjgBNmLxhqesAaOnnUKkIahdr9OlUnTPASmjh8zZNVzLeYEDz+QooqoFjyaeoyXGeAa/IPxTBrA=' GuzzleHttp\ Exception\ ClientException:客户端错误:`GET 对象路径 在 C:\inetpub\wwwroot\cruisecheap.com\php_includes\SDKs\AWS\vendor\aws\aws-sdk-php\src\WrappedHttpHandler.php 在第 192 行

我希望这可以帮助你和其他有同样问题的人。

【讨论】:

以上是关于归档到亚马逊 aws 的冰川存储并从中检索的主要内容,如果未能解决你的问题,请参考以下文章

在java中以编程方式检索亚马逊订单历史

aws(亚马逊WEB服务)详细资料大全

亚马逊AWS免费套餐EC2安装centos连接登录并创建root

使用 PHP 检索亚马逊商店的产品列表?

可以自行安装系统到亚马逊的AWS云服务器吗?还是说只能使用AWS选择系统进行安装?

亚马逊 s3 / 其他 AWS 服务上的操作日志