[AWS] Lambda 외부 모듈 추가하기(Lambda Layer)

들어가기

AWS lambda는 외부 모듈의 실행을 바로 지원하지 않는다. 로컬에서는 pip install 을 통해 바로 설치 및 실행할 수 있지만 서버리스 환경에서는 실행시점마다 같은 실행 환경을 보장하지 않는다. 함수의 실행 시점에만 인스턴스를 띄워서 지정한 메모리 용량과 시간만큼만 실행한다. Amazon Linux v2 환경에서 동작하는 것으로 보이나 사용자가 시스템 환경까지 많은 부분 관여할 수 없다. 코드만 실행하면 되는 목적으로 사용하기에는 가장 적합한 환경이다.

Lambda Layer

람다 레이어를 사용하여 외부 모듈을 로드하여 사용할 수 있다. 다음의 과정을 따른다.

1. 로드할 모듈 로컬에 설치

pip의 옵션을 이용하여 지정한 폴더에 설치한다. -t 옵션은 모듈을 설치할 타겟(폴더)를 지정한다.

pip install requests -t python

 

로컬에 설치된 파이썬의 버전과 람다환경에서 실행할 파이썬의 런타임 버전을 일치하는 것이 호환성 문제를 일으키지 않는다.

다운로드 후에는 'python' 폴더에 의존성을 포함한 모듈이 다운로드되며, 가장 상위 폴더(python)을 압축하면 준비는 완료된다.

 

2. Lambda Layer

람다 계층으로 이동하여 생성한 압축 파일을 업로드한다.

3. 람다 함수에 등록

람다 함수를 생성하고 계층(layer)을 등록하면 업로드한 모듈을 사용할 수 있다. 다음의 테스트 코드를 사용하였다.

import requests

def lambda_handler(event, context):
    r = requests.get("https://naver.com/")
    return r.status_code

계층에 모듈을 등록하였으므로 코드에서 import requests 구문을 사용하여 모듈을 사용할 수 있다.

실행 결과로 HTTP 결과 코드 200이 반환된 것을 확인할 수 있다. 

 

폴더구조

예시에서는 파이썬 모듈만 다루었지만 다른 언어를 사용할 경우 언어마다 폴더 계층 구조를 다르게 해주어야 한다. aws 공식문서에 다음의 경로를 따르도록 안내하고 있다.

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

마치며

람다에서 바로 인터넷 연결을 고민하던 중 외부 모듈을 활용하여 연결을 하였다.

람다의 경우 프리티어 한도가 월별 1,000,000건 요청 및 최대 320만 초의 실행 시간을 제공한다. 프리티어 이후에도 매우 저렴하게 호출 시간당 요금으로 지불한다. 개인이 사이드 프로젝트로 실행하는 데에는 충분한 양을 제공하므로 많이 활용하도록 하자.

반응형