Posted 2026.01.22 00:00
By recoma
NOTE: 이 포스트는 필자의 주관적인 의견과 개발 방식이 다분하게 들어가 있으니, 만약 이 방식을 적용하려고 한다면 무조건 적용하기 보다는 한번더 생각해 보시기를 권합니다.
포스팅 날짜로부터 약 한달 전, 이날도 역시 회사에서 코딩을 하던 도중, AWS로부터 권고사항이 들어왔는데 내용은 아래와 같았다.
2025년 12월 15일 부터, AWS Lambda에서, Python 3.9 버전 지원이 중단되니, 그 전에 새 버전으로 업그레이드 해라. 추가로, 2026년 2월 15일 부터 Python3.9 버전의 람다를 사용할 수 없다.
하지만 회사에서 사용하는 파이썬 버전의 대부분은 3.9로 되어 있다. 메인 서버들은 물론이고 AWS Lambda도 절반 이상이 3.9버전으로 되어 있으니, 당연히 작업을 해야 할 수 밖에 없었다. 아무튼, 그래서 AWS Lambda 목록을 뒤져보고 코드도 살펴보게 되었는데 현재 관리되고 있는 람다의 개발 혹은 운영환경이 제대로 되어 있지 않다는 것을 느끼게 되었다. 아래와 같은 이유로 말이다.
requests나, numpy 같은 라이브러리들을 임포트 하려면 Lambda Layer를 추가해야 한다. 이런 식으로 말이다.
대상 라이브러리에 해당하는 ARN을 외부에서 긁어서 여기에 넣어야 하는 방식인데, 일단 이 ARN을 찾는 과정부터 번거로울 뿐더러 여러개의 라이브러리를 동시에 사용한다고 하면 골치아파진다.그래서 나는 나중에 신규 개발자들도 람다를 구현할 일이 있을 수 있으니, 버전도 올릴 겸 람다 개발 환경을 협업에 유리하게 조성을 했다.
현재 올라와 있는 람다 코드들 중에 현재 사용하고 있는 람다 코드들을 골라 Github Repository에 전부 옮겼다. 디렉토리 구조는 아래와 같다.
/
`- functions
`- function_1
`- handler.py
`- function_2
`- handler.py
`- common
`- utils.py
`- db
`- scripts
`- deploy.sh
`- requirements.txt
handler.py 가 바로 람다 함수가 적혀있는 파일인데. 템플릿은 아래와 같다 (일반적인 람다 함수 템플릿과 유사)
def lambda_handler(event, context):
pass
exmaple_function이라는 람다 함수를 생성한다고 가정한다.
_dev 이다. 따라서 example_function_dev 라는 함수를 생성한다.functions 디렉토리에 들어가서 example_function 이라는 함수 프로젝트 디렉토리를 만들고, 그 안에 람다 함수를 구현할 handler.py 파일을 생성한다.DBConfig 라는 이름의 클래스에 접속 정보를 적고 (보통은 환경변수를 사용한다) 이를 활용해 session을 호출하면 된다.pytest와 디렉토리 tests가 조성되어 있다. 이 디렉토리 안에 평소대로 하는 방식대로 테스트코드를 작성하는 방식. sh scripts/deploy.sh example_function dev
# sh scripts/deploy.sh {함수명} {dev/prod}
이 스크립트를 실행하면 아래와 같은 과정을 거쳐서 배포가 된다.
requirements.txt와 pip를 통해 의존성 설치를 한다.build 디렉토리로 이동한다build 디렉토리를 zip파일로 압축시킨다.AWS-CLI 를 이용해 람다 함수를 업데이트 한다
aws lambda update-function-code \
--function-name example_function_dev \
--zip-file fileb://{절대경로}/build.zip
하지만 이대로 람다 함수를 실행하면 작동이 되지 않는다. 런타임 핸들러 함수를 수정해야 하기 때문이다. 런타임 핸들러 함수는 말 그대로 실행 대상의 함수를 의미한다. 따라서 이걸 functions.example_function.handler.lambda_handler 로 수정한다. 즉, 실행 대상 함수의 위치와 그 이름을 작성하면 된다.

example_funciton_prodshell scripts/deploy.sh example_function prod개발환경에 있어서 눈에 띄게 깔끔하게 개선이 되었는데, 좋아진 점은 아래와 같다.
| 항목 | 개선 전 | 개선 후 |
|---|---|---|
| 개발도구 | AWS Console 브라우저, 각 개발자의 IDE가 아닌 브라우저상에서 개발하기 때문에 익숙해질 때 까지 적응하기 힘듦 | 본인 IDE에서 그대로 개발 가능 |
| 개발/운영 분리 여부 | X: 운영에서 코딩하고 바로 deploy하는 방식이기 때문에 이전 코드 이력이 남지 않는다는 게 치명적 단점 | O: 코드를 Gihtub에서 관리하고 PR -> Merge -> CLI에서 배포 방식으로 진행하기 때문에 최소한 코드 이력은 남음 |
| 외부라이브러리 | 일일히 검색해서 ARN을 긁은 다음, Layer에 추가하는 방식, 관리하려면 일일히 브라우저에 들어가야 함 | 그냥 로컬에서 pip install로 설치하고 배포하면 자동 적용. 관리도 로컬에서 |
| DB 호출 방식 | pymysql로 DB에 접근하고, 코드도 직접 구현, ORM 모델도 없어서 전부 SQL문 사용, 공용 라이브러리는 있으나, 괸라가 되고 있는지 알 수 있는 방법이 없음 | 이미 프로젝트 안에 ORM Model이 구현되어 있어서 그대로 임포트해서 사용 가능 |
과거, 그러니까 내가 막내 개발자였을 때의 개발환경은 팀플레이 보다는 “각자 개발” 위주의 환경이다 보니까, 몇몇 이런 식의 환경들이 팀보다는 특정 개발자 기준으로 정립이 되어 있는 경우가 흔했다. 이중 이번에 포스팅한 Lambda는, 개 중 일부임과 동시에 가장 적나라하게 드러난 경우다. 하지만 오히려 이렇게 돋보였기에 바로 내 눈에 띄였고, 이를 기회로 개발환경을 개선할 수 있었다.
단순히 개선만 한게 아니라, 팀 내 회의를 열어 신입 개발자들에게도 개선된 람다 함수 개발 방법을 가르쳐 주었고, 이들도 역시 이 룰에 따라 개발을 진행했다. 비록 신입 개발자들은 이전 개발환경을 경험해 본 적이 없지만, 그래도 그들 나름대로 불편함 없이 개발/테스트/배포 까지 할 수 있었고. 이 분들의 람다 작품 중에 하나가 바로 이미지 최적화 프로세스 로직이다.
하지만 100% 해결된 것은 아니다. 아직도 해결해야 할 여러 문제들이 남아있다. 전부 해결하고 싶었지만, 당시 연말이었고, 백엔트 팀의 사실상 리더(직책상 아님) 위치였던 내 입장에서는 당장 처리해야 할 업무가 쌓일대로 쌓여있어 아쉽게도 전부 해결하지는 못했고, 핵심적인 요소만 진행했다. 하지만 언젠가는 마저 다 끝내보고 싶다.
특정 람다 함수에는 그 함수와 관련된 파일만 올라가는게 원칙인데 지금 상황에서는 전부 올라가고 있는 상황이다. 하지만 이건 쉘스크립트에서 함수명과 매칭되는 디렉토리와 common모듈만 따로 뺄 수 있게 코드를 수정하면 금방 끝날 일일 것 같다.
requirements.txt -> pyproject로 전환요즘 파이썬 패키지 관리 툴들 중에 날고 기는 poetry와 uv가 있는 마당에 나는 아직도 pip/requirements.txt 방식을 사용했다. 사실 이건 무슨 중요한 이유는 아니고, 이 방식 이전에 사용했던 방식인 “공용 Layer 관리 프로젝트”에서 아마 Layer를 배포할 때, requirements.txt를 사용해야 한다는 예기를 듣고 그 버릇이 여기까지 온 모양이다. 하지만 이젠 패키징 조차도 로컬에서 진행하기 때문에 requirements.txt는 버리고 uv, pyproject 기반으로 전환해야 할 것 같다.
하지만 바로 시작하기에는 이르고 후술할 항목에 대해서 추가적으로 생각/설계한 다음 진행할 필요가 있다.
지금까지는 사내 모든 람다 함수가 동일한 라이브러리를 사용해 와서 문제가 없지만, 나중에 가면 각 프로젝트 마다 코드 용량이 비대하게 커지게 되는데, Lambda의 코드 최대 용량은 비압축 기준 250MB, 압축 기준 50MB 이기 때문에 용량초과로 인해 배포가 안되는 참사까지 이어질 수 있다 (참고). 이를 방지하기 위해 아래와 같은 방식을 도입해야 할 필요가 있다.
requirements.txt -> pyproject.toml로 전환람다 관련된 할당량은 위의 링크 말고도 AWS에서 로그인 한 후 Service Quotas -> AWS Services -> AWS Lambda 를 통해 볼 수 있다.
람다 개선 프로젝트의 최종 목표. 하지만 위의 언급된 3가지의 과제부터 해결해야 CI/CD를 도입할 수 있을 것으로 보인다. 좀 더 구조화된 패키징/의존성 관리 구조가 구축되어 있어야, 자동화 배포도 문제없이 이루어질 것이라고 판단했기 때문이다. 따라서, 이 문제들이 해결된 후에야 비로소 안정적인 자동화 배포 파이프라인 구축을 진행할 수 있을 것이다.
람다 개발 환경 개선은 단순히 기술 부채를 해결하는 작업이 아닌, 개별적으로 진행되었던 개발 방식에서 벗어나, 팀원 모두가 쉽게 개발/기여 할 수 있는 협업 환경의 초석과도 같은 존재다. 체계적인 구조와 프로세스를 정립함으로써, 신입 개발자도 새로운 기능을 쉽게 성공적으로 구현하는 등 가시적인 성과를 확인할 수 있었다.
물론 아직 해결해야 할 과제는 남아있다. 하지만, 이번 경험은 잘 갖춰진 개발 환경이 팀의 생산성과 서비스 안정성에 미치는 중요성을 제대로 보여주었다. 기술의 편리함에 의존하는 것을 넘어 ‘어떻게 잘 사용할 것인가’에 대한 고민이 더 나은 환경/생산성을 발전시킬 수 있는 발판이 된다.