본문 바로가기
infra

AWS lambda layer

by marble25 2024. 3. 23.

AWS Lambda에서 공통으로 사용할 부분을 어떻게 사용할지 고민해보다가 lambda layer라는게 존재해서 찾아보았다.

Lambda layer

람다 계층은 추가적인 코드나 데이터를 포함하는 아카이브이다.

계층 사용을 고려하는데는 다음과 같은 이유가 있다.

  • 배포 패키지의 크기를 줄이기 위해. 람다 계층을 사용하면 배포할 람다 함수 자체는 작아지게 된다.
  • 핵심 함수 로직을 종속 항목과 분리하기 위해.
  • 여러 함수에서 종속 항목을 공유하기 위해. 계층을 생성한 후 계정의 여러 함수에 적용할 수 있다. 코드 중복을 줄일 수 있다.
  • Lambda 콘솔 코드 편집기를 사용하기 위해. 람다 코드 편집기는 aws 콘솔에서 직접 코드를 수저할 수 있다는 측면에서 유용한 기능인데, 배포 패키지가 크면 사용할 수 없다. 람다 계층을 사용하면 코드 편집기를 사용할 수 있다.

How to use

람다 계층은 람다와 동일하게 zip으로 패키징된다. 람다 함수에 계층을 추가하면 람다의 /opt 밑으로 추출되게 된다.

Lambda 런타임에 따라 미리 정의된 PATH가 다른데, PATH 변수에 의해 계층 콘텐츠가 사용되게 하려면 다음과 같이 폴더 경로를 지정해야 한다.

Node.js

  • nodejs/node_modules
  • nodejs/node14/node_modules (NODE_PATH)
  • nodejs/node16/node_modules (NODE_PATH)
  • nodejs/node18/node_modules (NODE_PATH)

Python

  • python
  • python/lib/python3.x/site-packages(사이트 디렉터리)

Java

  • java/lib (CLASSPATH)

Ruby

  • ruby/gems/2.7.0 (GEM_PATH)
  • ruby/lib (RUBYLIB)

모든 런타임

  • bin (PATH)
  • lib (LD_LIBRARY_PATH)

Upload using cloudformation CDK

common library로 사용할 파일들을 정의한다.

const common = new lambda.LayerVersion(this, `common-layer`, {
  layerVersionName: `common-layer`,
  code: lambda.Code.fromAsset("code/common")
});

common library 파일들이 번들링될 필요가 있다면 다음과 같이 번들링 이미지를 사용할 수 있다.

const common = new lambda.LayerVersion(this, `common-layer`, {
  layerVersionName: `common-layer`,
  code: lambda.Code.fromAsset("code/common"),
  bundling: {
    image: lambda.Runtime.PYTHON_3_10.bundlingImage,
    command: [
      "bash", 
      "-c",
      "pip install -r requirements.txt --only-binary=:all: --platform manylinux_2_17_x86_64 -t /asset-output && cp -au . /asset-output",
    ],
  },
});

위와 같이 python 라이브러리를 패키징한 이미지를 사용하려면 python 폴더를 만들어준 후 라이브러리를 python 폴더 밑에 넣어주어야 한다.

그 후 실제 lambda layer에서는 layers에 위의 common layer만 넣어주면 된다.

후기

공통적으로 들어가야 하는 helper code가 있었는데 이 코드를 모든 lambda function에 복사 붙여넣기 하는 것은 비효율적이라고 생각해서 좋은 방법이 없나 찾아보았었다.

Lambda code를 deploy할 때 공통 라이브러리로부터 파일을 복사하는 방법도 생각해 보았는데 코드 관리가 어려울 것 같아서 다른 방법을 찾아보던 중 lambda layer라는 기능이 있어서 좋은 것 같다.

공통적으로 사용하는 라이브러리나 사용자 라이브러리 등을 이렇게 사용할 수 있을 것 같다.

한계

Lambda는

  1. 최대 5개의 layer를 사용할 수 있고,
  2. layer 없이 50MB, layer를 포함하면 250MB까지 업로드할 수 있다.

애초에 lambda가 큰 용량의 실행환경을 지원하지 않기 때문에 이를 능가하는 요구사항이 있다면 다른 옵션을 생각해봐야 한다.

'infra' 카테고리의 다른 글

aws code pipeline blue / green 배포  (0) 2024.01.12
[TIL] aws codebuild에서 docker image pull rate limit 해결하기  (0) 2023.12.15
[TIL] mig 해제하기  (0) 2023.12.14
[TIL] js pm2 패키지  (0) 2023.11.05
무중단 배포 프로세스  (0) 2023.09.17