Архивирование и извлечение из хранилища ледника Амазонки 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);
}
Согласно документации (документация по операции 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] => [доступный для поиска:GuzzleHttp\Psr7\Stream:private] => 1 [доступный для чтения:GuzzleHttp\Psr7\Stream:private] => 1 [доступный для записи: GuzzleHttp \ Psr7 \ Stream: private] = > 1 [URI: GuzzleHttp \ pSR7 \ Стрим: частный] => PHP: // температура [customMetadata:GuzzleHttp\ pSR7 \ поток: частный] => Array ()) [контрольная сумма] => c176c1843fd0c0fc662lh9bb8de916540e6f9dpk9b22020bbb8388jk6f81d1c2 [состояние] => 200 [contentRange] => [acceptRanges] => bytes [contentType] => application/octet-stream [archiveDescription] => Имя файла - children-wide.jpg [@metadata] => Массив ( [statusCode] => 200 [ffectiveUri] => https://glacier.region-name.amazonaws.com/-/vaults/vaultname/jobs/gFdjAl4xhTAVEnmffgfg-Ao3-xmmjghfmqkCLOR1m34gHLQpMd0a3WKCiRRrItv2bklawwZnq9KeIch3LKs8suZoJwk2_/output [заголовки] => Array ([х-AMZN-RequestID] => NzAiVAfrMQbpSjj-2228iiKWK_VteDwNyFTUR7Kyu0duno [x-amz-sha256-tree-hash] => c176c1843khfullc662f09bb8de916540e6f9dcc9b22020bbb8388de6f81d1c2 [accept-range] => байты [x-amz-archive-description] => имя файла> application-application = content> application> content> application> application> content> application> application> application> wide> имя-файла> application-wide>. /octet-stream [content-length] => 1452770 [дата] => вторник, 31 января 2017 03:34:26 GMT [connection] => close) [TransferStats] => Array ( [http] => Array ( [0] => Array ())))))
1 ответ
Когда вы восстанавливаете файлы из Glacier, он больше не становится стандартным классом хранения. это все еще покажет ледник. чтобы определить, пришли ли файлы из Ледника или нет,
Вместо этого используйте GetObject и посмотрите на значение Restore результата. И установите Range в "bytes=0-0", чтобы пропустить извлечение содержимого самого файла. И обязательно ловушку для исключений
если объект находится в Glacier и не восстановлен, AWS сгенерирует InvalidObjectStateError, и сценарий умрет, если ошибка не будет обнаружена.
Это то, что вы увидите, что этот предмет восстановлен.
["Restore"] => string (68) "running-request="false ", expiry-date=" Чт, 12 октября 2017 00: 00: 00 GMT ""
И это то, что вы получите, если Предмет все еще находится в Леднике
Неустранимая ошибка: необработанное исключение "Aws\S3\Exception\S3Exception" с сообщением "Ошибка выполнения"GetObject"для"OBJ PATH"; Ошибка AWS HTTP: ошибка клиента:
GET OBJ PATH
привело к403 Forbidden
Ответ: Операция InvalidObjectStateThe не действует для (усеченного...) InvalidObjectState (клиента): Операция не является допустимой для класса хранения объекта - операция InvalidObjectStateThe не является допустимой для "class879A42BDC3939282VjgBNmLxhqesAaOnnUKkIahdr9OlUnTPASmjh8zZNVzLeYEDz хранения сек +QooqoFjyaeoyXGeAa/IPxTBrA=" объекта GuzzleHttp\ Exception\ ClientException: Ошибка клиента: `ПОЛУЧИТЬ ОБЪЕКТ ОБЪЕКТА в C:\inetpub\wwwroot\cruisecheap.com\php_include \SDKs\AWS\vendor\aws\aws-sdk-php\src\WrappedHttpHandler.php в строке 192
Я надеюсь, что это может помочь вам и другим людям, которые имеют такую же проблему.