Управление файлами с помощью AWS S3, Python и Flask
Вступление
Одним из ключевых движущих факторов технологического роста являются данные. Данные становятся все более важными и решающими в инструментах, создаваемых по мере развития технологий. Это стало движущим фактором роста технологий, как собирать, хранить, защищать и распространять данные.
Этот рост объема данных привел к увеличению использования облачной архитектуры для хранения и управления данными при минимизации хлопот, необходимых для поддержания согласованности и точности. Будучи потребителями технологий, мы генерируем и потребляем данные, и это обусловило необходимость создания сложных систем, помогающих нам управлять этими данными.
Облачная архитектура дает нам возможность загружать и скачивать файлы с нескольких устройств, пока мы подключены к Интернету. И это часть того, что AWS помогает нам достичь с помощью ведер S3.
Что такое S3?
Amazon Simple Storage Service (S3) – это предложение Amazon Web Services (AWS), которое позволяет пользователям хранить данные в виде объектов. Он предназначен для обслуживания всех видов пользователей, от предприятий до небольших организаций или личных проектов.
S3 можно использовать для хранения данных, начиная от изображений, видео и аудио вплоть до резервных копий или статических данных веб-сайта.
Ведро S3-это именованный ресурс хранения, используемый для хранения данных на AWS. Это сродни папке, которая используется для хранения данных на AWS. Ведра имеют уникальные имена, и в зависимости от уровня и цены пользователи получают различные уровни избыточности и доступности по разным ценам.
Права доступа к сегментам S3 также можно указать с помощью консоли AWS, инструмента AWS CLI или с помощью предоставленных API и библиотек.
Что такое Boto3?
Boto3 – это набор для разработки программного обеспечения (SDK), предоставляемый AWS для облегчения взаимодействия с API S3 и другими сервисами, такими как Elastic Compute Cloud (EC2). Используя Boto3, мы можем перечислить все сегменты S3, создать экземпляры EC2 или управлять любым количеством ресурсов AWS.
Зачем использовать S3?
Мы всегда можем предоставить наши собственные серверы для хранения наших данных и сделать их доступными с различных устройств через Интернет, так почему же мы должны использовать AWS S3? Есть несколько сценариев, где это может пригодиться.
Во-первых, AWS S3 устраняет всю работу и затраты, связанные с созданием и обслуживанием серверов, на которых хранятся наши данные. Нам не нужно беспокоиться о приобретении оборудования для размещения наших данных или персонала, необходимого для обслуживания инфраструктуры. Вместо этого мы можем сосредоточиться исключительно на нашем коде и обеспечении наилучшего состояния наших услуг.
Используя S3, мы получаем возможность использовать впечатляющие возможности производительности, доступности и масштабируемости AWS. Наш код будет способен эффективно масштабироваться и работать при больших нагрузках, а также быть высокодоступным для наших конечных пользователей. Мы добиваемся этого без необходимости строить или управлять инфраструктурой, стоящей за этим.
AWS предлагает инструменты, помогающие нам с аналитикой и аудитом, а также с управлением и отчетами о наших данных. Мы можем просматривать и анализировать, как осуществляется доступ к данным в наших корзинах, или даже реплицировать данные в другие регионы, чтобы улучшить доступ к ним конечных пользователей. Наши данные также зашифрованы и надежно хранятся, так что они всегда безопасны.
С помощью AWS Lambda мы также можем реагировать на данные, загружаемые или загружаемые из наших корзин S3, и отвечать пользователям с помощью настроенных оповещений или отчетов для более персонализированного и мгновенного взаимодействия, как и ожидалось от технологии.
Настройка AWS
Чтобы начать работу с S3, нам нужно создать учетную запись на AWS или войти в существующую.
Нам также нужно будет настроить инструмент AWS CLI, чтобы иметь возможность взаимодействовать с нашими ресурсами из командной строки, которая доступна для Mac, Linux и Windows.
Мы можем установить его, запустив:
$ pip install awscli
Как только инструмент CLI настроен, мы можем сгенерировать ваши учетные данные в раскрывающемся списке вашего профиля и использовать их для настройки вашего инструмента CLI следующим образом:
$ aws configure
Эта команда даст нам подсказки для предоставления нашего идентификатора ключа доступа
, Секретного ключа доступа
, регионов по умолчанию и выходных форматов. Более подробную информацию о настройке инструмента AWS CLI можно найти здесь .
Наше Приложение – Флешка
Установка
Давайте создадим приложение Flask, которое позволит пользователям загружать и скачивать файлы в наши ведра S3 и из них, размещенные на AWS.
Мы будем использовать Boto3 SDK для облегчения этих операций и создания простого интерфейса, позволяющего пользователям загружать и просматривать файлы, размещенные в Интернете.
Желательно использовать виртуальную среду при работе над проектами Python, и для этого мы будем использовать инструмент Pipe для создания и управления нашей средой. После настройки мы создаем и активируем нашу среду с помощью Python3 следующим образом:
$ pipenv install --three $ pipenv shell
Теперь нам нужно установить Boto3
и Flask
, которые необходимы для создания вашего приложения флэш-накопителя следующим образом:
$ pipenv install flask $ pipenv install boto3
Реализация
После настройки нам нужно создать ведра для хранения наших данных, и мы можем достичь этого, перейдя к консоли AWS и выбрав S3 в меню Services .
После создания ведра мы можем использовать инструмент CLI для просмотра доступных ведер:
$ aws s3api list-buckets { "Owner": { "DisplayName": "robley", "ID": "##########################################" }, "Buckets": [ { "CreationDate": "2019-09-25T10:33:40.000Z", "Name": "flaskdrive" } ] }
Теперь мы создадим функции для загрузки, загрузки и перечисления файлов в наших корзинах S3 с помощью Boto3 SDK, начиная с функции upload_file
:
def upload_file(file_name, bucket): """ Function to upload a file to an S3 bucket """ object_name = file_name s3_client = boto3.client('s3') response = s3_client.upload_file(file_name, bucket, object_name) return response
Функция upload_file
принимает файл и имя корзины и загружает данный файл в нашу корзину S3 на AWS.
def download_file(file_name, bucket): """ Function to download a given file from an S3 bucket """ s3 = boto3.resource('s3') output = f"downloads/{file_name}" s3.Bucket(bucket).download_file(file_name, output) return output
Функция download_file
принимает имя файла и ведро и загружает его в указанную нами папку.
def list_files(bucket): """ Function to list files in a given S3 bucket """ s3 = boto3.client('s3') contents = [] for item in s3.list_objects(Bucket=bucket)['Contents']: contents.append(item) return contents
Функция list_files
используется для извлечения файлов в нашем ведре S3 и перечисления их имен. Мы будем использовать эти имена для загрузки файлов из наших корзин S3.
Имея на месте наш файл взаимодействия S3, мы можем создать ваше приложение Flask, чтобы обеспечить веб-интерфейс для взаимодействия. Приложение будет представлять собой простое однофайловое приложение Flask для демонстрационных целей со следующей структурой:
. ├── Pipfile # stores our application requirements ├── __init__.py ├── app.py # our main Flask application ├── downloads # folder to store our downloaded files ├── s3_demo.py # S3 interaction code ├── templates │ └── storage.html └── uploads # folder to store the uploaded files
Основная функциональность нашего приложения Flask будет находиться в app.py
файл:
import os from flask import Flask, render_template, request, redirect, send_file from s3_demo import list_files, download_file, upload_file app = Flask(__name__) UPLOAD_FOLDER = "uploads" BUCKET = "flaskdrive" @app.route('/') def entry_point(): return 'Hello World!' @app.route("/storage") def storage(): contents = list_files("flaskdrive") return render_template('storage.html', contents=contents) @app.route("/upload", methods=['POST']) def upload(): if request.method == "POST": f = request.files['file'] f.save(os.path.join(UPLOAD_FOLDER, f.filename)) upload_file(f"uploads/{f.filename}", BUCKET) return redirect("/storage") @app.route("/download/", methods=['GET']) def download(filename): if request.method == 'GET': output = download_file(filename, BUCKET) return send_file(output, as_attachment=True) if __name__ == '__main__': app.run(debug=True)
Это простое приложение колбы с 4 конечными точками:
- Конечная точка
/storage
будет целевой страницей, на которой мы будем отображать текущие файлы в нашем ведре S3 для загрузки, а также вход для пользователей, чтобы загрузить файл в наше ведро S3, - Конечная точка
/upload
будет использоваться для получения файла, а затем вызовет методupload_file ()
, который загружает файл в корзину S3 - Конечная точка
/download
получит имя файла и использует методdownload_file()
для загрузки файла на устройство пользователя
И, наконец, наш HTML-шаблон будет таким же простым, как:
FlaskDrive Flask Drive: S3 Flask Demo
Welcome to this AWS S3 Demo
Upload your file here:
These are your uploaded files:
Click on the filename to download it.
{% for item in contents %}
- {{ item.Key }}
{% endfor %}
Настроив наш код и папки, мы начинаем наше приложение с:
$ python app.py
Когда мы переходим к http://localhost:5000/storage
нас приветствует следующая целевая страница:
Давайте теперь загрузим файл с помощью поля ввода и это будет выход:
Мы можем подтвердить загрузку, проверив панель мониторинга S3, и мы можем найти там наше изображение:
Наш файл был успешно загружен с нашей машины в хранилище AWS S3.
На вашей целевой странице Flash Drive мы можем загрузить файл, просто нажав на имя файла, а затем получить приглашение сохранить файл на наших машинах.
Вывод
В этом посте мы создали приложение Flask, которое хранит файлы на Aws S3 и позволяет нам загружать те же файлы из нашего приложения. Мы использовали библиотеку Boto3 вместе с инструментом AWS CLI для обработки взаимодействия между нашим приложением и AWS.
Мы избавились от необходимости иметь собственные серверы для хранения наших файлов и подключились к инфраструктуре Amazon, чтобы обрабатывать их для нас через сервис AWS Simple Storage. Нам потребовалось короткое время, чтобы разработать, развернуть и сделать наше приложение доступным для конечных пользователей, и теперь мы можем улучшить его, добавив разрешения среди других функций.
Исходный код этого проекта доступен здесь, на Github .