Lambda 개발을 하다보면, 파이썬에서 기본으로 제공하고있지 않은 외부 라이브러리나 패키지가 필요할 수 있다.
예를들어, 외부 라이브러리 중 하나인 paramiko를 사용하고자 할 때 람다 함수에 import paramiko 시도 후 테스트를 돌리면 다음과 같은 오류를 만나게된다.
Unable to import module 'lambda_function': No moudle named ' '
Response
{
"errorMessage": "Unable to import module 'lambda_function': No module named 'paramiko'",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}
AWS에서는 이러한 외부 라이브러리 및 기타 종속성을 Lambda에서 사용할 수 있도록 zip 형태로 패키징하는 Layer 기능을 제공한다.
AWS에서는 각 런타임에 따라 다음과 같은 구조를 권고하니 반드시 지켜서 업로드해야한다.
Lambda 레이어 생성 과정은 다음과같다.
이 때 해당 작업은 Lambda가 구동될 환경과 동일한 환경이 좋다. (OS, Python version 등)
Lambda는 동작될 때 마다 AWS 리소스를 임시로 사용하므로 Amazon Linux 기반이다.
람다는 각 Python 런타임에 대하여 아래와 같이 다른 OS 기반으로 동작한다.
Python 3.8은 Amazon Linux 2 Amazon Machine Image(AMI)를 기반으로 합니다. 그러나 Python 3.7과 Python 3.6은 Amazon Linux AMI를 기반으로 한다.
(https://aws.amazon.com/ko/premiumsupport/knowledge-center/lambda-import-module-error-python/)
따라서 Lambda에서 Python 3.8을 사용하고자하면, AWS Cloud9을 사용하거나 Amazon Linux 2에서 다음 작업을 수행해야 한다. 본 포스팅에서는 Amazon linux 2인 인스턴스가 존재하였으므로 해당 인스턴스에서 작업을 수행하였다.
python 이라는 이름의 디렉토리 생성 후 해당 디렉토리에 패키지 설치
# python 디렉토리 생성
mkdir python
# python 패키지 설치 (amazon linux 에서는 기본 pip 명령어가 python 2.X 이므로 pip3를 입력해야 함)
$ pip3 install -t ./python paramiko
python 디렉토리에서 해당 내용을 layer.zip으로 압축한다.
$ zip -r layer.zip python
압축파일의 결과를 보자면 다음과 같이 Python의 경우 압축파일 하위에 반드시 Python 디렉토리가 존재해야한다.
(이 파일은 linux에서 생성 후 편의를 위해 windows에 다운받은 결과입니다.)
layer.zip 파일을 Lambda 계층에 등록
- Lambda > 계층 > 계층 생성
이 때 호환 런타임은 이 계층이 어떤 런타임과 호환되는지 선택하는 것이다.
만약, Python 3.8, Python 3.9를 선택하였을 경우, Lambda 런타임이 Python 3.7인 함수에서는 해당 레이어가 조회되지 않는다.
Lambda에 Layer 등록
- 해당 Lambda 함수에서 계층 > Add a Layer 클릭
- 사용자 지정 계층 선택 > 생성한 Layer 선택 > 추가
- 계층 추가 확인
계층을 생성할 때 반드시 런타임 별 구조에 맞춰 zip 파일을 생성해야하며, 해당 zip을 생성하는 환경 또한 Lambda 구동 환경과 동일할 수록 좋음을 반드시 기억하자.
[참고]
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-package.html
https://aws.amazon.com/ko/premiumsupport/knowledge-center/lambda-import-module-error-python/
댓글