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

Бессерверная разработка приложений Python с помощью AWS Chalice

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

Вступление

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

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

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

Что, если бы мы могли сделать наше приложение доступным, не беспокоясь о подготовке серверов или их обслуживании? Наша маневренность и скорость доставки значительно повысятся.

Мы можем достичь этого с помощью бессерверной вычислительной платформы , такой как AWS Lambda , которая доступна через Amazon Web Services .

Что такое Бессерверные вычисления?

Облачные провайдеры предлагают различные решения для развертывания и запуска приложений, одним из которых являются бессерверные вычисления. В этой архитектуре облачный провайдер размещает ваши приложения и берет на себя ответственность за управление сервером с точки зрения программного и аппаратного обеспечения. Подумайте об этом как о Инфраструктуре как услуге (IaaS).

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

Бессерверные вычисления имеют свои преимущества, но они также имеют некоторые недостатки, такие как разработчик ограничен опциями или инструментами, которые поставщик использует для таких целей, как ведение журнала, трассировка и мониторинг, и разработчик не может использовать свои собственные инструменты. Кроме того, как разработчик, вы привязаны к доступности провайдера, если у них возникают проблемы или перебои, то это также влияет на наше приложение.

AWS-ведущий облачный провайдер, предлагающий бессерверные вычисления через AWS Lambda. Это бессерверная вычислительная среда выполнения, которая позволяет разработчикам запускать свой код в ответ на определенные события от пользователей, такие как запрос или загрузка файлов в корзину S3 .

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

Что такое Чаша?

Chalice – это микрорамка для создания и быстрого развертывания бессерверных приложений на Python в лямбда-функциях AWS. Chalice не только помогает нам создавать приложения на Python, но и быстро развертывать их, предоставляя инструмент командной строки для создания, управления и развертывания нашего приложения.

Chalice также предоставляет функции интеграции с другими сервисами Amazon, такими как Amazon API Gateway, Amazon Simple Storage Service(S3) и Simple Queue Service (SQS). Мы можем создавать RESTful API, задачи, которые выполняются по определенному расписанию или интегрируются в корзину S3 для хранения.

Установка

Настройка AWS

Чтобы начать работу с Chalice, нам нужно иметь учетную запись AWS, настроенную для взаимодействия и развертывания нашего кода. Это может быть достигнуто через домашнюю страницу AWS , где мы можем зарегистрироваться или войти в существующую учетную запись AWS. AWS требует, чтобы мы не только предлагали вам подробную информацию, но и ваши платежные реквизиты, но для этой демонстрации мы будем использовать AWS Free Tier для целей тестирования и разработки, за которые нам не будут выставляться счета.

Как только ваша учетная запись настроена, в раскрывающемся списке вашего профиля появится раздел под названием “Мои учетные данные безопасности”. Здесь мы сможем создать учетные данные, которые будут использоваться при взаимодействии с консолью AWS. Эти учетные данные также будут использоваться инструментом Amazon CLI.

Amazon также предлагает инструмент CLI, который мы можем использовать для взаимодействия с нашими сервисами AWS с помощью команд в вашем терминале. Он доступен для платформ Mac, Linux и Windows и требует Python 2.6+ или Python 3.3 или более поздней версии. Мы можем установить его, выполнив следующую команду pip:

$ pip install awscli

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

$ aws --version

Более подробную информацию об инструменте CLI и его установке на другие платформы можно найти здесь .

При настройке инструмента AWS CLI мы будем использовать учетные данные, то есть секретный ключ и идентификатор доступа, которые мы сгенерировали ранее, чтобы настроить наш инструмент CLI, запустив его:

$ aws configure

Мы получим приглашение заполнить наш Идентификатор ключа доступа , Секретный ключ доступа и регионы по умолчанию и выходные форматы. Последние два являются необязательными, но нам понадобится ключ доступа и секрет, которые мы получили из панели мониторинга консоли AWS.

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

Настройка проекта

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

Если инструмент Virtualenv еще не установлен, мы можем установить его, просто запустив:

$ pip install virtualenv

Более подробную информацию об инструменте Virtualenv можно найти здесь .

Установив Virtualenv, давайте перейдем в наш рабочий каталог и создадим среду, выполнив следующую команду:

$ virtualenv --python=python3 venv-chalice

Мы активируем нашу среду, запустив:

$ source venv-chalice/bin/activate

Теперь наша среда настроена, и теперь мы можем установить Чашу и проверить установку, выполнив следующие команды:

$ pip install chalice
$ chalice --help

Вторая команда здесь просто используется для проверки установки Чаши.

Реализация

Теперь у нас есть учетная запись AWS, установленный инструмент AWS CLI, настройка среды и Чаша. Теперь мы можем использовать Chalice для создания нашего простого RESTful API следующим образом:

$ chalice new-project demoapp

Эта команда создает простой проект Чаши в папке со следующей структурой:

$ tree demoapp
demoapp
├── app.py
└── requirements.txt

Любые другие требования, которые наше приложение Chalice потребует для запуска во время развертывания на AWS Lambda, войдут в requirements.txt файл в папке demoapp , и наша новая функциональность будет в основном находиться в папке app.py файл. Мы можем создавать другие файлы и импортировать их в app.py файл, который является нашим основным файлом проекта.

Для нашего простого API мы создадим API, который возвращает список общедоступных репозиториев GitHub пользователя, языки, используемые в каждом из них, и количество звездочек, которые есть в этом репозитории. Эта информация находится в открытом доступе на API GitHub, поэтому нам не понадобятся учетные данные для взаимодействия с API. Мы создадим функцию, которая получает имя пользователя и возвращает необходимые нам данные. Если предоставленное имя пользователя не существует, то мы получим пустую полезную нагрузку ответа.

Давайте создадим функцию github_repos , которая будет отвечать за взаимодействие с API GitHub:

import requests

def github_repos(username):
    # Final list to contain our repository objects
    formatted_repos = []

    if username:
        # Format the url by insterting the passed username
        url = "https://api.github.com/users/{}/repos".format(username)

        r = requests.get(url)

        # Get the JSON containing the list of repositories
        list_of_repos = r.json()

        for repo in list_of_repos:
            repo_object = {
              "name": repo["name"],
              "stars": repo["watchers"],
              "language": repo["language"],
            }

            formatted_repos.append(repo_object)

    return formatted_repos

Функция github_repos получает имя пользователя и подключает его к URL-адресу API GitHub перед отправкой запроса. В полученном ответе содержится много информации, которая нам сейчас не нужна, поэтому мы извлекаем нужные нам детали репозитория, создаем новый объект и добавляем его в список formatted_repos , который отправим обратно пользователю через приложение Chalice.

Давайте сначала проведем несколько локальных тестов для нашей функции, и вот результат:

выход локального тестирования

Теперь эта функция готова к интеграции в наше приложение Chalice на сайте app.py файл, и это окончательная версия нашего приложения:

import requests
from chalice import Chalice

def github_repos(username):
    # Function implementation above

app = Chalice(app_name='demoapp')

@app.route('/')
def index():
    return {'hello': 'world'}

# Create our new route to handle github repos functionality
@app.route('/user/{username}')
def github(username):
    return {"repos": github_repos(username)}

Теперь наше приложение готово к использованию пользователями, давайте теперь развернем его на AWS Lambda.

Развертывание нашего приложения

Развертывание приложения Chalice в AWS Lambda так же просто, как выполнение следующей команды в нашем рабочем каталоге:

$ chalice deploy

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

чаша развернуть выход

Чтобы протестировать наш API, мы можем использовать Postman , веб-браузер или любой другой инструмент взаимодействия API для выполнения запросов к конечной точке user/ на “REST API URL” из скриншота выше. Я передал свое имя пользователя GitHub, и это был результат:

ответ почтальона

Если мы внесем какие-либо изменения в наш код, мы просто снова запустим команду chalice deploy , и Chalice повторно развернет наше приложение с теми изменениями, которые мы только что внесли.

Когда мы переходим к консоли AWS и нажимаем на раздел “Функции” в складной боковой панели слева, мы видим лямбда-функцию, которая в данный момент запускает наше приложение:

лямбда на консоли aws

Когда мы нажимаем на нашу функцию, мы получаем более подробную информацию о ней, такую как текущая конфигурация, переменные среды, установленные для нашего приложения, роли выполнения и конфигурация памяти.

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

Это представление панели мониторинга для вашего приложения:

мониторинг cloudwatch

Мы получаем статистику по количеству обращений пользователей, длительности запросов, обслуживаемых нашим API, частоте успеха и ошибок, среди прочего.

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

Это бессерверный опыт.

Резюме

В этой статье мы создали бессерверный Python API с использованием микро-фреймворка Chalice и развернули его на AWS Lambda. AWS CLI, наряду с инструментами Chalice CLI, помог нам быстро загрузить наш проект, и мы развернули его в AWS Lambda, используя всего одну команду.

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

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