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이 된다.
'AWS' 카테고리의 다른 글
AWS Lambda, API Gateway로 대화형 질답봇 만들기 (Feat. 야구) (0) | 2024.04.02 |
---|---|
AWS Lambda와 selenium을 이용해서 날씨알림봇 만들기 (0) | 2024.03.07 |
AWS Cloud9과 ECR을 이용하여 Lambda Container 배포하기 (0) | 2024.02.23 |
SageMaker Studio에서 영구적 가상환경 만들기 (0) | 2024.02.18 |
SageMaker 개요 (0) | 2024.02.01 |