AWS 람다 레이어 사용법
AWS 람다AWS Lambda는 아마존 웹 서비스에서 제공하는 서버리스 애플리케이션 실행 환경입니다. 앞서 re:Invent 2018에서 공개한 루비 런타임 지원과 ALB 타깃그룹의 새로운 타입으로 람다가 추가됐다는 소식을 전해드렸습니다. 이와 더불어 람다에는 한 가지 중요한 기능이 추가 되었습니다. 바로 함수 간에 특정 파일을 공유할 수 있도록 해주는 레이어 기능입니다.
레이어 기능을 사용하면 다음과 같은 장점을 누릴 수 있습니다.
- 패키지 용량 관리 면에서 유리합니다. 람다 레이어의 경우 하나의 함수에서 최대 다섯개까지 사용할 수 있으며, 함수와 레이어를 포함한 총 용량을 250MB까지 지원하고 있습니다.*
- 함수들에서 동시에 사용할 수 있는 파일들을 레이어로 분리할 수 있습니다. 이를 통해서 함수 본체의 용량을 줄이는 것이 가능하고, 여러 함수에서 레이어를 재활용할 수도 있습니다.
- 함수 본체의 용량을 줄여서 배포 과정을 빠르게할 수 있습니다. 기존에는 함수 본체에 함수의 의존성들이 모두 포함되어있어야 했고 필연적으로 배포 과정도 느려질 수 밖에 없었습니다. 레이어를 사용하면 의존성을 레이어로 분리하고 함수 본체에서는 직접 작성한 코드만 배포하는 것이 가능해집니다.
* 람다 패키지는 압축 기준 50MB, 압축 해제 기준으로는 250MB를 지원하고 있습니다. 압축율이 낮은 경우 실제로 사용할 수 있는 용량은 턱없이 부족합니다.
람다 레이어는 단순히 파일 집합에 불과하기 때문에 람다를 사용해본 적이 있다면 아주 쉽게 사용해볼 수 있습니다. 여기서는 람다 레이어에 텍스트 파일을 하나 추가하고, 이를 파일의 내용을 함수에서 반환하는 간단한 예제를 소개합니다.
다음과 같이 람다 함수 디렉터리와 레이어 디렉터리를 준비합니다.
.
├── hello_layer_function
│ └── hello_layer.rb
└── layer
└── a_file_in_layer
layer/a_file_in_layer
파일의 내용은 다음과 같습니다.
Lambda Layers.
함수에서 람다 레이어를 지정하면 람다 레이어의 내용는 디렉터리 구조 그대로 /opt
아래에 복사됩니다. 따라서 레이어를 압축할 때 /opt
아래의 디렉터리 구조에 대해서 고려할 필요가 있습니다. 결과적으로 이 파일은 람다 함수에서 /opt/layer/a_file_in_layer
경로로 접근할 수 있습니다.
람다 함수인 hello_layer.rb
파일의 내용은 다음과 같습니다.
이 함수는 레이어에 포함된 /opt/layer/a_file_in_layer
파일의 내용을 거꾸로 반환합니다.
먼저 레이어를 압축 파일로 만들고, lambda publish-layer-version
명령어로 배포합니다.
$ zip layer.zip -r layer
adding: layer/ (stored 0%)
adding: layer/a_file_in_layer (stored 0%)
$ aws lambda publish-layer-version \
--layer-name layer \
--zip-file fileb://./layer.zip
정상적으로 배포가 되면 레이어 관련 정보가 출력됩니다. 이 중에서 LayerVersionArn
을 기록해둡니다.
$ zip hello_layer_function.zip -j ./hello_layer_function/hello_layer.rb
adding: hello_layer.rb (deflated 4%)
$ aws lambda create-function \
--function-name hello_layer \
--runtime ruby2.5 \
--memory-size 128 \
--handler hello_layer.handler \
--layers <LAYER_VERSION_ARN> \
--role <ROLE_ARN> \
--zip-file fileb://hello_layer_function.zip
ROLE_ARN
에는 람다 함수 실행을 위한 역할을 지정합니다.* LAYER_VERSION_ARN
에는 앞서 배포한 람다 레이어의 버전 ARN을 지정합니다.
* 람다 실행을 위해서는 IAM 역할이 필요합니다. 람다 루비 공식 지원을 발표 글에서 역할을 생성하는 방법을 간단히 다루고 있습니다. 아직 람다 실행을 위한 역할이 없다면 이 내용을 참고해주세요.
이제 등록한 람다 함수를 실행해봅니다.
$ aws lambda invoke --function-name hello_layer output.txt
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
$ cat output.txt
"sreyaL adbmaL"
layer/a_file_in_layer
의 내용인 “Lambda Layers”가 뒤집어진 내용이 출력된 것을 확인할 수 있습니다. 이렇듯 파일 관점에서 생각하면 람다 레이어는 아주 쉽게 사용할 수 있습니다. 단, 레이어를 사용해 의존성을 분리하는 경우에는 프로그래밍 언어에 따라서 라이브러리 로드 패스를 수정하는 등 좀 더 궁리가 필요합니다.
람다 레이어를 해설하고 있는 한글 문서로는 다음 글들을 추천합니다.