내 Python 서버리스 설정

나는 몇 년 동안 여가 시간에 Serverless와 Python을 가지고 놀았고 최근에는 직장에서 놀았습니다. 내 기본 설정(serverless.yml 및 디렉토리 구조)이 동일하게 유지되는 것을 확인했습니다.

내가 공유하려는 내용의 대부분은 온라인에서 쉽게 찾을 수 있지만 누군가 유용하다고 생각하고 개선 방법에 대한 피드백과 아이디어를 얻을 수 있도록 한 곳에서 공유하기로 결정했습니다.

Github에서 이 예제에 대한 전체 작업 소스 코드를 얻을 수 있습니다.


egrajeda / 서버리스-파이썬-템플릿


Serverless 및 Python으로 작업할 때 사용하는 꽤 기본적인 템플릿입니다.





읽어보기


이것은 내가 작업할 때 사용하는 아주 기본적인 템플릿입니다.
Serverless 및 파이썬.
보다 자세한 설명은 다음을 참조하십시오.



View on GitHub



서버리스.yml



두 개의 엔드포인트가 있는 단일 API에 대한 간단한serverless.yml 공유로 시작한 다음 일부에 대해 설명하겠습니다.

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: [email protected]
    alarms:
      - functionErrors
      - functionThrottles
  config:
    region: ${opt:region, self:provider.region}
    stage: ${opt:stage, self:provider.stage}


디렉토리 구조



코드, 테스트 및 종속성을 가능한 한 분리하여 유지하기 위해 함수당 하나의 디렉토리를 만듭니다. 이 예에서 각 함수에는 functions/hello/functions/joke/ 와 같은 자체 디렉터리가 있습니다.



함수 처리기의 코드는 항상 내부에 있습니다lib/function.py. 내부에 필요한 만큼의 파일lib/을 생성하지만 진입점은 항상 같은 위치에 있습니다. 이 모든 코드에 해당하는 테스트는 tests/ 아래에 있습니다.

또한 setup.py 파일, venv/ 아래의 가상 환경 및 requirements.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를 수동으로 업데이트하지 않으면 종속성을 찾을 수 없습니다. 다음은 functions/joke/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 파일 및 테스트 실행



standard content을 사용하여 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 아래에 빈tests/ 파일을 만들지 않으면 스크립트가 테스트를 실행할 수 없습니다.

각 기능을 개별적으로 패키징



서버리스가 하나의 큰 ZIP 파일을 생성하여 모든 기능에 업로드하는 것을 방지하기 위해 각 기능을 개별적으로 패키징합니다.

package:
  individually: true


정상적인 상황에서 서버리스는 하나의 단일 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


serverless-plugin-aws-alerts 플러그인



serverless-plugin-aws-alerts 이름은 자명하기 때문에 여기에서 할 말이 없습니다.

나는 최근에 경고를 수동으로 설정하지 않고도 내 기능의 특정 측면을 모니터링하기 위해 이 플러그인을 사용하기 시작했습니다.

전개



여기에 특별한 것은 없지만 발견하는 데 시간이 좀 걸렸던 것을 언급하고 싶었습니다: referencing CLI options .

예제에서 함수 중 하나는 ${opt:name}를 사용하여 --name 변수가 CLI를 통해 전달될 것으로 예상합니다.

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


따라서 이것을 배포할 때 다음을 사용합니다.

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


그리고 그게 다야



일부 내용(예: 리소스 생성 및 serverless-pseudo-parameters 플러그인)을 생략해야 했지만 전체 게시물이 원래 예상했던 것보다 길어졌습니다.

Serverless 및 Python으로 작업하는 경우 유용하게 사용할 수 있기를 바라며 이 설정을 개선하는 방법에 대한 아이디어가 있으면 알려주세요!

좋은 웹페이지 즐겨찾기