lambda layers란

[lambda들이 공통적으로 사용하는 라이브러리 + 람다에 실기에는 너무 무거운 라이브러리]를 lambda 보다 한 단 위에 있는 레이어에 실어 lambda들이 공통적으로 사용할 수 있게 하는 기능입니다.

(더 자세한 건 [https://medium.com/@rabter/aws-lambda-layer%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-how-to-use-aws-lambda-layers-c206ba40d4cc] 참고)

무한정으로 라이브러리를 실을 수 있는 것은 아니고, 5개의 layers, 전체 layers 용량 250m 까지라는 제한이 존재 합니다.

lambda layers를 디렉토리 구조로 관리할 수 있을까?

최근 프로젝트에서 lambda를 통해 api를 디플로이하는 요건이 있었습니다. 약 10여개의 api를 디플로이 해야 했는데, 다른 라이브러리에 의존성이 존재했습니다.

위에서 언급했다시피, layers에는 무한정의 라이브러리를 넣을 수 있는 것이 아닙니다. layers직하라면 5개의 라이브러리밖에 들어가지 못하죠.

그래서 다음과 같이 라이브러리의 종류를 나누고 각 디렉토리에 해당하는 디펜던시를 관리하기로 했습니다.

layers
    ├─calculation
    ├─network
    ├─data
    └─custom

이때 !

layers를 인풋하기 위해서 특정한 디렉토리 구조를 지키지 않으면 lambda에서 임포트하지 못합니다.
이를 설명하기 위해 custom 이라는 이름의 layer를 추가하는 시나리오를 가정해봅니다.

└─python
    ├─anasdk
    │  └─src
    │      └─logic
    │          ├─common
    │          └─definition
    └─bizsdk
           └─src
               └─logic
                   ├─common
                   └─definition
  1. 먼저 python 이라는 디렉토리를 만들고, 그 안에 개발자가 원하는 라이브러리를 넣어줍니다. 저같은 경우는 자작된 anasdk, bizsdk라는 라이브러리를 python 디렉토리의 직하에 넣어두었습니다.
  2. python 디렉토리를 zip합니다.
  3. layers만들기에 들어간 후, zip파일을 업로드하고 custom이라는 이름의 layer명으로 저장합니다.
  4. 각 lambda에서 custom 레이어를 디플로이합니다.
  5. lambda에서 잘 import 되는지 확인합니다. lambda에서는 아래와 같은 방식으로 import가 가능합니다.
import json
import anasdk
import bizsdk

라이브러리를 넣는게 아니라 좀 더 화끈하게 가상환경 디펜더시를 통째로 넣어볼까

제가 만든 lambda함수에서는 requests 라이브러리를 사용하고 있습니다. 그런데 lambda에선 requests모듈을 지원하지 않아, layer에 추가하여 관리해야하죠. 그래서 request 라이브러리를 layer에 넣고 사용하려니 이번에는 request에서 필요한 디펜던시를 또 넣어야 하는 문제가 발생했습니다. 이후의 라이브러리를 넣어도, 또 그에 필요한 라이브러리를 넣어달라는 에러가 언제까지나 지속되겠죠.

그래서 로컬 가상환경에 가지고 있는 라이브러리 전체를 layer에 넣기로 했습니다. 방법은 다음과 같습니다.

  1. 로컬에서 pip 가상환경을 인스톨하고, 필요한 라이브러리를 모두 인스톨합니다.
  2. [가상환경 루트] / Lib / site-packages 에 인스톨한 라이브러리가 모두 들어있습니다. 이를 모두 복사합니다.
  3. 위에서 처럼 python 디렉토리를 만든 후, 그 안에 복사한 라이브러리를 모두 넣습니다. 용량이 꽤큽니다.
  4. python 디렉토리를 zip합니다.
  5. layers만들기에 들어간 후, zip파일을 업로드합니다.
  6. 잘 작동하는군요.

주의할 점

주의할 점이 있습니다. pip으로 인스톨한 라이브러리가 lambda에서 전부 사용가능한 것이 아니라는 점. lambda가 제공하는 기본 파이썬 모듈이 기존의 리눅스와는 다르기 때문입니다. 예를 들어 pip으로 인스톨한 pandas 라이브러리나, postgresql을 사용할 수 있는 가장 유명한 프레임워크인 psycopg2 조차도 보통의 소스코드를 인스톨해서는 lambda에서 사용이 불가합니다. 이러한 라이브러리는 검색해서 따로 다운 받은후 넣어주어야 합니다.

+ Recent posts