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”가 뒤집어진 내용이 출력된 것을 확인할 수 있습니다. 이렇듯 파일 관점에서 생각하면 람다 레이어는 아주 쉽게 사용할 수 있습니다. 단, 레이어를 사용해 의존성을 분리하는 경우에는 프로그래밍 언어에 따라서 라이브러리 로드 패스를 수정하는 등 좀 더 궁리가 필요합니다.

람다 레이어를 해설하고 있는 한글 문서로는 다음 글들을 추천합니다.

44BITS 로고

아마존 웹 서비스(AWS, Amazon Web Serivce)란?

🏷️ 키워드, 2020-01-20 - 아마존 웹 서비스는 아마존의 자회사로 같은 이름으로 퍼블릭 클라우드 컴퓨팅 서비스를 제공하고 있습니다. 대표적인 서비스로는 컴퓨팅 자원을 제공하는 EC2, 오브젝트 스토리지 S3, 프라이빗 클라우드 VPC, 권한 제어 IAM, 컨테이너 오케스트레이션 ECS, EKS 등이 있습니다.
44BITS 로고

AWS 람다(AWS Lambda)란?

🏷️ 키워드, 2020-02-08 - AWS 람다(AWS Lambda)는 아마존 웹서비스에서 제공하는 서버리스 컴퓨팅 서비스입니다. 2014년 AWS 리인벤트(AWS re:Invent)에서 처음 발표되었습니다. 서버리스 컴퓨팅은 애플리케이션을 실행하기 위핸 별도의 서버 준비 없이, 곧바로 코드를 실행해주는 서비스입니다.

당근마켓에서 클라우드 엔지니어이자 SRE로 일하고 있습니다.

개발자 팟캐스트 스탠다드아웃에 참여하고 있으며, 클라우드 블로그 44BITS를 운영하고 있습니다. 프로그래밍 언어 루비, 리눅스, 아마존 웹 서비스를 좋아합니다