Serverless.yml 작성 방법

Gyullbb·2020년 11월 10일
2

Serverless Framework

목록 보기
3/3

인턴 때 Serverless Framework에 대해 조사하며 정리한 Serverless.yml 사용 방법이다.

serverless.yml

1. Getting Started

  • Install serverless framework

    $sudo npm install -g serverless
  • Create Python project

    $ serverless create \
    	--template aws-python3 \
    	--name customer 
    	--path customer : make 'customer' directory 

1-1. How serverless work

  • Serverless.yml 설정으로 AWS CloudFormation template(AWS 리소스 생성하는 파일) 생성
  • Zip 파일로 packaging
  • Zip 파일의 Hash값 비교로 배포 여부 결정
  • Zip파일을 S3에 저장, 관리

2. .serverless 파일 설정

2-1. 자동 생성한 설정값

service: kinesisconsumer
provider:
	name: aws
	runtime: python3.8

2-2. Permission

  • 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 

2-3. Multi Stage 배포

  • 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이 있다.

    ​ > serverless-aws-alias

함수 별 권한 지정

각 함수에 대해서 Permission을 주고 싶다면 iamRoleStatements를 설정하지 않고 function 각각에 role을 지정해야 한다.
전역 lambda permission이 존재하고 개별 function에서도 lambda permission이 존재할 경우 개별function에서 지정한 lambda permission으로 역할이 정의된다.

2-4. Function

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

2-5. Resource

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을 재정의하여 사용하는 것 또한 가능함.

2-6. Packaging

작성한 소스코드와 라이브러리를 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...

2-7. Plugin

서버리스에서 만들어진 기능을 추가하는 방법

serverless-python-requirements

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

  • 구동방식

    1. Pipenv 경우 Pipfile로부터 .serverless directory 안에 requirements.txt를 생성
    2. Requirements.txt 파일을 Parsing 함
    3. 환경을 구축하기 위해서 sls-py-reqs-custom Docker image를 자동으로 생성
    4. requirements.txt안의 package들을 설치 후 .serverless의 requirements 폴더 안에 저장

serverless-offline

  • 설치 방법

    $ 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/

serverless-stepfunction

  • 설치 방법

    $ 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이 생성됨

3. 테스트

테스트는 단위 테스트와 통합 테스트를 지원한다. 단위 테스트의 경우 pytest와 같은 모듈로 가능하고, 통합 테스트의 경우 플러그인으로 구현 가능하다.

3-1. 단위 테스트

어플리케이션 내에 작성되어있는 코드가 올바르게 작동하고 있는지를 반복적으로 확인하기 위함. 하나의 테스트가 하나의 기능단위만 테스트 함으로써 해당 기능에 대한 작업을 빠르게 확인할 수 있다.

  • 설치 방법

    $ pipenv install --dev pytest
  • 실행 방법

    $ pipenv run python -m pytest -v tests/

3-2. 통합 테스트

  • Integration Test의 필요성 : 전체 응용 프로그램이 안정적인지 알아보기 위한 테스트

  • Integration Test를 Local에서 할 수 있는 방법 : serverless-offline plugin

4. serverless CLI 명령어

  • 배포 방법
serverless deploy
  • 롤백 방법
serverless deploy list
serverless rollback --timestamp timestamp

deploy한 목록과 timestamp 확인 후 해당 timestamp로 rollback 함

  • 삭제 방법
serverless remove

배포된 서비스를 삭제

profile
🎈도전 속의 여유를 즐기자🎈

0개의 댓글