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

Моя настройка без сервера Python

Краткое представление о том, как я структурирую свои без серверных проектов. Tagged с без сервера, Python, Lambda, AWS.

Я играл с Серверный и Python в течение нескольких лет в свободное время, а в последнее время на работе. Я заметил, что моя основная настройка ( serverless.yml и структура каталогов) осталась прежней.

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

Вы можете получить полный рабочий исходный код для этого примера на GitHub:

egrajeda/server-python-template

Довольно простой шаблон, который я использую при работе с Serverless и Python.

Это довольно простой шаблон, который я использую при работе с Серверный и питон.

Для более подробного объяснения, пожалуйста, посмотрите:

https://dev.to/egrajeda/my-python-serverless-setup-ca1

Serverless.yml

Позвольте мне начать с того, что поделились простым Serverless.yml Для одного API с двумя конечными точками, а затем я начну комментировать его кусочки:

service: chatty

provider:
  name: aws
  runtime: python3.6
  stage: dev

package:
  individually: true

functions:
  hello:
    handler: functions/hello/lib/function.main
    environment:
      NAME: ${opt:name, "John Doe"}
    events:
      - http: GET hello
    package:
      exclude:
        - ./**
      include:
        - functions/hello/lib/function.py
        - functions/hello/venv/lib/python3.6/site-packages/**

  joke:
    handler: functions/joke/lib/function.main
    events:
      - http: GET joke
    package:
      exclude:
        - ./**
      include:
        - functions/joke/lib/function.py
        - functions/joke/venv/lib/python3.6/site-packages/**

plugins:
  - serverless-plugin-aws-alerts

custom:
  alerts:
    stages:
      - production
    topics:
      alarm:
        topic: ${self:service}-${self:custom.config.stage}-alerts
        notifications:
          - protocol: email
            endpoint: me@egrajeda.com
    alarms:
      - functionErrors
      - functionThrottles
  config:
    region: ${opt:region, self:provider.region}
    stage: ${opt:stage, self:provider.stage}

Структура каталога

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

Код обработчика функции всегда внутри lib/function.py Анкет Я создаю столько файлов внутри lib/ По мере необходимости, но точка входа всегда в одном месте. Соответствующие тесты для всего этого кода находятся под тесты/ Анкет

Я также инициализирую каждый каталог функций с помощью setup.py Файл, виртуальная среда в рамках venv/ и список требований Для каждой конкретной функции в Требования.txt Анкет

Виртуальная среда

Справочник каждой функции инициализируется виртуальной средой:

$ cd functions/hello
$ python -mvenv venv
$ source venv/bin/activate

Затем я определяю и устанавливаю его зависимости:

$ pip install -r requirements.txt

Виртуальная среда затем используется в каждом объявлении функции в Serverless.yml :

    package:
      exclude:
        - ./**
      include:
        - functions/hello/lib/function.py
        - functions/hello/venv/lib/python3.6/site-packages/**

Как видите, утверждается, что только lib/function.py и его зависимости должны быть упакованы, а затем загружены.

Когда ваш код запускается в Интернете, он не сможет найти свои зависимости, если вы вручную не обновляете sys.path В верхней части каждого файла, который будет их использовать. Это первые строки функции/шутка/lib/function.py :

import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../venv/lib/python3.6/site-packages"))

import requests # Any manually installed dependency has to be added *after* updating the path

Файл setup.py и запуск тестов

Я создаю setup.py с Стандартный контент и указать, где находятся тесты:

from setuptools import setup, find_packages

setup(name='joke',
      packages=find_packages(),
      test_suite='tests')

Затем я использую его для запуска тестов:

$ cd functions/joke
$ source venv/bin/activate
$ python setup.py test

Обязательно создайте пустой __init__.py Файл под тесты/ Или сценарий не сможет запустить тесты.

Упаковать каждую функцию индивидуально

Я упаковываю каждую функцию индивидуально, чтобы избежать сервера от создания одного большого zip -файла и загружать его на каждую функцию:

package:
  individually: true

При нормальных обстоятельствах Serverless будет генерировать один пакет ZIP и загрузить его на S3:

$ sls package
$ ls -lh .serverless/*.zip
-rw-r--r-- 1 egrajeda egrajeda 18M Aug 25 20:59 .serverless/chatty.zip

Если вы упаковываете их по отдельности, Serverless будет генерировать один пакет ZIP на функцию:

$ sls package
$ ls -lh .serverless/*.zip
-rw-r--r-- 1 egrajeda egrajeda 3.8M Aug 25 21:11 .serverless/hello.zip
-rw-r--r-- 1 egrajeda egrajeda 4.8M Aug 25 21:11 .serverless/joke.zip

Параметры $ {self: custom.config}

Я храню все свои пользовательские переменные в рамках Custom.config , на что я затем ссылаюсь на во всем Serverless.yml Анкет

Этот пример не использует никаких ресурсов, но если бы я использовал таблицы DynamoDB или темы SNS, я бы назначал их уникальные имена переменным:

custom:
  config:
    region: ${opt:region, self:provider.region}
    stage: ${opt:stage, self:provider.stage}
    dynamoDb:
      confTable: ${self:service}-${self:custom.config.stage}-conf
    sns:
      newTransactionsTopic: ${self:service}-${self:custom.config.stage}-new-transactions

Плагин без сервера-плугин-AWS-Alerts

Не много говорить здесь как Сервер без плугин-я-альтертс Имя довольно эксплуатационно.

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

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

Здесь ничего особенного, но я хотел упомянуть что -то, что потребовалось некоторое время, чтобы открыть: Ссылка на варианты CLI Анкет

В примере одна из функций ожидает $ {opt: имя} переменная, которая должна быть передана через CLI с помощью --имя :

functions:
  hello:
    handler: functions/hello/lib/function.main
    environment:
      NAME: ${opt:name, "John Doe"}

Поэтому, когда я развертываю это, я использовал:

$ sls deploy -v --name="Eduardo"

Вот и все

Весь пост оказался длиннее, чем я первоначально ожидал, хотя мне пришлось оставить какие-то вещи (например, создание ресурсов и плагин без сервера-псевдо-параметров

Если вы работаете с Serverless и Python, я надеюсь, что вы найдете это полезным, и если у вас есть идеи о том, как улучшить эту настройку, пожалуйста, дайте мне знать!

Оригинал: “https://dev.to/egrajeda/my-python-serverless-setup-ca1”