AWS

Serverless(serverless.yml) Lambda Layers 배포 및 설정 방법

vipDeveloper 2022. 7. 29. 11:49
반응형

Lambda 로 구성된 프로젝트를 배포하다보면 Lambda의 패포 용량 제한을 넘어 배포에 실패할때가 존재한다

- AWS Lambda Error: Unzipped size must be smaller than 262144000 bytes.

AWS Lambda Error: Unzipped size must be smaller than * bytes.

 

이와 같은 문구는 개발자에게 짜증을 안겨다 준다. 

 

자 여기서 사용하지 않는 라이브러리 빼고 올리는건 누구나 다 생각하고 시도했을 방법이니 생략하고

layer(레이어)를 사용하여 올리는 방법을 간략히 소개하겠다.

 

일단 레이어란 무엇인가! 는 나중에 자세히 알아보고 오늘은 간략한 설명, 실무용 배포를 안내를 하도록 하겠다.

lambda의 계층(layer)의 설명은 AWS 가이드로 대신.

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html

 

Lambda 계층 만들기 및 공유 - AWS Lambda

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

Lambda 계층은 Lambda 함수와 함께 사용할 수 있는 라이브러리 및 기타 종속성을
패키징하는 편리한 방법을 제공합니다. 계층을 사용하면 업로드된 배포 아카이브의 크기가 줄어들고 
코드를 더 빠르게 배포할 수 있습니다.

계층은 추가 코드 또는 데이터를 포함할 수 있는 .zip 파일 아카이브입니다.
계층에는 라이브러리, 사용자 정의 런타임, 데이터 또는 구성 파일이 포함될 수 있습니다.
계층은 코드 공유 및 책임 분리를 촉진하므로 비즈니스 로직 작성을 더 빠르게 반복 할 수 있습니다.

대충 Layers는 람다 함수에서 사용하는 라이브러리 및 기타 종속성 패키징을 계층화 시켜 Lambda에 연결, 보다 빠른 배포 및 패키징을 공용으로 사용 할 수 있도록 하는 것이다.

 

Layers serveless.ylm 설정

- runtime : python3.9

- lib path : project/vendor/vendor

service: slsSampleLayers

provider:
  name: aws
  runtime: python3.9
  profile: 프로필 # The default profile to use with this service
  role: 역할
  stage: ${opt:stage}
  region: ${opt:region}
  environment:
    PYTHONPATH: ":/var/task/vendor:./vendor:/opt/vendor"
    TZ: Asia/Seoul

layers:
  SampleLayers:
    path: vendor
    name: SampleLayers
    description: Vendor Packages Layer
    compatibleRuntimes:
      - python3.9
    package:
      include:
        - ./**
package:
  individually: true
  exclude:
    - '**'
    - '!helper/**'
    - '!vendor/**'
    - '**.pyc'
    - '**/**.pyc'  # tv
    - '**/**/**.pyc'  # vendor

폴더 구조는 다음과 같을 것이다 

slsSampleLayers 폴더 밑에 라이브러리 목록이 써있는 requirements.txt 가 존재하며 

이 파일을 통해 라이브러리를 설치, 해당 폴더를 압축하여 올라가는 것이다.

 

참고할 명령어는 다음과 같다.

 

pip3 install -t vendor/vendor -r requirements.txt 

 

여기서 vendor 폴더 밑에 vendor 안에 설치하는 이유는 해당 layer는 lambda 의 실행 환경의 opt밑에 압축 풀리는데 1개 이상의 layer를 사용할 경우 해당 경로들이 겹치기에  vedor폴더 밑에 vender에 라이브러리를 설치하면 압축 해제시 opt/vendor 폴더로 풀리기 때문에

라이브러리를 분리해 놓을 수 있다.

 

slsSampleLayers
      - requirements.txt
      - serveless.yml
      - vendor (폴더)
      - vendor/vendor/ (하위폴더)
      - vendor/vendor/* (라이브러리들)
      
      ########
      - vendor/numpy_vendor (추가로 layer를 만든다 가정 한다면..)
      ########

자 레이어를 배포하자

npx sls deploy -s layers -r us-west-1

npx sls deploy -s {stage} -r {region}

 

자 배포된 layers를 확인하기 위해 AWS 콘솔에 접속하여 Lambda 서비스로 이동한다. 

계층 메뉴에서 배포한 SampleLayers를 확인해보자 (아.. layer로 했어야되는데 s 왜붙였지..)

잘 배포된 레이어를 확인할 수 있다. 궁금하다면 다운받아 압출을 풀어보자. 

다음 글에서는 이 Layer를 Lambda 에 연결하는 방법을 설명하도록 하겠다.

반응형