Today I Learned
날짜
2025년 1월 20일 월요일
내용
람다에 계층 추가하기
람다는 서버 없이 간단한 함수를 작성하여 실행할 수 있는 기능을 제공한다. 따라서 여기에는 기본 내장 함수들만 제공된다. 만약 람다에서 어디론가 http 요청을 보내기 위해 requests
가 필요하다면 람다에 등록하는 ZIP 파일에 해당 패키지를 추가해주어야 한다.
웹훅 개선에 람다를 이용할 계획이고, 각 람다는 다루는 웹훅 별로 나눠질 예정이다. 주문, 고객, 상품 등 다루는 데이터에 따라 여러 람다를 만들거다. 각 람다를 정의할 때마다 requests
라이브러리를 설치해주는 것은 번거롭다. 이런 일이 반복되면 람다 자체도 용량이 커진다. 모두가 쓰는 공통적인 라이브러리를 추가해주는 기능이 계층(layer)다.
다음 코드를 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import json
import requests
import base64
def lambda_handler(event, context):
try:
... 내부 로직 ....
response = requests.get(url, headers=headers)
status_code = response.status_code
data = response.json()
... 내부 로직 ...
except Exception as e:
print(f"Error: {str(e)}")
return {
"statusCode": 500,
"body": json.dumps({"error": str(e)})
}
이 람다를 호출해보면 requests
라는 모듈을 import 할 수 없다고 컴파일 에러가 날 거다. python 3.11을 기준으로 requests
계층을 만들어보자.
mkdir py
로 디렉토리 생성 후cd py
로 이동python3.11 -m venv venv
로 가상환경을 만든다.cd venv
로 들어가source ./bin/activate
를 입력해 가상환경 활성화pip install requests
로 패키지 설치cd lib/python3.11/site-packages
로 패키지 설치된 디렉토리로 이동mkdir ../python
명령어로 상위에 파이썬 폴더 생성- 다음을 입력해 패키지들을 압축하여 파이썬 폴더에 저장
1
2
3
cp -r ./* ../python/ # 파이썬 폴더로 복사 붙여넣기
cd .. # 상위 폴더로 이동
zip -r requests_layer.zip python/ # 파이썬 폴더를 포함하여 압축
- AWS Lambda ⇒ 계층 ⇒ 계층생성에서 해당 파일을 업로드 한 후 생성
- 사용할 람다 함수로 이동 ⇒ 코드에서 아래로 내려 계층 추가
혹여나 오류가 발생할 경우 확인해야 할 것
- ‘딱 필요한 패키지만’ 압축하지 않기
- 각 패키지들은 종속되어 있는 경우가 있다. 예를 들어, requests 패키지는 urlib 패키지가 없으면 작동하지 않는다. 따라서 site-packages 내에 있는 모두 압축에 포함해야 한다.
- python 폴더안에 넣기
- 굳이 상위 폴더에 python 폴더를 만들어 준 이유는 그래야만 계층이 제대로 작동하기 때문이다. 패키지들만 압축하면 계층이 작동하지 않는다.
- 람다함수와 계층의 런타임 확인
- 람다함수와 계층이 정의된 런타임은 동일해야 한다. 호환 아키텍처가 x86_64인지 arm64인지, 언어 버전은 동일한지 확인이 반드시 필요하다.
이 설정만 해주면 내부적으로 별다른 조치 없이 import requests
가 가능하다.
회고
알면 알수록 무궁무진한 AWS