Lambda에 대해 잘 모르고 무작정 코드를 작성했는데 pandas,numpy 등의 모듈이 없다는 오류만 계속 떠서 매우 당황했다.
알고보니 Lambda는 용량때문에 제공하지않는 모듈들이 있었고
이는 1)Layer로 더해주던가 2)코드를 업로드할때 도커와 같은 방법으로 환경을 구성하고 업로드를 해주어야했다!
나는 간편하게 Layer를 추가하는 방법을 선택했으나 이도 호락호락하지는 않았다..
우선 임포트한 모듈에 대해 람다에서 아래와 같은 에러가 발생할 것 이다.
Unable to import module 'lambda_function': No module named 'pandas'
나는 pandas와 psycopg2, sqlalchemy, numpy 모듈을 임포트하고싶었다.
Numpy와 Scipy는 AWS에서 기본적으로 제공해주는 Layer인 AWSLambda-Python37-SciPy1x가 있으므로 이를 포함시켜주면 된다!
우선 구글링통해
모듈을 로컬에 설치하고 이를 python이라는 이름의 zip파일로 만들어 Layer로 추가해주면 된다는 사실을 알고 시도해보았다.
* 주의할 점은 AWS Lambda는 AWS Linux운영체제를 기반으로 만들어졌기때문에 이와 호환되는 모듈로 따로 다운받아 설치를 해주어야하는데 일반적인 pip로 설치하는 몇몇 모듈은 호환이 맞지않아 오류를 발생시킨다. 이와같은 문제는 다음글에서 다루기로한다.
로컬파일에 다음과 같이 설치하고
람다함수 용량은 전체 250MB 이하, 하나의 Layer는 50MB이하여야하기때문에 용량을 줄이기위해 기타 파일도 삭제해준다.
또한 numpy는 AWS Layer로 추가해줄것이기에 pandas에서 numpy를 삭제해주기로했다.
(numpy 용량이 상당하다... )
굳이 왜 AWS Layer를 사용하냐면 위에서 언급했듯이 numpy가 AWS Linux와 호환이 맞지않아 임포트되지않는 오류가 발생하여
안전하게 AWS에서 제공하는 Layer를 추가해주기로하자
mkdir python
cd python
pip install -t . pandas
pip install -t . psycopg2
pip install -t . sqlalchemy
rm -r *.dist-info __pycache__
rm -rf pandas/numpy*
이를 python.zip로 zip파일로 만들고 Layer를 생성해주었다.
Layer 생성은 아래와 같이 해준다.
Lambda > 계층 > 계층생성 에서 zip파일 업로드로 업로드해주고 꼭 호환런타임을 선택하여 python을 선택해줘야한다.
생성해준 Layer를 람다함수에 포함시켜주자
람다함수 가장 하단에 계층> Add a layer 를 통해 생성한 계층을 포함시켜주자
AWS에서 기본적으로 제공해주는 Layer인 AWSLambda-Python37-SciPy1x와 내가 생성한 계층을 추가해주었다.
일반적으로 이렇게 해주면 설치한 모듈을 람다에서 사용할 수 있지만
종종 호환이 맞지않아 여전히 사용할수없는 모듈은 다음글을 참고하여 Layer를 생성해주어 추가해주면된다!
참고
'DevOps > AWS' 카테고리의 다른 글
AWS EC2서버 접속하기 - for Mac,Window (0) | 2021.09.26 |
---|---|
AWS Lambda(람다)란 (1) | 2021.08.24 |
AWS Lambda Scikit-Learn Layer생성하기 (1) | 2021.08.20 |
AWS Lambda에서 Sagemaker Endpoint 호출 (0) | 2021.08.07 |
AWS Tensorflow 모델 배포 및 endpoint 생성하기 (0) | 2021.08.05 |
댓글