Архивирование и извлечение из хранилища ледников amazon aws

Я пытаюсь создать архивно-поисковую систему на php. Когда пользователь нажимает кнопку архива, определенные файлы будут перемещены в хранилище ледника из стандартного хранилища, а при нажатии кнопки восстановления файл в хранилище ледника будет восстановлен в стандартное хранилище.

Используя AWS php SDK 3.0 api, я успешно переместил файлы в хранилище ледников, и для извлечения было инициировано задание по извлечению из архива, и я получил идентификатор задания через 3-5 часов и, используя этот идентификатор задания через 5 часов, я попробовал функцию 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) атрибут saveAs функции getJobOutput указывает, куда следует загрузить содержимое операции. Может быть путем к файлу, ресурсу, возвращаемому fopen, или объекту Guzzle \ Http \ EntityBodyInterface. Поскольку я также указываю путь к файлу в s3. В чем будет проблема. Любая помощь очень ценится. Заранее спасибо.

Это результат, содержащийся в ответе $ result, который в точности совпадает с указанным в документации.

Aws \ Result Object ([data: Aws \ Result: private] => Array ([body] => GuzzleHttp \ Psr7 \ Stream Object ([stream: GuzzleHttp \ Psr7 \ Stream: private] => Идентификатор ресурса № 25 [размер: 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 ()) [контрольная сумма] => c176c1843fd0c0fc662lh9bb8de916540e6f220dpk [] contentRange] => [acceptRanges] => bytes [contentType] => application / octet-stream [archiveDescription] => Имя файла - children-wide.jpg [@metadata] => Array ([statusCode] => 200 [effectiveUri] => region-name.amazonaws.com/-/vaul TS / имя_хранилища / Работа / gFdjAl4xhTAVEnmffgfg-AO3-xmmjghfmqkCLOR1m34gHLQpMd0a3WKCiRRrItv2bklawwZnq9KeIch3LKs8suZoJwk2_ / выход [заголовки] => Array ([х-AMZN-RequestID] => NzAiVAfrMQbpSjj-2228iiKWK_VteDwNyFTUR7Kyu0duno [х-AMZ-sha256-дерево-хэш] => c176c1843khfullc662f09bb8de916540e6f9dcc9b22020bbb8388de6f81d1c2 [accept-range] => bytes [x-amz-archive-description] => Имя файла - children-wide.jpg [content-type] => application / octet-stream [content-length] => 1452770 [дата] => Вт, 31 января 2017 г. 03:34:26 GMT [соединение] => закрыть) [transferStats] => Array ([http] => Array ([0] => Array ())))))


person Senchu Thomas    schedule 30.01.2017    source источник
comment
Почему вы используете $result = ..., а потом никогда не проверяете, что $result содержит? Кажется весьма вероятным, что вы отказываетесь от ценной информации.   -  person Michael - sqlbot    schedule 30.01.2017
comment
Привет @ Michael-sqlbot. Я пробовал не сохранять значение в $ result, тогда файл не был скопирован в папку s3. Не могли бы вы подробно объяснить, что вы имеете в виду. Думаю, то, что я сделал, может быть неправильным. Спасибо за ваш ценный ответ   -  person Senchu Thomas    schedule 30.01.2017
comment
$result = $this->glacier->getJobOutput ... Что найдено в $result здесь?   -  person Michael - sqlbot    schedule 30.01.2017
comment
@ Michael-sqlbot Я привел вывод, который я получаю в $ result в качестве редактирования. Думаю, это поможет вам найти причину. Спасибо..   -  person Senchu Thomas    schedule 31.01.2017


Ответы (1)


Когда вы восстанавливаете файлы из Glacier, он больше не будет иметь класс хранилища Standard. он по-прежнему будет показывать Glacier. чтобы определить, пришли ли файлы из Glacier или нет,

Вместо этого используйте GetObject, и посмотрите на значение восстановления результата. И установите Range на "bytes = 0-0", чтобы пропустить получение содержимого самого файла. И обязательно ловушка для исключений

если объект находится в Glacier и не восстановлен, AWS выдаст InvalidObjectStateError, и скрипт умрет, если ошибка не будет обнаружена.

Это то, что вы увидите на предмете повторно.

["Restore"] => string (68) "continuous-request =" false ", expiry-date =" Thu, 12 Oct 2017 00: 00: 00 GMT ""

И это то, что вы получите, если Предмет все еще находится в Леднике.

Неустранимая ошибка: неперехваченное исключение «Aws \ S3 \ Exception \ S3Exception» с сообщением «Ошибка выполнения« GetObject »на« OBJ PATH »; Ошибка HTTP AWS: ошибка клиента: GET OBJ PATH привела к 403 Forbidden ответу: InvalidObjectStateThe операция недопустима для (усеченного ...) InvalidObjectState (клиент): операция недопустима для класса хранилища объекта - InvalidObjectStateThe операция не допустима для объекта 's хранения class879A42BDC3939282VjgBNmLxhqesAaOnnUKkIahdr9OlUnTPASmjh8zZNVzLeYEDz + QooqoFjyaeoyXGeAa / IPxTBrA =' GuzzleHttp \ Exception \ ClientException: ошибка клиента: `GET OBJ PATH в C: \ Inetpub \ Wwwroot \ cruisecheap.com \ php_includes \ SDKs \ AWS \ поставщика \ aws \ aws-sdk-php \ src \ WrappedHttpHandler.php в строке 192

Я надеюсь, что это поможет вам и другим людям, у которых есть такая же проблема.

person Reza Shek    schedule 27.10.2017