2013-09-24 4 views
6

Я пишу веб-приложение, использующее s3 для хранения и ледника для резервного копирования. Поэтому я настраиваю политику жизненного цикла для ее архивации. Теперь я хочу написать webapp, в котором перечислены архивные файлы, пользователь должен иметь возможность инициировать восстановление из этого, а затем получать электронную почту после завершения их восстановления.AWS S3 Glacier - Programmatically Initiate Restore

Теперь проблема, с которой я сталкиваюсь, это я не могу найти команду php sdk, которую я могу выполнить для initiateRestore. Тогда было бы хорошо, если бы он уведомлял SNS о завершении восстановления, SNS подтолкнул JSON к SQS, и я бы опросил SQS и, наконец, отправил электронное сообщение пользователю, когда опрос обнаружил полное восстановление.

Любая помощь или предложения были бы приятными. Спасибо.

ответ

2

Я написал что-то довольно похожее. Я не могу говорить ни с каким PHP api, но есть простой http POST that kicks off glacier restoration.

Поскольку это происходит несинхронно (и занимает до 5 часов), вы должны настроить процесс опроса файлов, которые восстанавливаются, делая HEAD запросы на объект, который будет иметь информацию о состоянии восстановления в заголовке x-amz-restore.

Если это поможет, мой рубиновый код для разбора этого заголовка выглядит следующим образом:

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 
7

Вы также можете использовать 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) произошло: Объект восстановления уже выполняется», если запрос уже начато, возможно, другое сообщение после его восстановления. Вы можете запустить эту команду восстановления несколько раз, ища сообщение об ошибке «restore done». Довольно взломанный, конечно; вероятно, лучший способ с помощью инструмента AWS CLI.

Предостережение: Будьте осторожны с восстановлением ледника, превышающим сумму/период бесплатного восстановления. Если вы слишком быстро восстанавливаете слишком много данных, сборы могут экспоненциально накапливаться.

+0

вместо awk Я использовал 'cut -b 32-300' для размещения пробелов в именах файлов. нужно добавить 'IFS = $ '\ n'' перед' for', а также – rynop

+0

Я получаю 'Произошла ошибка (404) при вызове операции RestoreObject: Not Found' с этим подходом, но если print' $ x' и передать его команде только (не в цикле), она работает. – JrBenito

Смежные вопросы