람다에 layer 추가하기

2025년 1월 20일 월요일

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 계층을 만들어보자.

  1. mkdir py 로 디렉토리 생성 후 cd py 로 이동
  2. python3.11 -m venv venv 로 가상환경을 만든다.
  3. cd venv 로 들어가 source ./bin/activate 를 입력해 가상환경 활성화
  4. pip install requests 로 패키지 설치
  5. cd lib/python3.11/site-packages 로 패키지 설치된 디렉토리로 이동
  6. mkdir ../python 명령어로 상위에 파이썬 폴더 생성
  7. 다음을 입력해 패키지들을 압축하여 파이썬 폴더에 저장
1
2
3
cp -r ./* ../python/ # 파이썬 폴더로 복사 붙여넣기
cd .. # 상위 폴더로 이동
zip -r requests_layer.zip python/ # 파이썬 폴더를 포함하여 압축
  1. AWS Lambda ⇒ 계층 ⇒ 계층생성에서 해당 파일을 업로드 한 후 생성
  2. 사용할 람다 함수로 이동 ⇒ 코드에서 아래로 내려 계층 추가

혹여나 오류가 발생할 경우 확인해야 할 것

  1. ‘딱 필요한 패키지만’ 압축하지 않기
    1. 각 패키지들은 종속되어 있는 경우가 있다. 예를 들어, requests 패키지는 urlib 패키지가 없으면 작동하지 않는다. 따라서 site-packages 내에 있는 모두 압축에 포함해야 한다.
  2. python 폴더안에 넣기
    1. 굳이 상위 폴더에 python 폴더를 만들어 준 이유는 그래야만 계층이 제대로 작동하기 때문이다. 패키지들만 압축하면 계층이 작동하지 않는다.
  3. 람다함수와 계층의 런타임 확인
    1. 람다함수와 계층이 정의된 런타임은 동일해야 한다. 호환 아키텍처가 x86_64인지 arm64인지, 언어 버전은 동일한지 확인이 반드시 필요하다.

이 설정만 해주면 내부적으로 별다른 조치 없이 import requests 가 가능하다.

회고

알면 알수록 무궁무진한 AWS