Управление файлами с помощью 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 и библиотеки.

Что такое бото3?

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 

Эта команда предложит нам указать Access Key ID , Secret Access Key , регионы по умолчанию и форматы вывода. Более подробную информацию о настройке инструмента AWS CLI можно найти здесь .

Наше приложение - FlaskDrive

Настраивать

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

Мы будем использовать Boto3 SDK для облегчения этих операций и создадим простой интерфейс, который позволит пользователям загружать и просматривать файлы, размещенные в Интернете.

Желательно использовать виртуальную среду при работе над проектами Python, и для этого мы будем использовать инструмент Pipenv для создания и управления нашей средой. После настройки мы создаем и активируем нашу среду с Python3 следующим образом:

 $ pipenv install --three 
 $ pipenv shell 

Теперь нам нужно установить Boto3 и Flask , которые необходимы для сборки нашего приложения FlaskDrive, как показано ниже:

 $ pipenv install flask 
 $ pipenv install boto3 

Выполнение

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

После создания корзины мы можем использовать инструмент командной строки для просмотра доступных нам корзин:

 $ 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/<filename>", 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) 

Это простое приложение Flask с 4 конечными точками:

  • /storage будет целевой страницей, на которой мы будем отображать текущие файлы в нашей корзине S3 для загрузки, а также вход для пользователей для загрузки файла в нашу корзину S3,
  • /upload будет использоваться для получения файла и последующего вызова upload_file() который загружает файл в корзину S3.
  • /download получит имя файла и будет использовать метод download_file() для загрузки файла на устройство пользователя.

И, наконец, наш HTML-шаблон будет таким простым, как:

 <!DOCTYPE html> 
 <html> 
 <head> 
 <title>FlaskDrive</title> 
 </head> 
 <body> 
 <div class="content"> 
 <h3>Flask Drive: S3 Flask Demo</h3> 
 <p>Welcome to this AWS S3 Demo</p> 
 <div> 
 <h3>Upload your file here:</h3> 
 <form method="POST" action="/upload" enctype=multipart/form-data> 
 <input type=file name=file> 
 <input type=submit value=Upload> 
 </form> 
 </div> 
 <div> 
 <h3>These are your uploaded files:</h3> 
 <p>Click on the filename to download it.</p> 
 <ul> 
 {% for item in contents %} 
 <li> 
 <a href="/download/{{ item.Key }}"> {{ item.Key }} </a> 
 </li> 
 {% endfor %} 
 </ul> 
 </div> 
 </div> 
 </body> 
 </html> 

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

 $ python app.py 

Когда мы переходим по http://localhost:5000/storage нас приветствует следующая целевая страница:

flask_drive_landing_1{.ezlazyload}

Давайте теперь загрузим файл, используя поле ввода, и это результат:

flask_drive_landing_2{.ezlazyload}

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

flask_drive_s3_dashboard{.ezlazyload}

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

На нашей целевой странице FlaskDrive мы можем загрузить файл, просто щелкнув имя файла, после чего мы получим приглашение сохранить файл на наших машинах.

Заключение

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

Мы избавились от необходимости иметь собственные серверы для хранения наших файлов и подключились к инфраструктуре Amazon, чтобы обрабатывать их за нас через AWS Simple Storage Service. Нам потребовалось немного времени, чтобы разработать, развернуть и сделать наше приложение доступным для конечных пользователей, и теперь мы можем улучшить его, добавив разрешения среди других функций.

Исходный код этого проекта доступен здесь, на Github .

comments powered by Disqus