본문 바로가기

aws

aws lambda는 서버를 대신하지 않아

내 주변에 람다신봉자가 있다. 

 

ec2에 서버를 올리면 관리는 어떻게 하며, 트래픽과 확장까지 람다가 다 관리해주지 않느냐며, 서버 아키텍쳐를 람다로 만들어놨다. 

 

결국 람다신봉자는 서버를 하지 않는다. (...그럼 왜..이렇게 하고 갔나요??)

 

람다를 프로젝트에 사용하면서 문제점을 몇가지 써 보려 한다. 

 

1. 람다의 용량이 간당간당하다.

현재 서버 프레임워크는 django이며, 서비스의 특성상 많은 통계 패키지를 사용한다. (numpy, scipy, scikit-learn 등등...)

패키지 배포에 50MB라는 한도가 있지만 /tmp 꼼수와 람다의 다른 계층의 용량을 포함하면 250MB까지 올릴수 있다. 

 

"250MB이면 많은거 아냐? "라고  생각하시는 분은....위의 패키지를 로컬에 설치해 보시길 바란다. 

정말 용량이 간단간당하다. 또한 연구팀에서 배포한 모듈이 너무 커서 직접 배포 버전(다이어트 버전)을 만들기 까지 했다. 

용량이 큰 서비스는 그냥 서버(ec2, 혹은 fargate)를 통해서 하시길. 

 

- 위의 람다신봉자는 자신의 코드가 람다에 못올라간다고 fargate쓴다. 

 

2.  DB connection 문제

람다는 하나의 요청에 하나의 람다가 응답하는 구조이다. 

그러면 해당 요청에 RDS를 써야 한다면, 람다 하나당 커넥션 하나를 물고 있는게 된다. 

aws RDS에서 커넥션풀 == 돈이다. RDS 비싼거 쓸수록 커넥션풀이 늘어난다. 

해결!! 이면 좋겠지만, 돈이 없는걸? RDS도 가장 싼걸 쓰고 있다.

람다에서 바깥계층에 커넥션 풀을 둬서 커넥션을 계속 이용하는 방법도 있지만,  ( https://www.slideshare.net/awskorea/aws-lambda-aws-aws-summit-seoul-2019 )

서비스가 django에 zappa로 람다로 올리는 형식이다.  ==  바깥 계층을 사용을 못한다.

결국 람다 요청이 동시에 많은 요청이 오면 람다가 실행하다가 django에서 커넥션 에러를 뱉고 죽는다.

( 테스트 결과 200개 정도 동시 요청하면 사망 )

디비를 사용하면서 요청이 많은 서비스라면 람다를 쓰는것은 재고해보자

 

 

3. 스레딩 문제

메일을 보내는 로직이 필요했다. 문제는 메일을 보내는데 대략 8초 정도의 딜레이가 생긴다. (메일서버연동시)

사용자가 10초 동안이나 멈춘 화면을 볼수는 없기에 리턴값을 바로 주기 위해서 비동기식이 필요했고 

비동기식으로 처리하기 위해서 스레딩을 사용했었다. 

 

(왜 async를 사용하지 안했나고 물어보신다면, async를 사용하려면 내부까지 모두 비동기함수로 채워져야 한다. 

만일 block I/O 함수를 사용하면 비동기를 사용하나 마나 동기식으로 작동한다. django send_mail은 동기 함수이다.)

 

로컬에서 잘 돌아가길래 문제 없겠지~~~했는데 역시나...

메일이 갔다, 안갔다를 반복하면서도 에러가 없어서 이상하다 했는데

람다에서의 리턴은  람다가 cold 상태가 되므로 스레딩도 사라진다!!!!!!!!!!!!!

람다에서 스레딩을 사용할 경우 잘 생각해보자, 리턴하면 스레딩도 사라진다

 

 

 

aws lambda는 서버를 대신하지 않아

 

람다에 서버리스라는 말이 붙어서 많은 사람들이 기존의 서버를 대신하는 서비스 정도로 생각하고 있다. 

(ex : 함수 하나만 만들면 서버를 대신한다고?! 좋은데?!)

 

하지만 정확하게는 서비스간의 api 통신을 위해서 만들어 진게 lambda 이다. ( aws에서 서비스간의 통신을 위해서 만든 서비스라고 했다. )

 

단지 api 통신이 가능하기 때문에 서버로 사용가능 한 것일 뿐 본질은 아니다.

 

람다의 많은 예제들이 이미지 리사이즈, cron에 따른 배치 잡, 간단한 백그라운드 처리 인 이유는 위의 상황들을 겪어 보면 알게 된다. 

 

"아!! 서버로 사용하면 큰일나는구나.."

 

람다는 좋은 물건이다. 의도에 맞게 잘  사용한다면, 

 

 

추가

2019.08.22.  드디어 람다 신봉자도 람다는 api 서버와는 맞지 않다고 말했다!! 만세!!!

2019.10.02.  람다에 올리는 용량이 커질수록 웜업이 정상작동 하지 않을 수 있다 . 해당 소스를 s3에서 가져오는 과정에서 타임아웃이 나는데 타임아웃 리미트가 30초라 의외로 자주 나는 현상이라 한다. ( 해당 상황은 몇년 전부터 문제가 되어 왔다고 한다. 해결 방법은 용량을 줄이는것뿐....) 한마디로 가끔씩 람다가 500 타임아웃 에러를 뱉는다면 용량을 줄이든지, ec2나 fargate를 써야 한다.

 

'aws' 카테고리의 다른 글

RDS -> s3 백업  (0) 2021.06.30
ec2 python3 설치  (0) 2021.03.10
route53 s3 no targets available  (0) 2018.08.11
aws s3 권한 설정  (0) 2018.08.10
aws cloudWatch 알림 설정  (0) 2018.08.09