[요약]
aws 콘솔에서 로컬 작업 코드들을 Lambda로 올릴 수도 있겠지만 너무 귀찮고, 관리하기가 힘들다. 이 문서는 node.js 라이브러리를 사용하여 Lambda에 올리는 과정을 자동으로 처리하는 방법을 소개한다.
[참고자료]
Serverless에서 Python Lambda 생성 및 배포하기
Serverless에서 Python Lambda 생성 및 배포하기
1. Serverless-python-requirements 앞 글에서 말했다시피 Serverless에서 Python을 사용하기에는 복잡한 과정이 많다. (한번 시도해봐야할 부분임) 이러한 복잡함을 다들 느꼈는지 Serverless Framework의 Plugin중 Pyt
velog.io
1. Node, NPM, serverless 설치
안타깝게도 node를 설치해야한다. 설치하자. 21.06.02 기준 14.17.0 LTS를 제공하고 있다. window에서는 msi 파일을 다운로드 받아 손쉽게 설치할 수 있다. 아래처럼 확인하자.

$ npm install -g serverless
위 명령어로 serverless를 설치한다.
2. 서비스 생성하기
다음 명령어를 실행한다.
$ serverless create --template aws-python3 --name SERVICE_NAME --path SERVICE_NAME
—template은 사용하고자 하는 템플릿의 이름이다. serverless create --help 를 입력해보면 지원하는 템플릿의 종류를 확인할 수 있다. 우리는 python을 쓰니까 aws-python3를 쓰자.
—name은 serverless create을 했을 때 생기는 serverless.yml 파일 안의 서비스의 이름이다. 람다 함수 하나의 이름을 정해서 입력하자.
—path는 service가 생성되어야 하는 path를 의미한다.
***SERVICE_NAME은 영어 대소문자와 하이폰(-) 만을 쓸 수 있다. 주의하자.
!

3. pipenv 설치
위의 예시에서 get_user_info 폴더에 들어가면 handler.py와 serverless.yml이 생성됐음을 확인할 수 있다. 여기에서 작업을 할 것이다.
pipenv는 pip과 virtualenv를 동시에 사용하는 라이브러리이다. requirements.txt 대신 Pipfile, Pipfile.lock을 사용한다.pip install pipenv를 하면 설치되지만 window는 추가적인 작업이 필요하다. 윈도우에서 pipenv 설치하기 이 문서를 참고해서 pipenv를 설치하도록 하자.
설치했으면 shell을 만든다. 주의해야할 점은 반드시 아까 만들었던 서비스 폴더 안에 들어가서 실행하자.
이것 때문에 10분 날렸다.
나의 예시를 그대로 사용하자면(get_user_info) 이런 형태로 만들어진다. pipenv 사용방법 링크를 참고하자.
...get_user_info$ pipenv shell

...get_user_info$ pipenv lock
이것도 실행해주자.
4. handler.py 작성
LAMBDA를 사용해봤다면 handler.py가 익숙할 것이다. 여기서 우리가 만들어야 할 기능을 작성하면 된다. 기존 handler.py를 다음과 같은 형태로 수정한다.
def main(event, context):
# SOME CODE
if __name__ == "__main__":
main('', '')
main안에 작동할 코드를 쓴다. 물론 다른 함수를 정의해서 main 안에서 써도 된다. 예전까지 lambda_handler 함수가 했던 기능을 main에서 시켜줄 것인데 그 설정은 다음인 serverless.yml에서 해준다.
python을 쓰면서 다른 라이브러리가 필요할 수 있다. 그럼 pipenv를 사용해서 설치해야 한다. numpy를 설치하고 싶다면 이렇게 한다.
...get_user_info$ pipenv install numpy
5. serverless.yml 작성
사실상 핵심은 serverless.yml을 작성하는 것이다. Lambda 에 어떻게 올릴 것인지를 정의한다. serverless.yml에서는 Layer를 설정할 수도 있고, lambda function을 Api-gateway에 바로 연결할 수도 있다. 공부하고 유용하게 써보도록 하자. 우선 이렇게 작성해보자. 위의 예시를 그대로 사용했다.
service: getUserInfo
frameworkVersion: '2'
provider:
name: aws
runtime: python3.8
lambdaHashingVersion: 20201221
# stage: dev //stage 변수를 추가할 수 있다.
region: ap-northeast-2
functions:
hello:
handler: handler.main
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
dockerizePip: non-linux
handler: handler.main에서 Lambda가 사용해야할 함수를 지정해준다. handler.py에 있는 main을 handler로 지정하겠다는 뜻이다.
dockerizePip이 조금 마음에 걸릴 것이다. 저건 linux가 아닌 환경에서 docker를 사용해 리눅스 환경을 만들겠다는 뜻이다. 그래서 docker 설치가 필요하다.
플러그인을 사용하고 있다. python환경을 사용하기 때문에 필요한데, 이렇게 설치해주면 된다.
.../get_user_info$ npm init
.../get_user_info$ npm install --save serverless-python-requirements
6. 배포하기
$ serverless deploy
이제 이것만 해주면 Lambda로 올라간다. 위에처럼 생긴 serverless.yml일 경우 이런 Lambda 함수가 생긴다.


serverless.yml을 어떻게 작성하느냐에 따라 설정해줄 수 있는게 정말 많다. 일단 여기를 읽어보자.
좀 더 자세히 알고 싶다면 serverless 공식 문서를 참고하자.
7. 추후
API Gateway 연동 자동화도 문서로 남기자!