Предпочтительный способ загрузки больших файлов с AWS S3 на сервер EC2 - PullRequest
1 голос
/ 03 апреля 2019

У меня возникают некоторые проблемы с загрузкой большого (3,5 ГБ) файла из S3 в экземпляр EC2.в 95% случаев он работает отлично и быстро - возможно, 30 секунд.Тем не менее, это 5% времени он останавливается и может занять> 2 часа для загрузки.Перезапуск задания обычно решает эту проблему - показывая, что проблема временная.Это заставляет меня думать, что есть проблема с тем, как я загружаю файлы.Ниже моя реализация - я передаю поток чтения в поток записи на диск и возвращаю обещание, которое разрешается, когда оно выполнено (или отклоняется при ошибке).

Является ли это предпочтительным методом загрузки больших файлов из S3 с помощью node.js?Есть ли какие-нибудь "ошибки", о которых я должен знать?

function getDownloadStream(Bucket, Key) {
  return s3
  .getObject({
    Bucket,
    Key
  })
  .on('error', (error) => {
    console.error(error);
    return Promise.reject(`S3 Download Error: ${error}`);
  })
  .createReadStream();
}

function downloadFile(inputBucket, key, destination) {
  return new Promise(function(resolve, reject){
    getDownloadStream(inputBucket, key)
    .on('end', () => {
      resolve(destination);
    })
    .on('error', reject)
    .pipe(fs.createWriteStream(destination));
  });
}

1 Ответ

0 голосов
/ 03 апреля 2019

По умолчанию трафик на s3 идет через интернет, поэтому скорость загрузки может стать непредсказуемой.Чтобы увеличить скорость загрузки и по соображениям безопасности, вы можете настроить конечные точки aws, которые являются виртуальными устройствами и могут использоваться для маршрутизации трафика между вашим экземпляром на s3 через их внутреннюю сеть (намного быстрее), чем через Интернет.

При создании службы конечных точек для s3 вам необходимо выбрать таблицы маршрутизации экземпляров, в которых размещено приложение.после создания вы увидите запись в этих таблицах маршрутов, например destination (com.amazonaws.us-east-1.s3) -> target vpce-xxxxxx, поэтому, когда трафик поступает на s3, он направляется через конечную точку, а не через Интернет.

В качестве альтернативы вы также можетепопробуйте распараллелить загрузку, например, параллельно загружать диапазон байтов, и объединить его, но для 3.5 ГБ подход выше - это хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...