앞 글에서 말했다시피 Serverless에서 Python을 사용하기에는 복잡한 과정이 많다. (한번 시도해봐야할 부분임)
이러한 복잡함을 다들 느꼈는지 Serverless Framework의 Plugin중 Python Requirements라는 Plugin이 등장했다. 이번 글에서는 이 Plugin을 사용하여서 다른 설정 없이 Serverless에서 Python Lambda를 생성하고 배포해볼 것이다. Serverless Tutorial에 이에 대한 과정이 잘 설명되어 있어 아래 링크를 참조하면서 공부하였다.
Node 및 npm이 설치되어있다면 아래 명령어로 Serverless Framework를 설치한다.
$ sudo npm install -g serverless
$ serverless create --template
위 명령어를 치면 serverless에서 사용할 수 있는 template들이 나온다. 나는 python을 사용할 것이기 때문에 aws-python3 template을 선택한다.
$ serverless create \
--template aws-python3 \
--name numpypract \
--path numpypract
--name은 serverless create를 했을 때 생기는 serverless.yml 파일안의 서비스 이름이다.
--path는 service가 생성되어야 하는 path를 의미한다.
위의 명령어를 실행시키면 numpypract라는 폴더가 생김을 확인할 수 있다. numpypract 폴더로 들어가보면 handler.py와 serverless.yml 파일이 생성되어있다.
$ cat serverless.yml
service: numpypract
serverless.yml파일을 열어보면 명령어에서 설정한 대로 service이름이 numpypract로 설정되었음을 확인할 수 있다.
pipenv란 간단하게 말하면 pip의 기능과 virtualenv의 기능이 합쳐진 것이다. pipenv의 대표적인 기능은 다음과 같다.
$ pip isntall --user pipenv
$ pipenv shell
pipenv를 사용하기 위해 pipenv를 설치해주고 pipenv shell 명령어를 통해 가상환경을 실행시킨다.
Pipfile.lock파일도 만들어주기 위해서 명령어를 한번 더 친다.
(numpypract)$ pipenv lock
handler는 이벤트를 처리하는 Lambda 함수의 메서드이다. 이 안에 정의하는 함수대로 lambda가 생성된다. 이 튜토리얼에서는 numpy를 이용해서 숫자 array를 reshape해주는 lambda를 생성한다.
기존 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('', '')
python에서 AWS Lambda Function Handler를 정의하는 기본 구조는 다음과 같다.
def handler_name(event, context):
...
return some_value
이에 대한 내용은 AWS Guide에 상세히 적혀있다.
numpy를 이용해서 lambda를 생성할 것이기 때문에 numpy를 설치해 주어야 한다.
(numpypract)$ pipenv install numpy
로컬에서 command를 실행시키면 설정한 결과가 나옴을 확인할 수 있다.
(numpypract)$ python handler.py
Your numpy array:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
service: numpypract
provider:
name: aws
runtime: python 3.8
region: ap-norteast-2
functions:
gyullnumpy:
handler: handler.main
이 코드는 이름이 numpypract인 python3.8 함수를 서울 지역으로 AWS에 배포하겠다는 코드이다.
Deploy를 하기 전 serverless-python-requirements plugin을 추가해야한다. 이를 위해서 패키지에 대한 정보와 버전에 대한 정보가 있는 package.json 파일을 만들어야 한다.
(numpypract)$ npm init
(numpypract)$ npm install --save serverless-python-requirements
plugin을 사용하기 위해서 serverless.yml에 해당 코드를 추가한다.
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
dockerizePip: non-linux
custom에서는 패키지를 설치할 때 플러그인에 Docker를 사용하도록 지시한다.
***dockerizePip: non-linux에 대한 설명 : The dockerizePip option supports a special case in addition to booleans of 'non-linux'
which makes it dockerize only on non-linux environments.
이후 다음 명령어를 통해 배포한다.
(numpypract)$ serverless deploy
serverless deploy를 했을 때 내부적으로 일어나는 일
gyullnumpy 함수를 호출하고 로그를 읽는다.
(numpypract)$ serverless invoke -f gyullnumpy --log