Рубрики
Без рубрики

Amazon S3 – хранение облачного файла для эффективности и экономии затрат

Kangze Huang Amazon S3 – хранение облачного файла для производительности и затраты SaificatestHe Complete Web AWS Web Boaterplate – Учебное пособие на 2TTABE CONTENTSPART 0 : Введение в полный веб-код Web BoaterPartpart 1: аутентификация пользователя с AWS Cognito (3 частями) Часть 2: Сохранение затрат на хранение файлов с Amazon S3 (1 часть) Часть 3:

Kangze Huang

Полная веб-котельная AWS – Учебник 2

Оглавление

Скачать github здесь Отказ

Вступление

Традиционно файлы, обслуживаемые приложением, будут сохранены на файловую систему сервера и архитектуре, разработанной разработчиком. Мы можем сразу увидеть, что это дорого, с точки зрения труда и деловой риск, поскольку мы должны полагаться на опыт/дизайн разработчика (ы). Это также дорого с точки зрения пропускной способности, так как каждый файл должен быть передан с сервера на клиента. Если мы сохраним файловую систему на главном сервере, она замедляет обработку всей основной функциональности. Если мы отделим файловую систему на свой собственный сервер, мы должны заплатить дополнительно для времени безотказной работы, этот сервер работает, а также разработку способа доступного доступа к изображениям, даже если изменение URL-адресов. А как насчет разных типов файлов? Нам нужно написать код для обработки JPGS, MP4S, PDF, zip-файлов .. etc. Как насчет безопасности и ограниченного доступа к только авторизованным пользователям? Безопасность – это монументальная задача само по себе. Наконец, если мы хотим, чтобы все это масштабировать, нам придется выплатить от задницы для него. Что, если произошло способ легко добиться всей этой функциональности на уровне производства?

Представляем Amazon Simple Storage Service (S3) – полностью управляемая система хранения файлов, которую вы можете надежно использовать в масштабе, и безопасны прямо из коробки. Ваши файлы автоматически хранятся в нескольких физических местах для гарантированной доступности, даже если один центр хранения не удается. Все обрабатывается для вас, чтобы все, что вам нужно сделать, чтобы получить доступ к вашему контенту, предоставляет URL (и быть авторизованным пользователем, если применимо). S3 – сорна, потому что полоса пропускания/хранилища S3 – это намного дешевле, чем полоса пропускания/хранения EC2. Вот это да. Давайте начнем.

Начальная настройка

Нажмите значок консоли AWS (куб) в верхнем левом углу и ищите S3.

На странице S3 нажмите кнопку «Создать ведро». Назовите ваше ведро S3 что-то уникальное, так как вы не можете иметь то же имя ведра, что и любое другое ведро S3 в Интернете. Также выберите область, ближайший к тому, где ваши пользователи будут находиться, чтобы скорости подключения были быстрее всего.

На следующем экране управления S3 нажмите Разрешения и «Добавить больше разрешений». В раскрывающемся меню выберите «Все». Это сделает ваше ведро S3 и все его содержимое публично доступно.

Если мы хотим более тонкой мелодии, у которой есть доступ к нашему ведрю S3, мы можем создать политику ведра. Нажмите кнопку «Добавить политику Adget Policy», а затем «Генератор политики AWS» в нижнем левом углу. Текст политики, который вы видите ниже, является выходом генератора политики.

Две вещи, чтобы заметить, когда вы генерируете свою политику. ” Действие «относится к функциональности, которая разрешена для выполнения этого ведра S3, в этом случае удаление, создание и просмотра объектов. «Главный» относится к организации, позволивмую сделать это действие, такое как роль IAM Cognito (пример здесь использует COGNITO_APP_USERSAUTH_ROLE , созданный в моем учебном пособии AWS Cognito). «Главный» упоминается, что его идентификатор ARN, который вы можете найти на странице информации для этого принципала и следует в формате ARN: AWS: ::: Oneifier>. Если вы посмотрите на ARN для «основного» или «ресурса», вы найдете аналогичный шаблон. Наконец, «Ресурс» относится к объекту ведра S3, что эта политика применяется, чтобы снова выявлена на его ARN. В этом случае наш «ресурс» является нашим ведром S3 fo Llowed by/* для обозначения всех дочерних объектов нашего ведра S3. Вы всегда можете добавить больше правил политики, добавив другое объект оператора внутри т он выступает массив.

Одна последняя вещь, которую мы должны настроить – это конфигурация ведра S3 CORS. Если мы хотим веб-сайтов, чтобы иметь возможность получить доступ к нашим ресурсам S3 Bucket без жалоб безопасности, мы должны указать, какие действия допускаются HTTP. Если вы не знаете, какие CORS, читают на нем здесь Отказ

Так что это довольно просто, * Edorigin> означает наш HTTP-запрос может прийти из любого места. Если бы мы хотели разрешить только запросы от определенного IP-адреса (такое бы дело в производстве), мы будет иметь 10,67,53. 55 Эдоригин>. Далее, DMethod> Get Указывает, что разрешены запросы. Мы можем указать более допустимые методы, или если мы Наслаждайтесь живым опасно, мы можем делать <все owedmethod> * GT; Наконец, * Позволяет любой заголовок, например, вариант, чтобы быть авторизованным общением с этим S3 Bucket. Если мы хотим Чтобы добавить больше правил, просто добавьте еще один . Просто не так ли? Если вам нужны дополнительные примеры, нажмите «Образец конфигураций CORS CORS» в нижнем левом углу.

Хорошо, мы почти готовы погрузиться в код!

Краткий брифинг S3

Напомним, что только пользователи аутентифицированы через AWS Cognito, могут изменить (загружать или удалять) файлы, тогда как все пользователи могут просматривать файлы. Эта котельная начнется с загрузки файлов, после того, как аутентифицированный пользователь вошел в наше приложение через AWS Cognito. Если вы не знаете, как это сделать с AWS Cognito, посмотрите предыдущие учебные пособия. Если ваш регистр использования позволяет всем пользователям модифицировать файлы, то просто убедитесь, что ваши разрешения S3 совпадают. Код в противном случае то же самое, так что давайте начнем!

Amazon S3 – это важный магазин файлов для значений ключей, что означает, что каждый файл имеет имя, и значение необработанного данных для этого имени. Технически это означает, что мы можем хранить любой тип файла на S3, но есть некоторые ограничения, как определено в их Соглашение о лицензировании на веб-сервисе Amazon Это в основном ограничения относительно вредоносной активности. Максимальный размер отдельного файла на S3 составляет 5 терабайт, а максимальный размер одного запроса по указанным поставленным 5 гигабайтам. Помимо этого, то, что мы можем хранить на S3 безгранично. В S3 папки также являются объектами, но с нулевым значением, поскольку их цель – для организации. Папки S3 не могут быть повторно названы, и если его изменены от частных для публики, нельзя изменить обратно. В отличие от типичной файловой системы, S3 имеет плоскую иерархию, которая означает файл, который находится внутри папки, технически на том же уровне, что и папка – все – это один уровень глубокой. S3 просто использует префиксы имени файла для различения иерархии папки. Например, файл под названием «Panda.jpg» внутри папки «Чинатрип» на самом деле будет иметь имя файла «Chinatrip/Panda.jpg» в S3. Это простое, но эффективное решение Amazon, чтобы иметь иерархии папок, сохраняя преимущества простого 1-слойного магазина глубокого клавиша. Это все для брифинга, давайте начнем на код!

Код

В переднем конце котельной, перейдите в Приложение/SRC/API/AWS/AWS_S3.JS Отказ Что мы впервые отметим, что мы импортируем имя ведра S3 из Приложение/SRC/API/AWS/AWS_PROFILE.JS Отказ Убедитесь, что в aws_profile.js Вы экспортируете имя ведра, как так:

Экспорт Конст

А затем импортировать его в Приложение/SRC/API/AWS/AWS_COGNITO.JS вот так:

import {BUCKET_NAME} from './aws_profile'

Теперь давайте продолжим aws_cognito.js и пройти через первую функцию, которую мы будем использовать.

Создать альбом пользователя

Представьте себе, что ваши пользователи загружают фотографии на все возможное. Вы хотели бы организовать изображения, которые ваши пользователи загружают в папки, которые представляют каждого пользователя. Это цель CreateUsers3album () который создает папку S3, названную из его единственного аргумента Albumname – В случае этой котельной и его интеграции с AWS Cognito, Albumname будет электронная почта пользователя. Давайте пройдемся по функции.

export function createUserS3Album(albumName){ const p = new Promise((res, rej)=>{           AWS.config.credentials.refresh(function(){         const S3 = new AWS.S3()     if (!albumName) {         const msg = 'Please provide a valid album name'         rej(msg)         return      }     albumName = albumName.trim();     if (albumName.indexOf('/') !== -1) {         const msg = 'Album names cannot contain slashes.'         rej(msg)         return     }
     const albumKey = encodeURIComponent(albumName) + '/';     const params = {      Bucket: BUCKET_NAME,      Key: albumKey     }     S3.headObject(params, function(err, data) {       if (!err) {         const msg = 'Album already exists.'         res()         return       }       if (err.code !== 'NotFound') {          const msg = 'There was an error creating your album: ' + err.message          rej()          return       }     if(err){        const albumParams = {         ...params,         ACL: "bucket-owner-full-control",         StorageClass: "STANDARD"        }        S3.putObject(params, function(err, data) {           if (err) {            const msg = 'There was an error creating your album: ' + err.message             rej(msg)             return           }           res('Successfully created album.');        });     }     });  }) }) return p}

На высоком уровне это процесс. Сначала мы обновляем учетные данные Amazon, которые AWS Cognito предоставил нам. Это необходимо только в том случае, если ваша безопасность Bucket S3 устанавливается так, что только зарегистрировано только пользователями AWS Cognito, могут загружать файлы. Если ваш регистр использования позволяет кому-либо публиковать, то вам не нужно будет обновить учетные данные Amazon. В котельной, CreateUsers3album () называется каждый раз, когда пользователь регистрирует.

Далее мы создаем объект S3 и проверьте наличие наличия Albumname Отказ Мы продолжаем по URI-кодированию Albumname в albumkey. , что нужно, если Albumname поставляется с адреса электронной почты, как S3 не примет, как / и @ в именем файле.

Наконец, мы можем взять Albumkey и Bucket_Name, чтобы позвонить S3.HeedObject (). Внутри Headobject () Мы проверяем, если Альбумки уже существует или если мы получим код ошибки. Если все хорошо, то мы называем S3.PUTOBJECT () с Альбумки Отказ После успешного создания albumkey. Мы можем решить обещание и завершить функцию.

Загрузить файлы к S3

Теперь давайте осмотрим, как загрузить фактические файлы. В Boilerplate мы используем изображения, но те же концепции применяются к любому файлу. Функция требует 2 аргумента: Albumname (который в BoilerPlate является пользователем Email ), а массив файлов для загрузки. Давайте пройдемся по процессу.

export function uploadImageToS3(email, files){ const p = new Promise((res, rej)=>{    if (!files.length || files.length == 0) {      const msg = 'Please choose a file to upload first.'      rej(msg)    }  AWS.config.credentials.refresh(function(){    const S3 = new AWS.S3()
    const S3ImageObjs = []    let uploadedCount = 0
    for(let f = 0; f
     const photoKey = albumPhotosKey + "--" + timestamp + "--" + fileName;     S3.upload({       Bucket: BUCKET_NAME,         Key: photoKey,         Body: file,         ACL: 'public-read'     }, function(err, data) {         if (err) {            const msg = 'There was an error uploading your photo: '+ err.message            rej(msg)            return         }         const msg = 'Successfully uploaded photo: ' + fileName
         S3ImageObjs.push({          photoKey: photoKey,          url: data.Location         })         uploadedCount++         if(uploadedCount==files.length){          res(S3ImageObjs)         }     })    }  }) }) return p}

Сначала мы проверяем это Файлы на самом деле имеет массив предметов внутри него. Затем мы снова обновляем учетные данные AWS и создали объект S3. Теперь мы используем петлю для петли через все Файлы И один за другим загружать их на S3. В последний файл мы разрешаем обещание с массивом всех загруженных файлов S3imageobjs Отказ Так что делает For-Loop?

Каждый файл называется Albumname (который в этом случае является кодировкой URI Email ) в качестве префикса, затем Timestamped, а затем добавляется с исходным именем файлов файлов. Конечное имя – фотоики . Тогда мы называем S3.upload () С правильными параматами и после успешной загрузки мы нажимаем результат в S3imageobjs множество. Успешная загрузка вернет объект с помощью Расположение Свойство, которое является строковым URL для доступа к этому файлу. Если мы посетим Расположение URL, мы увидим наши загруженные изображения. Последнее следует отметить, что ACL Недвижимость в S3.upload () Отказ ACL установлен на «Государственный читал» Так что файл публично доступен всеми.

Остальные вещи

Отлично, поэтому у нас есть чтение файлов и публикация (Get & Post), завершенное для нашей котельной. Как насчет обновления и удаления? Ну, обновление – это вопрос замены предыдущего файла и следует подобное пост. Удаление – это простой вопрос звонка S3.deleteObject () с Фотография и имя ведра.

const params = {      Bucket: 'STRING_VALUE',    Key: 'STRING_VALUE' }; 
s3.deleteObject(params, function(err, data) {      if (err)       console.log(err, err.stack); // an error occurred      else           console.log(data);           // successful response });

Вот и все! Основы Amazon S3 с охватом по безопасности и аутентификации. Для большинства ваших случаев использования это будет все, что вам нужно. Это было довольно простым, и вау, мы получаем много преимуществ, используя необработанное хранилище файлов по традиционным файловым системам на нашем главном сервере. Я надеюсь, что эта статья убедила вас в пользу S3 и как реализовать его в свое собственное приложение.

Увидимся в следующей статье этой серии!

Оригинал: “https://www.freecodecamp.org/news/amazon-s3-cloud-file-storage-for-performance-and-cost-savings-8f38d7769619/”