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

Управление файлами с помощью AWS S3, Python и Flask

AWS S3-это сервис, который позволяет нам легко управлять хранилищем файлов в облаке. В этой статье мы будем управлять загрузкой файлов с помощью Python и Flask

Автор оригинала: Robley Gori.

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

Настроив наш код и папки, мы начинаем наше приложение с:

$ python app.py

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

flash_drive_landing_1

Давайте теперь загрузим файл с помощью поля ввода и это будет выход:

flash_drive_landing_2

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

flash_drive_s3_dashboard

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

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

Вывод

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

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

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