내 Python 서버리스 설정
12362 단어 lambdaserverlesspythonaws
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으로 작업하는 경우 유용하게 사용할 수 있기를 바라며 이 설정을 개선하는 방법에 대한 아이디어가 있으면 알려주세요!
Reference
이 문제에 관하여(내 Python 서버리스 설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/egrajeda/my-python-serverless-setup-ca1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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}
$ cd functions/hello
$ python -mvenv venv
$ source venv/bin/activate
$ pip install -r requirements.txt
package:
exclude:
- ./**
include:
- functions/hello/lib/function.py
- functions/hello/venv/lib/python3.6/site-packages/**
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
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
package:
individually: true
$ sls package
$ ls -lh .serverless/*.zip
-rw-r--r-- 1 egrajeda egrajeda 18M Aug 25 20:59 .serverless/chatty.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
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
functions:
hello:
handler: functions/hello/lib/function.main
environment:
NAME: ${opt:name, "John Doe"}
$ sls deploy -v --name="Eduardo"
Reference
이 문제에 관하여(내 Python 서버리스 설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/egrajeda/my-python-serverless-setup-ca1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)