팀에서 쓰는 AWS Lambda의 Python version이 3.6 or 3.7이었는데 이를 3.8 이상 버전으로 업데이트해야 했다. 간단할 거라 생각했지만 좀 애먹어서 이를 공유하려 한다.
특정 account에서 Lambda Layer를 관리하고 있고 다른 계정에서 이 Layer를 참조해야 했다.
Lambda Permission에 Layer를 참조하도록 추가해주었는데도 눈 뜬 장님 마냥 참조를 못해서 짜증날 쯤
Layer를 소유한 계정에서 일일이 허락을 해줘야한다는 걸 알게 되었다(cli, api로만 지원). 아래의 명령으로 permission을 추가해야 함.
aws lambda add-layer-version-permission --layer-name MessageVendorLayer --version-number 1 --statement-id sharingWithOneAccount --principal 123456789012 --action lambda:GetLayerVersion
Lambda에서 Python version만 3.9로 올리니, 기존 Layer를 참조하는데 계속 아래 같은 에러가 나왔다.
IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!
Importing the numpy c-extensions failed. This error can happen for
different reasons, often due to issues with your setup.
찾아보니 numpy와 python의 버전 호환이 되지 않아 발생하는 에러이더라.
pip install numpy --upgrade
이렇게 모듈만 업그레이드해줄 수도 있지만 파이썬 버전 자체가 낮다면 이마저도 안될 것이다.
python 가상환경에 익숙하지 않아서 매번 할 때마다 고생한다. 내가 설치한 python 버전이 정말 그 버전인지 믿을 수 없는 지경에 이르렀다.
결론부터 말하자면 내가 python 3.9라고 생각했던 venv가 3.9 버전이 아니었고, 구 버전 파이썬에서 pip install numpy를 한 numpy는 해당 버전에 호환되는 최신 버전을 받았던 것이다. 하지만 그 버전은 파이썬 3.9와 호환이 되지 않았던 것.
버전 호환이 의심된다면
pip list
를 해서 내가 받은 모듈의 버전과 환경이 호환되는지 먼저 확인하자.
원하는 버전의 파이썬 가상환경을 activate 시킨 다음. 모듈을 다운로드 하고.
그 가상 환경의 모듈이 설치되는 디렉토리를 찾아보자! (나의 경우는 /opt/Python-3.9.6/env/lib/python3.9/site-packages)
그리고 그 디렉토리를 zip 하여 lambda layer에 올려주면 된다.
Cloud9은 클라우드 기반의 IDE로 이번에 써봤는데 간단한 작업하기에 편한 것 같다.
Cloud9으로 작업 환경을 띄우고 아래 링크를 참고해서 원하는 버전의 파이썬을 받고 가상 환경을 실행한다.
그리고 위에 적은 것처럼 모듈을 설치한 디렉토리를 잘 찾아가서 해당 디렉토리를 python 폴더에 넣어서 zip 해서 올려주면 된다. (폴더명으로 위치를 찾는 것 같다.)
https://towardsaws.com/how-to-deploy-python-packages-for-aws-lambda-with-layers-acb70e75a3df
aws lambda publish-layer-version --layer-name <layer 이름> --zip-file fileb://<zip 파일명.zip> --compatible-runtimes python3.9