[26WKRD2] Lambda에 패키지 추가하는 법 - Lambda Layer

개요
AWS Lambda에서 외부 패키지를 써야 할 때마다 함수 배포 파일에 직접 포함하면 관리가 번거롭고, 여러 함수에서 같은 의존성을 반복해서 올려야 하는 문제가 생깁니다. 이럴 때 Lambda Layer를 사용하면 공통 라이브러리를 함수 코드와 분리해 재사용할 수 있어 배포 구조를 훨씬 깔끔하게 만들 수 있습니다. 특히 Python의 requests, pandas 같은 패키지나 공통으로 사용하는 유틸리티 코드를 여러 Lambda에서 함께 써야 할 때 Layer는 유지보수의 용이성과 배포 효율을 크게 높여줍니다.
이 글에서는 Lambda에 패키지를 추가하는 대표적인 방법으로 Lambda Layer를 사용하는 방식을 간단히 정리합니다. Layer가 왜 필요한지부터, 패키지를 올바른 폴더 구조로 압축하는 방법, Lambda 함수에 연결하는 과정 등을 짧고 명확하게 살펴볼 예정입니다.
1. Layer 빌드하기
이번 글의 실습은 이 링크<링크삽입필요!>를 클론받아 진행합니다.
Lambda Layer를 빌드할 때는 Docker를 사용하여 AWS Public ECR에서 AL2023 기반의 lambda 이미지를 실행하고, 이 컨테이너 내에서 빌드하는 것이 Best Practice입니다. 그 이유는 Lambda는 AL2023 환경에서 실행되기 때문입니다.
macOS, Windows 등에서 패키지를 다운로드 받게 되면, 해당 OS에 맞는 바이너리가 설치되므로 Lambda에 올렸을 때 제대로 실행되지 않을 수 있습니다.
그럼 이제, 진짜로 빌드해보겠습니다.
아래 명령어를 사용하여 AWS Public ECR에서 Python 3.14 버전의 Lambda 이미지를 기반으로 컨테이너를 실행하고, requirements.txt에 있는 필요 패키지를 python/ 디렉토리에 설치합니다.
-v 옵션으로 현재 디렉토리를 도커의 /var/task 디렉토리에 마운트하였으므로 /var/task 내의 파일 변경사항이 현재 작업 중인 디렉토리에도 똑같이 반영됩니다.
docker run --rm \
--entrypoint pip \
-v "$(pwd)":/var/task \
-w /var/task \
"public.ecr.aws/lambda/python:${PYTHON_VERSION}" \
install -r requirements.txt -t python/ --no-cache-dir
근데, 왜 python/ 디렉토리에 패키지를 설치할까요? 그 이유는 Lambda Layer는 각 OS에 따라 패키지를 설치해야 하는 위치가 있는데, 이 디렉토리 이외의 곳에 설치하게 되면 인식을 못하기 때문입니다. 자세한 내용은 아래 문서를 참고하시기 바랍니다.
https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/packaging-layers.html
그 후, 결과물을 아래 명령어를 통해 압축합니다.
zip -r "pymysql.zip" python/
위 절차는 모두 앞서 클론받은 레포에서 아래 명령어를 통해 한번에 실행할 수 있습니다.
cd pymysql && chmod +x ./build.sh && ./build.sh
2. AWS에 Layer 배포하기
이제 1번에서 만든 Layer를 AWS에 배포해보겠습니다.
아래 명령어를 통해 AWS CLI로 pymysql Layer를 배포합니다.
aws lambda publish-layer-version \
--layer-name "pymysql" \
--zip-file "fileb://pymysql.zip" \
--compatible-runtimes python3.14 \
--compatible-architectures x86_64 arm64 \
--region "ap-northeast-2" \
--query 'LayerVersionArn' \
--output text
이후, AWS Mgmt 콘솔에 들어가 Lambda -> Layer(또는 계층)으로 들어갑니다.

잘 생성된 것을 볼 수 있습니다.
위 절차는 모두 앞서 클론받은 레포에서 아래 명령어를 통해 한번에 실행할 수 있습니다.
cd pymysql && chmod +x ./deploy.sh && ./deploy.sh
3. Lambda 함수에 Layer 연결하기
이제, 방금 배포한 Layer를 잘 사용할 수 있는지까지 테스트해보도록 하겠습니다.
AWS Mgmt 콘솔에서 Lambda -> 함수 -> 함수 생성으로 이동합니다.
함수 이름을 제외한 설정은 아래와 동일하게 설정합니다.

이후, 함수를 생성하고, 코드는 앞서 클론받은 레포의 pymysql/example/lambda_function.py를 사용합니다.
코드를 업데이트한 후, Deploy 버튼을 눌러 배포합니다.

다음으로 Lambda -> 함수 -> 생성한 함수 -> 코드로 이동하여 맨 아래의 계층 편집 버튼을 클릭합니다.
Add a Layer를 선택한 후, 아래와 같이 셋업합니다.

그리고 저장합니다.
이제, 테스트를 진행해봅시다. 적당히 이벤트 이름을 설정하고, 이벤트 JSON은 {}으로 설정하고, 테스트합니다.

실행이 정상적으로 완료된 후, 로그를 확인해보면 이렇게 잘 실행된 것을 확인해볼 수 있습니다.

마치며
이번 글에서는 Lambda Layer를 활용해 AWS Lambda에 외부 패키지를 추가하는 방법을 살펴봤습니다. 단순히 패키지를 올리는 것에서 끝나는 것이 아니라, Lambda 실행 환경과 동일한 컨테이너에서 빌드하고, 정해진 디렉토리 구조에 맞춰 압축한 뒤, Layer로 배포하고 함수에 연결하는 전체 흐름을 따라가 보았습니다. 이 과정을 익혀두면 공통 의존성을 여러 함수에서 훨씬 효율적으로 관리할 수 있고, 배포 구조도 한층 깔끔하게 정리할 수 있습니다.
특히 Layer는 단순한 편의 기능이 아니라, Lambda 운영의 재사용성과 유지보수성을 높여주는 중요한 구성 요소입니다. 앞으로 pymysql뿐 아니라 다양한 Python 패키지나 공통 유틸리티 코드에도 같은 방식을 적용할 수 있으니, 실무에서도 적극적으로 활용해보시기 바랍니다.