Serverless에서 Python Lambda 생성 및 배포하기

Gyullbb·2020년 1월 30일
1

Serverless Framework

목록 보기
2/3

1. Serverless-python-requirements

앞 글에서 말했다시피 Serverless에서 Python을 사용하기에는 복잡한 과정이 많다. (한번 시도해봐야할 부분임)

이러한 복잡함을 다들 느꼈는지 Serverless Framework의 Plugin중 Python Requirements라는 Plugin이 등장했다. 이번 글에서는 이 Plugin을 사용하여서 다른 설정 없이 Serverless에서 Python Lambda를 생성하고 배포해볼 것이다. Serverless Tutorial에 이에 대한 과정이 잘 설명되어 있어 아래 링크를 참조하면서 공부하였다.

2. 초기 설정

Node 및 npm이 설치되어있다면 아래 명령어로 Serverless Framework를 설치한다.

$ sudo npm install -g serverless

3. 로컬에서 서비스 만들기

$ 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로 설정되었음을 확인할 수 있다.

a) 가상환경 pipenv

pipenv란 간단하게 말하면 pip의 기능과 virtualenv의 기능이 합쳐진 것이다. pipenv의 대표적인 기능은 다음과 같다.

  • pip과 virtualenv의 기능 동시 사용
  • requirements.txt 대신 Pipfile, Pipfile.lock 사용
  • 해쉬의 자동 생성
  • .env 자동 인식
$ pip isntall --user pipenv
$ pipenv shell

pipenv를 사용하기 위해 pipenv를 설치해주고 pipenv shell 명령어를 통해 가상환경을 실행시킨다.

Pipfile.lock파일도 만들어주기 위해서 명령어를 한번 더 친다.

(numpypract)$ pipenv lock
b) handler.py

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]]
c) Deploy
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를 했을 때 내부적으로 일어나는 일

    1. serverless.yml 설정 파일로 부터 AWS CloudFormation 템플릿 파일을 생성
    2. 아직 CloudFormation Stack 이 생성되지 않았을 경우 코드의 압축파일이 저장될 s3 bucket 과 함께 Stack 을 생성
    3. Lambda function 으로 실행될 코드들을 zip 파일로 압축
    4. 이전 배포된 모든 파일에 대한 hash 를 가져온 뒤 현재 로컬에 있는 파일들의 hash 와 비교
    5. 만약에 hash 결과가 같으면 배포 프로세스는 종료
    6. hash 결과가 같지 않으면, zip 파일을 s3 bucket 에 업로드
    7. 모든 IAM Roles, Lambda Functions, Events 그 외 자원들이 AWS CloudFormation 템플릿에 추가
    8. 새로운 CloudFormation 템플릿으로 Stack 을 업데이트
    9. 각각의 배포는 각 Lambda function 을 새로운 버전으로 발행
  • 참조 : https://aluc.io/2018-07-14-serverless-framework

gyullnumpy 함수를 호출하고 로그를 읽는다.

(numpypract)$ serverless invoke -f gyullnumpy --log

참조

0개의 댓글