AWS Lambda에 layer 추가하기 (추가 Package 설치)

    목차
반응형

0. 왜 필요해?

AWS의 Lambda를 이용하여 API를 만들곤 하는데, Lambda 안에서 데이터 전처리 혹은 후처리를 하기 위해 pandas나 numpy, 혹은 그 외 라이브러리를 필요로 한다. 하지만 Lambda에는 그런 패키지가 설치되어 있지 않기 때문에 별도 layer를 추가하여 패키지를 설치해주어야 한다.

 

 

0. 외부 layer가 있는지 확인한다.

0-1. AWS 제공 layer

pandas의 경우 AWS에서 제공하고 있다. 때문에 하위 패키지인 numpy도 사용할 수 있다.

0-2. 외부 layer 이용

일부 layer를 제공해주는 곳이 있다. 그곳에서 맞는 python 버전과 지역, 패키지를 검색하여 ARN 지정을 하고 입력해준다.

- Klayers

 

외부 레이어가 없는 경우 아래 과정을 거친다.

 

 

1. 필요한 패키지를 다운받는다.

1-1. 가상환경을 이용한 패키지 다운

가상환경을 만든 뒤 필요한 패키지를 다운받는다. 그러면 `(가상환경)/lib/python3.9`의 `site-packages` 폴더에 다운이 되고 `site-packages` 폴더 안의 파일들을 `python`이라는 새로운 폴더에 집어넣는다.

(장점) 해당 패키지를 쓰기 위한 하위 패키지를 따로 다운 받을 필요 없다.

(단점) 가상환경을 만들었다가 삭제하는 번거로움이 있다.

 

1-2. whl 파일을 이용한 패키지 다운

1. pypi.org에 접속하여 내가 추가하고자 하는 패키지를 검색한다.

2. Release history를 클릭하여 내가 설치하고자 하는 버전을 선택한다.

3. Download files를 클릭하여 `.whl` 파일을 다운로드 받는다.

- 주의사항

    - AWS Lambda의 python 버전과 호환이 되는지 확인 (py38, py39, py310 등 => cp38, cp39, cp310으로 확인, 따로 적혀있지 않으면 모두 호환됨)

    - 여러 파일 중 `manylinux2014_x86_64`가 써있는 것 위주로 다운 받는다. (lambda 함수 기본값)

4. wheel 명령어를 실행할 수 있는 커맨드 창(ex: Anaconda Prompt)을 열고 whl 파일이 있는 폴더로 이동한다.

5. `wheel unpack ~~~.whl`을 통해 whl 파일의 압축을 해제한다.

6. 1~5의 과정을 모든 하위 패키지에 대해 반복한다.

- 하위 패키지 목록 알아내는 법

    - 기존 가상환경에 설치를 해본다.

예를 들어 `requests-toolbelt`는 `requests`, `urllib3`, `charset-normlaizer`, `certifi`, `idna`를 필요로 한다. (추가적으로 패키지 버전도 맞춰주자.)

- 또는 해당 라이브러리 공식 홈페이지나 github에서 `requirements.txt`를 찾아본다.

 

7. 압축 해제된 폴더는 아래와 같은 구조일 것이다.
package1-version
└ package1
    └ …
└ package1-dist-info
    └ …

 

8. 각 폴더를 python 폴더에 하나로 합쳐 아래와 같은 구조로 바꾼다.
python
└ package1

    └ …
└ package1-dist-info
    └ …
└ package2
    └ …
└ package2 -dist-info

    └ …

└ …

 

(장점) 각 패키지마다 버전을 지정할 수 있다.

(단점) 하위 패키지가 많으면 많을수록 1-1보다 훨씬 번거롭다.

 

 

2. `python` 폴더를 압축한다.

이 때, `python` 폴더가 포함이 되어야 한다.

3. AWS Lambda에 접속하여 계층을 생성한다.

 

1. 구분할 수 있는 계층 이름과 설명을 적는다. (패키지 버전 등)

2. 앞서 압축한 `python` 파일를 업로드한다. 이 때 용량이 매우 중요하다. (압축하기 전 용량)

    - 10MB가 넘는 경우 S3에서 파일 업로드 필요

    - 250MB가 넘는 경우 layer 생성 불가능

    - `~~.dist-info` 폴더는 import 하는 데 필요 없는 경우가 있으므로 최대한 삭제를 해서 250MB 이내로 맞춰준다.

    - 그래도 안 된다면 lambda 전용 Docker를 생성하거나 Sagemaker, EC2 등 다른 서비스를 이용해야 함

3. 호환 런타임을 정해준다.

 

 

4. 기존 lambda에 layer를 추가한다.

사용자 지정 계층에서 계층 버전과 함께 선택한다. 계층 버전은 계층을 새로 생성할 때마다 +1이 된다.

 

728x90
반응형