Lambda에 웹서버 배포 시 문제점 및 해결과정

·2022년 6월 14일
0
post-thumbnail

서버리스로 웹서버를 배포하는 경우, 개발자 입장에서 인프라를 크게 관리하지 않아도 된다. 또한, 상시적으로 실행되어야 하는 서버가 없으므로 적게 사용할 경우 비용적인 장점이 있다. Lambda에 간단하게 웹서버를 배포할 때 참고할 수 있는 레퍼런스도 많고, 과정을 간소화해주는 Zappa와 같은 라이브러리도 있어서 구현하기도 쉽다.

그러나, 서버리스 배포가 기존의 EC2, ECS기반 웹서버 배포에 비해 장점만 가지고 있는 것은 아니다. 실제로 서비스를 하는 경우 겪을 수 있는 문제점들이 있는데, 이에 대해 소개하고 해결할 수 있는 방법을 다뤄보려고 한다.

code의 업로드 크기 제한

  • 압축했을 때, code는 그 크기가 50MB보다 작아야 한다.
  • 서비스를 위해서는 굉장히 다양한 라이브러리가 필요하고, 비즈니스 로직이 추가되면서 code 크기가 50MB보다 커질 수 있다.
  • 해결 방법
    • ECR을 통해 코드와 container를 함께 업로드
      • ECR 레포지토리에 필요한 docker container(10GB 이내)를 업로드한다.
      • ECR에 저장된 docker container로 lambda를 생성하도록 한다.
      • 관련 AWS 문서
    • S3에 파일을 업로드하고 lambda에서 \tmp디렉토리를 이용해 다운 받는다.
      • S3에서 다운받는 시간이 느리므로 coldstart timeout 시간이 길어질 수 있다.
      • zappa의 simple handler 기능으로 쉽게 적용할 수 있다.

Lambda의 coldstart 문제

  • coldstart 유형

    Lambda 입장에서는 runtime 구성시에 발생하는 cold start만 cold start라고 하지만, 웹서버 입장에서는 request를 처리하기 위해 웹서버가 메모리에 로딩되는 과정 까지도 cold start라고 해야한다.

    • lambda runtime 구성에서 발생하는 cold start
      - Python은 1ms이내의 시간만 걸린다.
    • Code를 compile하는 과정에서 발생하는 cold start
      • 위의 그림에서 Execute Initialization Code에 해당하는 부분이다.
      • JAVA의 경우 이 과정이 오래 걸리지만, Python은 인터프리터 언어라 의미 없다
    • Code가 메모리에 로딩되는 과정에서 발생하는 cold start
      • Execute handler code 부분에 해당한다.
      • Python의 경우 여기서 대부분의 coldstart time이 발생한다.
  • 해결 방법

    • runtime 구성 + 코드 컴파일 과정시에 생기는 coldstart
      - provisioned concurreny + application auto scaling 기능을 이용하면 해결할 수 있다.

      • 다만 비용이 비싸고 Python 기반 웹 프레임워크의 경우 메모리에 로딩되는데 시간이 걸려 생기는 coldstart는 해결하지 못한다.
    • 웹서버 로딩으로 인한 coldstart

      lambda는 hadler를 수행한 후 바로 꺼지는 것이 아니라, 5분간은 유지된다.

      • Zappa에서 keep_warm 세팅을 통해 빈 request를 일정한 주기(5분 이내)로 보내준다

        • 서비스에 API 요청이 없더라도 적어도 1개의 lambda는 warm상태(웹서버가 로딩된 상태)임을 보장한다
      • n개의 동시성이 필요하다면 n개의 lambda를 4분에서 5분마다 호출한다.

        • n개를 순차적으로 호출한다면, 한 개의 lambda가 순차적으로 request를 처리하는 경우가 생긴다.

        • 원하는 concurrency만큼 비동기적으로 호출하고, 호출된 lambda가 response를 보내고 다른 request를 처리하지 않도록 time.sleep()메서드를 이용한다.
        • 참고 링크 및 관련 코드

RDS Connection Leak

  • lambda가 여러개 띄워지고 모두 RDS에 접근하는 경우 connection에 leak 발생할 수 있다
  • 그러나 lambda의 concurrent execution이 1000으로 제한되어 있고, 가장 낮은 인스턴스 사양의 RDS도 이정도는 감당가능하므로 딱히 고려하지 않아도 된다.

참고

https://aws.amazon.com/blogs/compute/operating-lambda-performance-optimization-part-1/

https://pypy.dev/serverless/zappa-increase-unprovisioned-concurrency/#%EA%BC%BC%EC%88%98

profile
Ben

0개의 댓글