본문 바로가기
🌴 DevOps/Cloud

🎯[Lambda] 람다의 장점과 단점 | 콜드스타트와 동시성제한

by 카프리썬_ 2021. 8. 9.
728x90
728x90

사실 관련내용은 이곳에서도 정리했었다.

하지만 누군가에게 설명할 수 있을 정도의 수준이 되지 않아서

내가 가장 많이 사용하는만큼 다시한번 더 알아보았다. 

 

2021.06.05 - 음악추천챗봇0. 왜 Serverless아키텍쳐인가? Lambda의 장단점-동시성

 

음악추천챗봇0. 왜 Serverless아키텍쳐인가? Lambda의 장단점-동시성

지금까지 한 작업은 이렇다. 1. Front - 카카오챗봇 기획작업 완료 2. Back - 스포티파이 API 파악 완료 이번엔 인프라를 구성해볼까 한다. 프론트와 백단을 이어줄 틀을 잡아준다라고 할까. 그전에 개

pearlluck.tistory.com


Lambda란?

서버리스 컴퓨팅 서비스

프로비저닝 하거나 관리하지 않아도 코드를 실행할 수 있도록 해주는 컴퓨팅서비스이다.

 

서버리스는 어떻게 동작하는가?

항상 서버를 켜두는 방식과 다르게 필요할때만 함수가 호출이 되어 백엔드 코드가 동작하는 방식이다. 

나같은 경우엔 api gateway나 Cloudwatch 알람을 트리거로 적용하여

request가 들어올때마다 람다함수가 호출하도록 구성해서 람다를 사용했다.

 

서버리스를 언제 사용하면 좋은가?

동적으로 자원을 할당받아서 단기간 이벤트성 트래픽을 감당하는 경우 효과적.

반복적인 배치처리형태의 기능을 개발하는데 적절.

유지보수나 기능추가에 효율적이라 관리보다 개발에 집중할 경우

 

Lambda의 장점

- 비용절감

필요할때만 함수가 호출되어 처리한다는 점에서 항상 서버를 켜두고 있지 않아도 되서 비용이 훨씬 절약

참고로 비용은 람다함수의 요청수와 람다코드의 실행시간에 따라서 부과된다. 람다요금 AWS공식문서

 

- 인프라 운영관리 부담절감

조건없이 자동으로 오토스케일링 되서 서버를 관리할 필요가 없으니 운영관리에 대한 부담이 줄어든다. 

참고로 람다는 컨테이너 개념으로 스케일링된다.

가상OS가 새로 생성되는게 아니라 OS 위에 독립적인 하나의 프로그램을 키는 방식이기 때문에 훨씬 가볍게 확장가능

 

따라서, 이와 같은 장점으로 저렴한 비용으로 간단한 배치작업을 수행하는 서비스를 개발하기 위해 람다를 사용했다.  

Lambda의 단점

- 리소스 제한

메모리(최대 10GB), 처리시간 (최대900초, 즉 15분)  
하나의 함수가 한번 호출될때 AWS에서는 최대 10GB의 메모리까지 사용이 가능하며, 처리시간은 최대 15분 이다
아무래도 직접 서버에서 돌리는 것보다 부족한 스펙이다.

2020년 10월기준 람다스펙 10G로 향상 AWS What's New

람다의 할당량 aws 공식문서

 

- Stateless (상태비저장)

람다함수가 호출되면 새로운 컨테이너를 띄우는 방식이기 때문에 별도의 상태를 저장하지 않는다. 

그래서 이전 이벤트의 실행 컨텍스트에 대한 액세스 권한이 없다보니

db connection을 유지하는 것 같은 기능은 수행하지 못한다. 

 

- ColdStart(콜드스타트)

람다를 오랫동안 사용하지 않고 있다가 오랜만에 실행하게 되면 어느정도 딜레이가 발생한다. 

람다 컨테이너를 띄우기 위해 서버가 켜지고 실행환경을 구성하기 위해 적지않은 시간이 소요되는 것이다.

람다함수 라이프사이클

소스코드 다운로드 -> 실행환경구성 (컨테이너 시작) -> 런타임 동작 -> 코드실행
람다가 실행하기 위한 환경을 구성하기 위해 컨테이너가 띄워지는데, 컨테이너는 항상 준비된게 아니다.

24시간 늘 켜져있는 컴퓨팅리소스가 아니라 필요할때만 호출되서 사용되다보니

리소스를 효율적으로 사용하기 위해서 오랫동안 사용하지 않고 있을 경우 잠시 컴퓨팅파워를 꺼두고 있는다. 

그래서 오랜만에 다시 사용하려고 하면 컴퓨팅 파워를 켜서 실행환경을 구성하기 위해 약간의 시간이 걸린다. 

콜드스타트 해결방법

1. 람다를 계속 호출해준다.

사실 항상 컨테이너가 준비되어 있게 하도록 람다를 지속적으로 호출해는게 가장 좋다.
하지만 호출이 될때마다 비용이 산정되는 방식이기 때문에 그만큼 비용이 더 들수도 있다.

2. 람다의 메모리를 늘려 스펙을 높인다. 

메모리를 더 할당할 수록 컴퓨팅 스펙이 높아지기 때문에 처리속도가 빨라져서 딜레이가 줄어들 수도 있다.

3. 프로비저닝된 동시성 활성화

2019년 콜드스타트 문제를 해결하기 위해 나온 옵션으로 함수의 호출에 바로 응답할 수 있게 미리 준비하는 옵션이다.

이를 활성화 하면 미리 함수의 환경을 세팅해두기 딜레이가 줄어들지만, 추가적인 비용이 든다.

 

- 동시성 제한

람다는 각 리전별로 동시에 실행할 수 있는 람다함수의 개수를 최대 1000개로 제한하고 있다.

그래서 request 수 이를 넘어가게 되면 람다가 수행되지 않는 문제점이 발생할 수도 있다.

람다의 동시성 관련 AWS 공식문서 

람다의 동시성

동시성이란 특정시간에 람다함수가 처리할 수 있는 request의 수이다.

람다는 기본적으로 1개의 워커를 가지고 있는 컨테이너의 개념이다

그래서 reqeuest에 의해 람다함수가 호출이 되면, 하나의 컨테이너를 띄우고 작업을 처리한다. 

만약 요청을 처리하는 와중에 다시 람다함수가 호출이 되면 또다른 컨테이너를 띄우기 때문에 동시성이 증가한다. 

 

동시성 테스트

사실 람다를 통해 대규모 트래픽을 경험해적은 없었지만, 많은 request를 임의로 주면서 테스트해봤다. (이게맞나?)

그런데 내가 테스트를 할떄 1000개이상 직접 동시에 요청해볼 수 없으니 약간의 조건을 추가했다. 

예약된 동시성으로 변경하고, 동시성 예약 값을 900으로 지정했다.

그럼 동시성 개수가 최대 1000개이니까 이제 예약되지 않은 동시성의 개수는 100개가 된다. 

결국 동시에 수행할 수 있는 횟수가 100번인 셈이다. 

 

그리고 100번이상 함수를 호출해보았다 (광기.........)

100번이 넘어가니까 할당된 동시성을 모두 소진한 탓인지 어느순간 response가 멈췄다.

그러다 동시성의 개수가 남게 된 탓인지 약간 기다리니까 reponse가 오더라..

response가 멈춘 나의 서버리스 앱 음악추천챗봇

그리고 동시에 지표도 한번 확인해봤다.

한번에 계쏙 실행시키면서 테스트해서 그런지 이랬고,, invocation 그래프는 이랬고,

잘못된 방식으로 테스트한 걸까.. 지표를 보니 동시실행횟수는 사실 20도 되지 않았다...! 

엥 그럼 왜 딜레이가 생긴거지? 심지어 Throttles 지표에서 어떤값도 찾을 수 없던데 이걸 동시성 문제로 볼 수 있나??

대신 계속 request를 많이 줬더니 Duration이 증가하는걸 보니 코드를 실행하는데 메모리가 부족했나..?

 

동시성을 해결하는 방법

AWS TooManyRequestsException 트러블슈팅 관련 공식문서 

 

- 예약된 동시성을 통해 동시성 개수 늘리기

예약된 동시성을 통해 한 함수가 동시성을 예약하면 다른 함수가 해당 동시성을 사용할 수 없게 된다.

그래서 람다함수에 대한 최대 동시 인스턴스 수를 보장해준다. 

-  Limit Increase 요청

하지만 어쩔 수 없이 최대동시성 수를 넘어갈 경우, AWS에 동시실행 수 늘려달라고 서비스할당량 증가요청

 

 

참고

https://velog.io/@rssungjae/후기마이크로서비스-아키텍처MSA

 

(후기)마이크로서비스 아키텍처(MSA)강연_AWS

마이크로서비스 아키텍처(MSA) AWS 기반 마이크로서비스 아키텍처 패턴 AWS 기반 마이크로서비스 아키텍처 모범 사례

velog.io

https://velog.io/@mynameisjwlee/AWS-Lambda

 

AWS Lambda

AWS Lambda에 대해...

velog.io

https://serverless-stack.com/chapters/ko/what-is-aws-lambda.html

 

What is AWS Lambda?

AWS Lambda는 Amazon Web Services에서 제공하는 서버가없는 컴퓨팅 서비스입니다. 이벤트 (예 - HTTP 요청)에 응답하도록 요구되는 상태를 저장하지 않는 컨테이너에서 코드 조각 (람다 함수라고 함)을 실

serverless-stack.com

 

728x90
반응형