AWS Lambda에서 외부 패키지를 사용하려면 여러가지 방법이 있다.
1. 코드와 함께 업로드
2. layer에 등록 후 사용
3. docker 사용
등등....
아래 내용은 layer에 등록해서 사용하는 방법에 대한 내용이다.
우선 가상환경을 만들어주고(뭐든 상관없음), 가상환경을 활성화 한다.
python -m venv venv
source venv/bin/activate
mkdir -p layer/python/lib/python3.8/site-packages
pip install -r requirements.txt --target layer/python/lib/python3.8/site-packages
설치할 폴더를 만들어 주고 requirements.txt 에 필요한 버전들을 기입후 패키지 설치. 아래의 python version은 본인의 lambda runtime의 맞게 변경해야함.
mkdir -p layer/python/lib/python3.8/site-packages
pip install -r requirements.txt --target layer/python/lib/python3.8/site-packages
이후 압축을 진행
cd layer/
zip -r layer.zip .
해당 압축파일의 크기가 70메가 이하면 바로 등록이 가능하다.
aws lambda publish-layer-version \
--layer-name temp-layer-name \
--description "description of layer" \
--zip-file fileb://layer.zip \
--compatible-runtimes python3.8
그 이상일 경우에는 s3에 먼저 올린 다음 s3 키로 layer를 등록해야한다.
aws s3 cp ./layer.zip s3://my-bucket/prefix/
aws lambda publish-layer-version \
--layer-name temp-layer-name \
--description "description of layer" \
--content S3Bucket=my-bucket,S3Key=prefix/layer.zip \
--compatible-runtimes python3.8
특히나 opencv의 평소처럼 opencv-python 으로 install 하면 다음과 같은 에러를 만나는데, 그럴땐 opencv-python-headless로 설치를 해주어야 한다.
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': libGL.so.1: cannot open shared object file: No such file or directory
추가적으로 어떤 에러가 나오는지는 기억 안나지만 psycopg2의 경우에도 psycopg2-binary로 설치를 해주어야 제대로 동작한다.
requirements.txt example
opencv-python-headless==4.x.x.xx
psycopg2-binary==2.x.x
등록후 해당 이미지상 위치에 있는 Layers 클릭
해당 이미지에서 사용자 지정 계층, 올린 layer 선택 & 버전 선택 후 추가하면 끝!