Cloud

AWS Lambda Layers 기능으로 python 라이브러리 import 하기

융서융서 2022. 12. 2. 02:25

aws lambda로 개발할 때 selenium, openpyxl 과 같은 python 라이브러리들을 import 해주려고 하는데, No module named ... 오류가 떴다.

AWS 환경이 아니라 평소 내 컴퓨터에서 개발할 때에는 터미널을 열고 pip install 명령어를 이용해서 라이브러리를 설치해주면 되지만, lambda에는 터미널이 없다.

이런 경우 라이브러리를 어떻게 lambda 환경에 미리 설치해줄 수 있을까?


AWS LambdaLayers 는 2018 AWS Re:Invent에서 발표된 기능이다. 위와 같은 상황에서 외부 패키지를 미리 설치해서 세팅해주기 위해 사용된다.

Lambda Layers를 이용해 서버리스에서 외부 패키지를 활용하는 방법과 개념에 대해 알아보자.

 

Lambda Layers 세팅 방법

아래 방법으로 원하는 라이브러리를 lambda layers로 설정해서 사용할 수 있다.

 

1. 먼저 'python' 이라는 폴더를 만들고, 터미널을 이용해 그 폴더 안에 필요한 라이브러리를 다운 받는다.

설치 명령어는 pip install {패키지명} -t . 이다.
주의할 점은 폴더 이름이 꼭 python 이어야 한다는 점!

cd Desktop  # 바탕화면에 폴더를 만들어줄 것이다
mkdir python  # python 이라는 이름의 폴더를 생성
cd python 

# 폴더 내에 필요한 라이브러리를 install 한다 (pip가 안 되면 pip3 명령어를 이용)
pip install selenium -t .
pip install openpyxl -t .
pip install undetected_chromedriver -t .

python 폴더 내에 패키지가 설치 완료된 모습

 

2. 패키지 설치를 완료했다면 python 폴더를 압축한다.

 

3. AWS Lambda 콘솔에서 '계층' 메뉴에 들어가, '계층 생성'을 누른다.

 

4. 계층 생성을 할 때 아까 만든 python.zip 파일을 업로드한다.

그 밖에는 이름과 설명을 입력하고, 호환 아키텍처와 호환 런타임도 각각 설정하자.

주의할 점은, 나중에 람다 함수를 만들 때 여기서 설정한 '호환 아키텍처'와 '호환 런타임' 값을 똑같이 설정해줘야 한다는 점이다. 나는 x86_64와 Python 3.9 런타임을 설정해주었으니, 이 설정을 기억했다가 람다 함수를 만들 때도 똑같이 x86_64, Python 3.9 버전으로 설정해줘야 한다.

 

5. 레이어 생성은 완료했으니, 이제 Lambda 함수를 만들자.

'함수' 메뉴에서 '함수 생성'을 클릭한다.

4번에서 계층을 만들 때 설정했던 런타임(Python 3.9)과 아키텍처(x86_64) 값을 똑같이 설정하고 '함수 생성'을 한다.

 

6. 람다와 레이어를 연결하자.

람다가 생성되면 아래로 쭉 내려 '[Add a layer]'를 눌러주고,

아래와 같은 창이 나오면 '사용자 지정 계층'을 누르고 위에서 생성한 계층을 선택해준다. (버전은 1 로 설정)

만약 여기서 아까 생성한 계층이 안 나온다면 람다 함수의 런타임(ex. Python 3.9) 또는 아키텍처(x86_64)가 계층의 런타임/아키텍처와 값이 달라서 그런 것이다. 그런 경우라면 계층부터 다시 설정하자.

다 설정되면 '추가'를 누르면 끝.

 

이제 라이브러리를 import 해도 No module named ... 에러가 뜨지 않고 원하는 라이브러리를 사용할 수 있게 되었다.


그럼 서버리스에서 라이브러리를 불러오는 방법은 이렇게 Layers를 추가하는 방법만 있는 걸까?

그건 아니다. Layer 기능을 쓰지 않고도 Dependency 관련 라이브러리 코드를 zip 파일로 람다 함수 안에 함께 묶어 업로드하는 방식으로 라이브러리를 import 할 수 있다.

그런데 이 경우에는 람다의 250MB 크기 제약 때문에 패키지만 업로드하고도 250MB를 초과해버려 AWS 콘솔에서 소스코드를 작성할 수 없게 될 때가 있다.

그런 맥락에서 람다의 Layer 기능은 메모리 제약이 있는 서버리스에서 메모리를 효율적으로 쓸 수 있는 좋은 기능이다. zip 파일로 올려 패키지들의 용량을 줄일 수 있고 + 한 번 만들어둔 Layers를 다른 함수에도 재사용할 수 있다는 장점이 있으니 람다에서 패키지를 이용할 때는 Layers 계층 기능을 잘 활용하는 것이 좋겠다.

 

서버리스야 힘내!!