serverless framework에서 python 쓰기

이전편 : serverless framework 환경 설정 serverless.yml

배경

  • python을 Lambda에서 쓰려면 패키징하고.. zip파일로 만들고.. 업로드하고.. 그런 복잡한 작업들이 포함된다.
  • serverless 프레임워크에서 sls-python-requirements 플러그인을 사용하면, 배포시 필요한 파이썬 라이브러리를 패키징해준다.

1. python 가상환경 생성

프로젝트에 필요한 라이브러리만 가져가기 위해, 가상환경을 생성한다.

virtualenv venv --python=python3
created virtual environment CPython3.8.5.final.0-64 in 6858ms
  creator CPython3Windows(dest=C:\Users\icontrols\PycharmProjects\anoicos-data-pipeline\venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\icontrols\AppData\Local\pypa\virtualenv)
    added seed packages: pip==21.0.1, setuptools==54.2.0, wheel==0.36.2
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

생성한 가상환경을 activate한다.
리눅스

source venv/scripts/activate

윈도우

call venv/scripts/activate

2. 필요 라이브러리 install

필요한 python 라이브러리를 install한다. 테스트를 위해 간단히 numpy 라이브러리만 설치해본다.

(venv) > pip install numpy

이 라이브러리를 테스트할 handler.py도 작성한다.
handler.py

# handler.py

import numpy as np


def main(event, context):
    a = np.arange(15).reshape(3, 5)

    print("Your numpy array:")
    print(a)


if __name__ == "__main__":
    main('', '')

로컬에서 이 파일을 실행해보면 잘 실행되는 것을 확인할 수 있다.

(venv) > python handler.py
Your numpy array:
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

3. 필요 라이브러리 freeze

플러그인이 참조할 requirements.txt를 생성한다.

(venv) > pip freeze > requirements.txt

4. serverless-python-requirements 플러그인 설치

(venv) > npm init
(venv) > npm install --save serverless-python-requirements

5. yml 파일에 설정 추가

service: sncr-data-collectors

frameworkVersion: "2"

#### 플러그인 추가 #########################
plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux # 윈도우 환경에서 사용시 필수 기입 
    slim: true # non win32인 경우 적용됨, 인스톨 패키지에서 캐시 등을 삭제해준다
    layer: true # 이걸 true로 바꿔주고 각 함수에서 참조하면 된다. numpy, pandas같은 크기가 큰 라이브러리 쓸 때 필수.
    noDeploy: # 배포하지 않는 라이브러리 기술
      - pip
      - setuptool
      - boto3
      - botocore
      - jmespath
      - s3transfer
      - dateutil
      - docutils
      - python_dateutil
      - six
      - urllib3
############################################

provider:
  name: aws
  runtime: python3.8
  stage: dev
  region: ap-northeast-2


package:
  individually: true

## 테스트 function
functions:
  numpy:
    handler: handler.main
    layers:
      - Ref: PythonRequirementsLambdaLayer # 아까 layer : true 를 참조하는 부분

6. 배포 및 테스트

이제 저 설정으로 배포하면 yml파일에 설정한 function이 lambda로 배포된다.

(venv) > sls deploy

local invoke를 통해 함수가 잘 배포됐는지 콘솔에 접속하지 않고도 확인 가능하다.

(venv) > serverless invoke local --function numpy
Your numpy array:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
null