Загрузка файлов в AWS S3 с помощью Node.js

S3 - это облачный сервис Amazon для хранения файлов. Мы можем использовать Node.js для загрузки файлов в S3 с помощью AWS JavaScript SDK.

Вступление

Для большей части программного обеспечения и веб-приложений, которые мы создаем сегодня, требуется какой-то хостинг для файлов - изображений, счетов-фактур, аудиофайлов и т. Д. Традиционный способ хранения файлов заключался в простом сохранении их на жестком диске сервера. Однако сохранение файлов на жестком диске сервера имеет ограничения, такие как невозможность масштабирования, необходимость выделения места перед использованием и гораздо более высокие / негибкие цены. Не говоря уже о том, что запрос огромного количества (потенциально больших) изображений может действительно вызвать нагрузку на сервер.

Чтобы разгрузить серверы, разработчики начали размещать файлы с такими поставщиками хранилищ, как AWS S3 , Google Cloud Storage и т. Д.

В этой статье мы покажем вам, как написать код Node.js для загрузки файлов на S3.

Что такое S3?

S3 или Simple Storage Service - это облачный сервис хранения, предоставляемый Amazon Web Services (AWS). Используя S3, вы можете размещать любое количество файлов, платя только за то, что используете.

S3 также предоставляет мультирегиональный хостинг для клиентов в их регионе и, таким образом, может действительно быстро обслуживать запрошенные файлы с минимальной задержкой.

Настройка среды

Учетные данные AWS

Для начала вам необходимо сначала сгенерировать учетные данные для доступа с ключом безопасности AWS. Для этого войдите в консоль управления AWS .

Нажмите на свое имя пользователя:

{.ezlazyload}

Затем выберите Ключи доступа -> Создать новый ключ доступа :

{.ezlazyload}

После этого вы можете либо скопировать идентификатор ключа доступа и секретный ключ доступа из этого окна, либо загрузить его в виде файла .CSV

{.ezlazyload}

Создание сегмента S3

Теперь давайте создадим AWS S3 Bucket с надлежащим доступом. Мы можем сделать это с помощью консоли управления AWS или с помощью Node.js.

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

{.ezlazyload}

Выберите «Create Bucket» и введите имя своего сегмента и регион, в котором вы хотите разместить свой сегмент. Если вы уже знаете, из какого региона будет приезжать большинство ваших пользователей, разумно выбрать регион как можно ближе к их. Это гарантирует, что файлы с сервера будут обслуживаться в более оптимальные сроки.

Имя, которое вы выбираете для своей корзины, должно быть уникальным для всех пользователей AWS, поэтому попробуйте новое, если имя недоступно:

{.ezlazyload}

Следуйте инструкциям мастера и настройте разрешения и другие параметры в соответствии с вашими требованиями.

Чтобы создать корзину с использованием Node.js, нам сначала нужно настроить нашу среду разработки.

Среда разработки

Итак, теперь давайте начнем с нашего примера, настроив новый проект Node.js:

 $ npm init 

Чтобы начать использовать любые облачные сервисы AWS в Node.js, мы должны установить AWS SDK (System Development Kit).

Установите его, используя предпочитаемый вами менеджер пакетов - мы будем использовать npm :

 $ npm i --save aws-sdk 

Выполнение

Создание сегмента S3

Если вы уже создали ведро вручную, вы можете пропустить эту часть. Но если нет, давайте создадим файл, скажем, create-bucket.js в каталоге вашего проекта.

Импортируйте aws-sdk для доступа к вашей корзине S3:

 const AWS = require('aws-sdk'); 

Теперь давайте определим три константы для хранения ID , SECRET и BUCKET_NAME . Они используются для идентификации нашей корзины и доступа к ней:

 // Enter copied or downloaded access ID and secret key here 
 const ID = ''; 
 const SECRET = ''; 
 
 // The name of the bucket that you have created 
 const BUCKET_NAME = 'test-bucket'; 

Теперь нам нужно инициализировать интерфейс S3, передав наши ключи доступа:

 const s3 = new AWS.S3({ 
 accessKeyId: ID, 
 secretAccessKey: SECRET 
 }); 

После успешной инициализации интерфейса S3 мы можем продолжить и создать корзину:

 const params = { 
 Bucket: BUCKET_NAME, 
 CreateBucketConfiguration: { 
 // Set your region here 
 LocationConstraint: "eu-west-1" 
 } 
 }; 
 
 s3.createBucket(params, function(err, data) { 
 if (err) console.log(err, err.stack); 
 else console.log('Bucket Created Successfully', data.Location); 
 }); 

На этом этапе мы можем запустить код и проверить, создана ли корзина в облаке:

 $ node create-bucket.js 

Если выполнение кода выполнено успешно, вы должны увидеть сообщение об успешном завершении, за которым следует адрес корзины в выходных данных:

 Bucket Created Successfully http://test-bucket-2415soig.s3.amazonaws.com/ 

Вы можете посетить свою панель управления S3 и убедиться, что корзина создана:

{.ezlazyload}

Полный список регионов и других параметров можно найти в официальной документации .

Загрузка файлов

На этом этапе давайте реализуем функцию загрузки файлов. В новом файле, например, upload.js , импортируйте aws-sdk для доступа к вашей fs для чтения файлов с вашего компьютера:

 const fs = require('fs'); 
 const AWS = require('aws-sdk'); 

Нам нужно определить три константы для хранения ID , SECRET и BUCKET_NAME и инициализировать клиент S3, как мы делали раньше.

Теперь давайте создадим функцию, которая принимает fileName , представляющий файл, который мы хотим загрузить:

 const uploadFile = (fileName) => { 
 // Read content from the file 
 const fileContent = fs.readFileSync(fileName); 
 
 // Setting up S3 upload parameters 
 const params = { 
 Bucket: BUCKET_NAME, 
 Key: 'cat.jpg', // File name you want to save as in S3 
 Body: fileContent 
 }; 
 
 // Uploading files to the bucket 
 s3.upload(params, function(err, data) { 
 if (err) { 
 throw err; 
 } 
 console.log(`File uploaded successfully. ${data.Location}`); 
 }); 
 }; 

Перед тем, как загрузить файл, нам нужно прочитать его содержимое как буфер. Прочитав его, мы можем определить необходимые параметры для загрузки файла, такие как Bucket , Key и Body .

Помимо этих трех параметров, существует длинный список других необязательных параметров. Чтобы получить представление о том, что вы можете определить для файла во время загрузки, вот несколько полезных:

  • StorageClass : определите класс, в котором вы хотите сохранить объект. S3 предназначен для обеспечения быстрого обслуживания файлов. Но если к файлам обращаются редко, вы можете использовать другой класс хранилища. Например, если у вас есть файлы, которые практически не касаются, вы можете хранить их в «S3 Glacier Storage», где цена очень низкая по сравнению со «S3 Standard Storage». Но для доступа к этим файлам потребуется больше времени, если он вам понадобится, и на него распространяется другое соглашение об уровне обслуживания.
  • ContentType : устанавливает MIME-тип изображения. Тип по умолчанию будет «двоичный / октетный поток». Добавление типа MIME, например image / jpeg, поможет браузерам и другим HTTP-клиентам определять тип файла.
  • ContentLength : устанавливает размер тела в байтах, что удобно, если размер тела не может быть определен автоматически.
  • ContentLanguage : установите этот параметр, чтобы определить, на каком языке находится содержимое. Это также поможет HTTP-клиентам идентифицировать или переводить содержимое.

Для Bucket мы будем использовать имя нашей Key мы добавим имя файла, которое мы хотим сохранить как, а для Body мы будем использовать fileContent .

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

 uploadFile('cat.jpg'); 

Вы можете заменить «cat.jpg» на имя файла, которое существует в том же каталоге, что и код, относительный путь к файлу или абсолютный путь к файлу.

На этом этапе мы можем запустить код и проверить, работает ли он:

 $ node upload.js 

Если все в порядке, вы должны увидеть результат, подобный показанному ниже, со ссылкой на ваш файл, который хранится в data.Location .

 File uploaded successfully. https://test-bucket-1242tsr.s3.ap-northeast-2.amazonaws.com/cat.jpg 

Если есть какая-либо ошибка, она также должна отображаться на консоли.

Кроме того, вы можете перейти к своей корзине в Консоли управления AWS и убедиться, что файл загружен.

{.ezlazyload}

Заключение

Чтобы разгрузить наши серверы приложений, разработчики часто выбирают размещение файлов с помощью поставщиков хранилищ, таких как AWS S3, Google Cloud Storage и т. Д. Мы создали очень простое приложение Node.js, которое обрабатывает загрузку файлов в S3, используя свой интерфейс через модуль aws-sdk

В зависимости от ваших требований вы также можете настроить общий доступ к вашей корзине или файлам с помощью консоли.

Если вы хотите поэкспериментировать с кодом, как всегда, вы можете найти его на GitHub в этом Gist .

comments powered by Disqus