
이전 포스팅에 이어 오늘은 Lamda에서 외부 모듈을 사용하는 과정을 다뤄보기로 한다.
현재 AWS Lambda에서는 Python 3.8부터 3.12까지의 버전을 지원한다. 버전에 따라 포함되는 라이브러리들이 존재하지만, 모델의 추론과정에 필요한 외부 라이브러리들은 따로 설치해줘야한다.
이제부터 Lamda에서 외부 모듈을 실행하는 방법에 대해 알아보자.
Lambda Layer는 추가 코드 또는 데이터를 포함하는 .zip 파일 아카이브이다. 계층에는 일반적으로 라이브러리 종속 항목, 사용자 지정 런타임 등의 구성 파일을 포함할 수 있다. 계층 .zip 아카이브에 폴더를 구성하는 방법을 다음과 같다.
pillow.zip
│ python/PIL
└ python/Pillow-5.3.0.dist-info
우선 설치할 폴더를 만들고 pip 옵션으로 해당 폴더에 모듈을 설치한다.
pip install pillow -t lambda

설치가 완료된 후에 상위 폴더를 압축하자.

AWS Lambda 계층 -> 계층 생성


이때 런타임은 꼭 lambda 함수와 동일해야 한다.
만들어둔 lambda 함수로 돌아와서 가운데의 Layer를 누르고 생성한 계층을 추가해 주면 끝이다.


테스트를 위해 추가한 모듈을 import 해보기로 하자.

API 호출시 제대로 import된 것을 확인할 수 있다.

하지만 이것은 비교적 작은 크기의 모듈을 설치할때만 사용할 수 있는 방법인데..
로컬에서 .zip파일 업로드시 50MB, Amazon S3에서 업로드시 250MB의 크기 제한이 있다.

아쉽게도 YOLO 모델 사용을 위한 ultralytics와 같은 큰 크기의 모듈을 사용하기에는 계층 추가는 적합한 방법이 아니였다.
모듈 설치를 위한 대안을 찾아보다, 컨테이너 이미지를 이용해 함수를 생성할 수 있는 방법을 찾았다. 컨테이너 이미지 방식은 최대 10GB 크기의 이미지를 다룰 수 있다!

우선 컨테이너 이미지를 등록하기 위해 ECR 리포지토리를 생성해줘야 한다.

이제 ECR 리포지토리의 접근을 위한 역할을 추가하도록하자.

로컬에서 aws congigure를 통해 사용자 설정을 마치면

로그인에 성공하게 된다.

비 AWS 기본 이미지에서 컨테이너 이미지 생성시에는 다음과 같이 작성해주자.
# Define custom function directory
ARG FUNCTION_DIR="/function"
FROM python:3.12 as build-image
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Copy function code
RUN mkdir -p ${FUNCTION_DIR}
COPY . ${FUNCTION_DIR}
# Install the function's dependencies
RUN pip install \
--target ${FUNCTION_DIR} \
awslambdaric
# Use a slim version of the base Python image to reduce the final image size
FROM python:3.12-slim
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}
# Copy in the built dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
# Set runtime interface client as default command for the container runtime
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
# Pass the name of the function handler as an argument to the runtime
CMD [ "lambda_function.handler" ]
폴더의 구성은 다음과 같이 하면 된다.

docker build -t lambda .docker tag lambda:latest {private registry url}:latestdocker push {private registry url}:latest이제 함수 생성시 ECR에 등록된 이미지를 사용할 수 있다.

입력한 이미지의 딥러닝 모델 추론에 성공할 수 있었다!

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/packaging-layers.html
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images-create.html