Перенос файлов из S3 Glacier в S3 Standard действительный xml с NodeJS - PullRequest
0 голосов
/ 28 мая 2020

Я успешно использовал copyObject для перемещения файла из S3 Standard в S3 Glacier. Теперь я пытаюсь использовать restoreObject, чтобы переместить файл обратно из S3 Glacier в S3 Standard.

Я создал переменную params для передачи в restoreObject на основе того, что я нашел в документации restoreObject , но когда я пытаюсь вызвать restore, я получаю:

The XML предоставленное вами не было правильно сформировано или не соответствовало нашей опубликованной схеме.

Вот определение, которое я использую:

const glacierRestore = {
        Bucket: process.env.AWS_BUCKET,
        Key: 'file name goes here',
        RestoreRequest: {
            OutputLocation: {
                S3: {
                    BucketName: process.env.AWS_BUCKET,
                    Prefix: 'X',
                    StorageClass: 'STANDARD'
                }
            },
            Tier: 'Standard'
        }
    };

Что мне не хватает? Думаю, у меня есть все необходимые поля для того, что я хочу сделать. Есть ли место, где я могу проверить свой xml, чтобы получить больше отзывов, чем просто о том, что он недействителен?

Я понимаю, что это JSON, но он должен преобразовать его в XML.

1 Ответ

0 голосов
/ 11 июня 2020

Я наконец-то нашел способ делать то, что хотел, и подумал, что задокументирую это, по крайней мере, чтобы, если кто-то еще пытается сделать что-то подобное, они могли бы найти некоторую помощь в моем решении.

Сначала я невозможно восстановить с помощью OutputLocation в RestoreRequest, если я не делаю выбор, но я хочу выполнить восстановление файла, поэтому мне пришлось сделать это по-другому.

Я использовал s3.headObject (), чтобы получить информацию обратно из файла, чтобы я мог определить его состояние. Когда файл находится в стандартном классе хранения, я бы получил что-то вроде этого:

{
  AcceptRanges: 'bytes',
  LastModified: 2020-06-03T20:53:28.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {}
}

После того, как я переместил его в класс хранилища Glacier, я бы получил что-то вроде:

{
  AcceptRanges: 'bytes',
  LastModified: 2020-06-03T20:56:11.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {},
  StorageClass: 'GLACIER'
}

Теперь к возвращаемой информации добавлен StorageClass. Теперь самое интересное. Я использовал s3.restoreObject (), чтобы получить файл из Glacier, но это создает только временную копию (по умолчанию 1 день), и эта временная копия удаляется по истечении этого периода, но сохраняет копию в Glacier. Я хотел иметь копию в Standard и удалить копию в Glacier. Мне пришлось попытаться выяснить, когда файлы были восстановлены, чтобы я мог скопировать их в Standard и удалить из Glacier.

Проблема в том, что Glacier по умолчанию занимает 3-5 часов, прежде чем файлы будут скопированы в Standard, поэтому мне пришлось создать процесс для этого. У меня есть процесс, который проверяет каждые 5 минут и проверяет, есть ли какие-либо файлы, которые были временно восстановлены, чтобы я мог скопировать их и удалить копию Glacier. Когда файл находится в процессе извлечения из Glacier и временного копирования, s3.headObject для файла возвращает что-то вроде:

{
  AcceptRanges: 'bytes',
  Restore: 'ongoing-request="true"',
  LastModified: 2020-06-03T20:56:11.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {},
  StorageClass: 'GLACIER'
}

Теперь файл имеет тег восстановления, который говорит, что текущий-запрос = " true ", что сообщило мне, что файл находится в процессе восстановления из Glacier. После того, как файл был восстановлен из Glacier (временно), s3.headObject вернул что-то вроде:

{
  AcceptRanges: 'bytes',
  Restore: 'ongoing-request="false", expiry-date="Sun, 07 Jun 2020 00:00:00 GMT"',
  LastModified: 2020-06-03T20:56:11.000Z,
  ContentLength: 147451,
  ETag: '"20573fb94e8c715dee562ce04b795708"',
  ContentType: 'application/octet-stream',
  Metadata: {},
  StorageClass: 'GLACIER'
}

Теперь восстановление говорит, что текущий-запрос = "false", поэтому я знаю, что восстановление завершено, и я можно скопировать (s3.copyObject ()) файл в Standard и удалить файл из Glacier.

...