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는
- 최대 5개의 layer를 사용할 수 있고,
- 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 |