Как создать бессерверное приложение с помощью AWS Chalice

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

AWS Chalice  —  это бессерверная платформа, которая позволяет создавать бессерверные приложения с помощью Python и развертывать их на AWS через Amazon API Gateway и AWS Lambda.

Я решил опробовать его и действительно смог всего за несколько минут создать и развернуть образец REST API на AWS.

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

Предусловия

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

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

Как настроить учетные данные AWS

“Под капотом” для развертывания проекта Chalice задействует интерфейс командной строки AWS. Если вы раньше не пользовались клиентом командной строки AWS для работы с ресурсами AWS, вы можете установить его, следуя приведенным здесь рекомендациям.

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

Как установить Chalice

Далее нужно установить Chalice. Здесь мы воспользуемся Python 3, но вы можете выбрать любую версию Python, которая поддерживается AWS Lambda.

Проверка установки Python

Установка Chalice

Проверка установки Chalice

Как создать проект

Выполните команду chalice new-project, чтобы создать новый проект.

Это создаст в вашем текущем каталоге папку daily-news. Как видите, Chalice создает в этой папке несколько файлов Мы будем работать только с файлами app.py и requirements.txt.

Взглянем на содержимое файла app.py:

from chalice import Chalice

app = Chalice(app_name='daily-news')

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

Команда new-project создала образец приложения daily-news. Он определяет единственное представление /, которое при вызове возвращает тело в формате JSON {“hello”: “world”}. Этот шаблон можно изменить и добавить больше кода для чтения новостей из Google.

Чтобы получать новости, воспользуемся RSS-каналом Google. Поскольку RSS-каналы состоят из данных в формате XML, для их анализа нам понадобится библиотека Python под названием Beautiful Soup.

Установить Beautiful Soup и дополнительную библиотеку синтаксического анализа XML можно с помощью pip:

Затем добавьте следующие файлы импорта в app.py. Это, по сути, добавляет импорт из urllib для производства HTTP-вызовов и bs4 для анализа XML.

import bs4
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen

news_url = "https://news.google.com/news/rss"

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

Для этого добавьте в свой app.py следующий код:

def get_news_from_google():
    client = urlopen(news_url)
    page = client.read()
    client.close()
    souped = soup(page, "xml")
    news_list = souped.findAll("item")
    result = []
    for news in news_list:
        data = {}
        data['title'] = news.title.text
        data['date'] = news.pubDate.text
        result.append(data)
    return result

Обновите метод индекса в app.py, чтобы вызвать этот метод и в результате вернуть список новостей.

@app.route('/news')
def index():
    news = get_news_from_google()
    return {'result': news}

Обратите внимание: вы установили несколько зависимостей, чтобы код заработал. Эти зависимости были установлены локально и не будут доступны контейнеру AWS Lambda во время выполнения.

Чтобы сделать их доступными для AWS Lambda, нужно будет упаковать их вместе с вашим кодом.

Для этого добавьте приведенное ниже содержимое к файлу requirements.txt. Chalice во время сборки упаковывает эти зависимости как часть вашего кода и загружает их как составляющую лямбда-функции.

beautifulsoup4==4.9.3
bs4==0.0.1
soupsieve==2.0.1
lxml==4.5.2

Как развернуть проект

Теперь развернем это приложение. Выполните команду chalice deploy из папки daily-news.

Это позволит развернуть ваш API на Amazon API Gateway и создать новую функцию на AWS Lambda.

daily-news API
daily-news-dev Lambda Function

Попробуем получить доступ к API прямо сейчас. Для вызова URL-адреса шлюза API, полученного во время chalice deploy, можно воспользоваться curl. Ответ на вызов API вернет список новостей, как показано ниже.

Как очистить ресурсы

Для удаления всех ресурсов, созданных при выполнении команды chalice deploy, можно воспользоваться командой chalice delete.

Вывод

Поздравляю! Вы только что развернули бессерверное приложение на AWS с помощью Chalice. Оказалось, это не слишком сложно.

Теперь вы можете двигаться дальше, вносить любые модификации в свой app.py и повторно развертывать chalice deploy для заливки последующих изменений.

C помощью Chalice также можно добиться интеграции вашего бессерверного приложения с Amazon S3, Amazon SNS, Amazon SQS и другими сервисами AWS. Изучите другие руководства и продолжайте исследовать. Полный исходный код из этой статьи можно найти здесь.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи: Siben Nayak, “How to Build a Serverless Application Using AWS Chalice”