인턴 때 Serverless Framework에 대해 조사하며 정리한 Serverless.yml 사용 방법이다.
Install serverless framework
$sudo npm install -g serverless
Create Python project
$ serverless create \
--template aws-python3 \
--name customer
--path customer : make 'customer' directory
.serverless
파일 설정service: kinesisconsumer
provider:
name: aws
runtime: python3.8
serverless에서 권한을 생성하는 경우
provider:
region: ap-northeast-2
#if you have a multi environment use stage (prod/dev)
stage: dev
iamRoleStatements:
- Effect: Allow
Action:
- kinesis:GetRecords
- kinesis:GetShardIterator
- ssm:GetParameters
Resource:
기존 권한을 사용하는 경우
provider:
region: ap-northeast-2
#if you have a multi environment use stage (prod/dev)
stage: dev
role: myrole
local 환경과 dev 환경 설정
#env.yml
local:
host: localhost
port:
name:
user:
password:
dev:
host: db.myserver.com
port:
name:
user:
password:
serverless stage 설정
#serverless.yml
provider:
stage: dev # default stage를 dev로 설정해 둠.
environment:
serverless 배포 방법
# dev 환경에서 배포하고 싶을 경우
$ sls deploy [-s dev]
# local 환경에서 배포하고 싶을 경우
$ sls deploy -s local
Cf) sls deploy시 alias 옵션을 주어 어떤 환경에 반영을 할 것인지에 대해 편하게 관리할 수 있는 Plugin이 있다.
함수 별 권한 지정
각 함수에 대해서 Permission을 주고 싶다면 iamRoleStatements를 설정하지 않고 function 각각에 role을 지정해야 한다.
전역 lambda permission이 존재하고 개별 function에서도 lambda permission이 존재할 경우 개별function에서 지정한 lambda permission으로 역할이 정의된다.
lambda에 대한 정의
functions:
s3tolambda:
handler: sqs.lambda1
events:
- s3:
bucket: s32
exitsting: true
environment:
SQS_URL:
Ref: lambda2sqs
sqstolambda1:
handler: sqs.lambda2
events:
- sqs:
arn:
Fn::GetAtt:
- lambda2sqs
- Arn
lambda에서 사용하는 resource 에 대한 정의
배포시 cloud formation의 stack에 업로드 되어 자동 생성
resources: # CloudFormation template syntax
Resources:
usersTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: usersTable
AttributeDefinitions:
- AttributeName: email
AttributeType: S
특정 cloud formation을 재정의하여 사용하는 것 또한 가능함.
작성한 소스코드와 라이브러리를 zip파일로 만드는 과정
Lambda limit : 250MB
Packaging 시 기본 제외하는 파일
- .git/**
- .gitignore
- .DS_Store
- npm-debug.log
- .serverless/**
- .serverless_plugins/**
custom하게 package 설정 방법
위 코드를 실행시키면 node_modules를 제외하되 node_modules의 node-fetch만 Packaging에 포함시킨다.
package:
exclude:
- node_modules/**
include:
- node_modules/node-fetch/**
s3에 package가 존재하는 경우
package:
artifact: https://s3.amazonaws.com/so...
서버리스에서 만들어진 기능을 추가하는 방법
python을 serverless에서 사용하는 plugin
설치 방법
$npm install --save serverless-python-requirements
설정 방법
#serverless.yml
plugins:
- serverless-python-requirements
주의사항
serverless version >= v1.34
Serverless-python-requirements : 5.0.1 (Total 73 versions)
npm version : 5.0.1
구동방식
sls-py-reqs-custom
Docker image를 자동으로 생성설치 방법
$ npm install serverless-offline@next --save-dev
설정 방법
#serverless.yml
plugins:
- serverless-offline # serverless-offline needs to be last in the list
참고
default는 http://localhost:3000/
설치 방법
$ npm install --save-dev serverless-step-functions
설정 방법
#serverless.yml
plugins:
- serverless-step-functions
Code sample
#serverless.yml
function:
steplambda1:
handler: stepfunction.lambda1
steplambda2:
handler: stepfunction.lambda2
stepFunctions:
stateMachines:
stepfunc1:
name: steppractice
definition:
Comment: "Example of Step Function"
StartAt: Lambda1
States:
Lambda1:
Type: Task
Resource:
Fn::GetAtt: [steplambda1, Arn]
Next: Lambda2
Lambda2:
Type: Task
Resource:
Fn::GetAtt: [steplambda2, Arn]
End: True
코드 실행 시 아래와 같은 stepfunction이 생성됨
테스트는 단위 테스트와 통합 테스트를 지원한다. 단위 테스트의 경우 pytest와 같은 모듈로 가능하고, 통합 테스트의 경우 플러그인으로 구현 가능하다.
어플리케이션 내에 작성되어있는 코드가 올바르게 작동하고 있는지를 반복적으로 확인하기 위함. 하나의 테스트가 하나의 기능단위만 테스트 함으로써 해당 기능에 대한 작업을 빠르게 확인할 수 있다.
설치 방법
$ pipenv install --dev pytest
실행 방법
$ pipenv run python -m pytest -v tests/
Integration Test의 필요성 : 전체 응용 프로그램이 안정적인지 알아보기 위한 테스트
Integration Test를 Local에서 할 수 있는 방법 : serverless-offline plugin
serverless deploy
serverless deploy list
serverless rollback --timestamp timestamp
deploy한 목록과 timestamp 확인 후 해당 timestamp로 rollback 함
serverless remove
배포된 서비스를 삭제