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

Развернуть приложения Lambda с помощью Framework без сервера

Эта тема является предметом моей презентации в группе пользователей AWS Mega Manila Meetup 21 мая, 20 … с меткой AWS, без сервера, DevOps, Python.

Эта тема является предметом моей презентации в группе пользователей AWS Mega Manila Meetup 21 мая 2020 года.

Функции-как услуга (FAAS) открыли эпоху без серверных приложений. Разработчики, взволнованные обещанием отсутствия серверов для управления, внезапно обнаружили, что, хотя FAAS удаляет многие болевые точки управления серверами, он также вводит свои проблемы.

Одна из этих проблем – как развернуть. С однофункциональным примером «Hello World» FAAS выглядит очень просто. Но по мере того, как мы создаем полностью откровенные приложения без серверов, сложность начинает расти: мы добавляем больше файлов, наши каталоги начинают расти и добавляем все больше и больше зависимостей. Вручную развертывание всего этого было бы даже медленнее, чем развертывание традиционных монолитных приложений.

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

Облачная формация

Один из способов облегчить развертывание – это облачная информация (CF). С помощью CF мы пишем шаблоны, которые описывают каждый компонент нашей инфраструктуры. Поскольку мы кормим шаблон непосредственно в AWS, мы должны очень условно в письменной форме. Простая настройка часто требует более 100 строк в код YAML/JSON.

Lambda развертывание

Чтобы облегчить это бремя, рамки развертывания создают слой абстракции поверх CloudFormation. Вместо того, чтобы писать более 100 строк кода, мы используем специальный синтаксис Framework, чтобы записать один и тот же код в нескольких строках. Хотя это означает, что структура делает предположения о конкретных компонентах нашей функции Lambda, мы всегда можем добавить больше линий, чтобы быть более явными.

Без сервера Framework

В этом посте мы смотрим на Без сервера Framework Анкет Сама структура является облачной, оживленной и поддерживает многих облачных провайдеров (например, AWS, GCP, Azure и т. Д.). В этом посте мы сосредоточены на его функциональности AWS.

Чтобы начать, следуйте шагам ниже:

  • Давайте установим Framework без сервера из Здесь Анкет Если вы устанавливаете с Mac, не забудьте разместить эту команду экспорта Экспорт к вашему .bashrc / .zshrc Анкет
  • Тогда мы должны убедиться, что у нашей локальной машины есть AWS CLI установлен и Настройка, чтобы иметь доступ пользователю на уровне администратора.

Практический пример, который мы собираемся выполнить в основном, обеспечивает функцию лямбды и таблицу DynamoDB. Это также создает роль IAM, так что функция лямбды могла получить доступ к Dynamodb. Мы также устанавливаем плагины без серверов, чтобы мы могли загружать зависимости от Python (Quart и Mangum, которые будут обсуждаться позже).

(3.1) Чтобы создать наше первое приложение Lambda, используя Framework без сервера, давайте запустим Serverless Create-Template AWS-Python3-Path Helloworld Анкет

Эта команда должна создать два файла:

  • handler.py – Пример файла Python для нашего приложения Lambda
  • Serverless.yml – В этом файле мы определяем нашу инфраструктуру. Предварительно сгенерированный фрагмент определяет простую функцию Lambda. У него также есть много комментариев, показывающих, как использовать структуру для более сложных вариантов использования.

Если у вас уже есть функция Lambda, вы можете просто добавить Serverless.yml Файл в корневом каталоге. Без сервера фреймворк интегрируется прямо в.

(3.2) Чтобы показать мощность без серверов, мы строим на более сложном примере. Мы создаем приложение, которое отображает сообщения в блоге. Начнем с замены содержимого Serverless.yml Файл с фрагментом ниже.

Главным образом, новый шаблон разделен на пять разделов:

  • Сервис – Название услуги
  • поставщик – Мы определяем облачный провайдер и время выполнения по умолчанию для наших функций Lambda. Мы также определили роль IAM по умолчанию, которая будет создана и использована для всех функций Lambda (если ни одна из них не была четко определена). Роль, которую мы определили, позволяет нашим функциям Lambda иметь полный доступ ко всем таблицам DynamoDB в нашей учетной записи.
  • функции – Мы определяем функции Lambda для нашего приложения. Мы определяем одну функцию Lambda с именем “Hello”. В этой функции обработчик определяет точку входа для нашего приложения. Мы также определяем маршрут «/», который будет доступен через API Gateway. Это означает, что мы можем назвать нашу функцию Lambda из нашего браузера с этим маршрутом. Если сейчас это не имеет смысла, следуйте И я продемонстрирую это.
  • Пакет – Мы можем исключить/включить определенные файлы и каталоги из пакета, которые будут загружены в Lambda.
  • Ресурсы – Это облачная часть нашего шаблона. Здесь мы определяем наши ресурсы AWS, которые нам могут понадобиться как часть нашей инфраструктуры. В этом случае мы определили простую таблицу DynamoDB для хранения данных наших сообщений в блоге. Таблица имеет первичный ключ «post_number» и атрибут «Сообщения».
service: helloworld

provider:
  name: aws
  runtime: python3.7
  region: us-west-2
  iamRoleStatements:
    - Effect: "Allow"
      Action: "dynamodb:*"
      Resource: "*"

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: /
          method: get

package:
  exclude:
    - venv/**

resources:
  Resources:
    orderTwo:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: post
        AttributeDefinitions:
          - AttributeName: "post_number"
            AttributeType: "N"
        KeySchema:
          - AttributeName: post_number
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

(3.3) Чтобы проверить наше приложение, давайте развернем это прямо сейчас с Без сервера развертывание командование Вы должны увидеть публичный URL вашего заявления.

Затем посетите свой браузер, используя ссылку. Вы должны увидеть JSON, отображаемый на вашем экране

Приложения Lambda часто имеют зависимости. В этом разделе мы будем работать с Quart, альтернативой Framework Framework. Мы также установим Mangum, чтобы мы могли перенести наше квартальное веб -приложение в Lambda.

(4.1)

Чтобы установить зависимости Python с помощью Server Server Framework, мы должны установить плагин без сервера с названием Без сервера питона-реквизита . Мы будем использовать эту команду Установка плагина без сервера -n Сервер без питона-провозглашения Анкет Этот плагин обнаруживает зависимости, которые мы пишем на Требования.txt Файл и упаковывает их с нашей функцией лямбды.

Экосистема без сервера Framework богата. У него гораздо больше плагинов, которые могут помочь решить некоторые проблемы, которые у вас могут возникнуть.

(4.2)

В корневом каталоге вашего проекта выполните следующие команды. Здесь мы запускаем виртуальную env Python и устанавливаем кварц веб -фреймворта. Quartz – это современная альтернатива Flask, использующую ASGI вместо технологии WSGI для сервера приложений.

# create a python virtual env to keep our Python installation clean
python3 -m venv venv
source venv/bin/activate

# install mangum and quartz
pip install mangum
pip install quart
pip freeze > requirements.txt

(4.3) Теперь давайте заменим содержимое нашего handler.py С фрагментом ниже.

from mangum import Mangum
from quart import Quart

app = Quart(__name__)

@app.route("/")
async def hello():
    return "hello world!"

hello = Mangum(app)

(4.5) Чтобы увидеть изменения в Lambda, выполнить Без сервера развертывание Анкет

(5.1) Создайте файл с именем Database_wrapper.py и добавьте фрагмент ниже. В этом файле мы создаем код, который читает и записывает из нашей таблицы DynamoDB.

import boto3
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError
from datetime import datetime

def try_ex(func):
    try:
        return func()
    except KeyError:
        return None

def read_post(post_number):
    dynamodb = boto3.resource("dynamodb", region_name='us-west-2')
    table = dynamodb.Table('post')
    item = None

    try:
        response = table.get_item(Key={'post_number': post_number})
    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        item = try_ex(lambda: response['Item'])
        if item is None:
            return False


    return item

def write_post(post_number):
    dynamodb = boto3.resource("dynamodb", region_name='us-west-2')
    table = dynamodb.Table('post')
    response = table.put_item(
       Item={
            'post_number': post_number,
            'message': 'this information is read from a DynamoDB table',
        }
    )

(5.2) Изменить handler.py Чтобы ссылаться на функции read_post и write_post из Database_wrapper.py файл. По сути, мы добавили код, который считывает сообщение с Post_Number 1 из таблицы Post. Если пост еще не существует, мы создаем для него новую запись.

from mangum import Mangum
from quart import Quart
from database_wrapper import read_post, write_post

app = Quart(__name__)

@app.route("/")
async def hello():
    post = read_post(1)
    if not post:
        write_post(1)
        post = read_post(1)

    return post['message']

hello = Mangum(app)

(5.3) Затем мы снова развертываем, используя Без сервера развертывание . Мы должны быть в состоянии увидеть новое сообщение. Это сообщение получено из таблицы DynamoDB.

Оригинал: “https://dev.to/raphael_jambalos/deploy-lambda-applications-with-the-serverless-framework-500p”