본문 바로가기
개발/AWS

AWS Lambda와 RDS connection 관리 삽질

by 문둘기 2020. 6. 6.

이글은 대부분이 링크로 되어있는, 삽질의 흐름을 작성한 글 입니다.

Lambda + DynamoDB만 사용하다가, Lambda + RDS를 사용해보니
말로만 듣던 둘의 궁합이 별로 안좋다는것을 몸소 느끼게 되었다.
DynamoDB와 다르게 RDS는 커넥션관리를 잘해줘야한다.

터지기 시작하는 에러

RDS(mysql)를 새로 도입한뒤 Lambda와 RDS를 연결하고 insert 테스트를 했는데
몇분지나지않아서 바로 에러가 터지기 시작했다.
에러내용은 too many connections 으로, max connection 이 가득 찼다는소리다

show variables like 'max_connections'

이 쿼리를 입력하면 RDS의 max_connections이 몇인지 알수있다

사용중인 RDS는 테스트용이라서 가장 싼것을 쓰고있었기때문에 max_connections가 64로 되어있었다.

터지는중.jpg

단순하게 저 max_connections 값만 올리면 해결될까? 당연히 터질것이다
RDS 성능은 그대로인데 억지로 숫자만 늘린거니까..

그럼 RDS scale-up 하면 해결될까?? 잠깐은 해결된다.
하지만 그건 그냥 돈으로 때우는 임시방편일뿐이지 근본적인 해결이 아니다

삽질 + 찾아본 내용들

예전에 (DynamoDB만 쓰던시절) 나랑상관없겠지 싶어 대충 흘려봤던 영상이 떠올라서 다시찾아봤다

29:55 쯤 부터 connection 관련 내용이나온다

이런식으로 그나마 간단하게, 커넥션풀생성을 글로벌섹션에 빼서 커넥션 재활용 할수있다고한다.

하지만 결국 근본적으로 람다와 RDS는 잘 안맞는다는,, 결론이다 (?)

이 영상에서도 관련 내용이 나온다.

RDS는 DynamoDB처럼 한번 통신하고 끝나는 DB가 아니고 , 연결형 데이터베이스이기때문에
Lambda로 직접적으로 커넥션을맺게하면 connection leak 문제가생긴다. 때문에

connection 관리용 EC2를 중간에 두었다고한다 .
(나중에 ElasticSearch를 도입후 connection관리용 EC2 제거 했다고한다)

특히 이 글은 내마음을 다 대변해주는듯한, 공감가는 내용이 써있어서 속이 후련했다. ㅋㅋ

어쨌든 이런 불편함때문에, 최근에 AWS에서 RDS Proxy 라는 서비스를 만들었다. 얼마전에 서울리전에도 나오게되었다.

We currently support Amazon RDS MySQL or Aurora MySQL, running on MySQL versions 5.6 or 5.7

찾아보니 아쉽게도 내가 사용중인 mysql 8.0은 아직 지원하지않는다

그리고 아직 미리보기 상태라서 프로덕션 DB에는 사용하지말라고 경고한다. 빨리 정식출시되면좋겠다.

그래서 현재사용중인 방법은 ?

현재 임시방편으로 사용중인방법은 이렇다.
람다 코드에

context.callbackWaitsForEmptyEventLoop = false

이코드를 넣는다. default는 true 인데, 직접 false로 설정해주는것이다

람다 node 는 기본적으로 callback, return이 실행되어도 바로 종료되지않는다,
이벤트루프에 아직 작업이 끝나지않았다면 람다 타임아웃될때까지 계속 실행되고있는다.

결국 람다는 기본적으로 커넥션한번하면 RDS의 커넥션 시간이 끝나거나 람다 타임아웃될때까지
계속 커넥션하나를 잡아먹은채로 실행중인 상태가 되는것이다

그것을 기다리지않고 callback 이나 return이 된순간 바로 람다를 중단하려면 false로 설정해주면 된다.
그리고 DB 커넥션시간도 짧게 잡아놨다..
이렇게해서 일단 임시로 커넥션을 관리하고있는상황..ㅜㅜ

더좋은방법이 있다면 댓글로 가르침을 부탁드립니다

참고: 공식문서에서 callbackWaitsForEmptyEventLoop는 아래와 같이 나와있다.

Node.js 이벤트 루프가 빌 때까지 대기하는 대신, 콜백이 실행될 때 즉시 응답을 보내려면 false로 설정합니다. 이것이 false인 경우, 대기 중인 이벤트는 다음 번 호출 중에 계속 실행됩니다.

 

참고한글

https://aws.amazon.com/ko/premiumsupport/knowledge-center/lambda-rds-connection-timeouts/
https://aws.amazon.com/ko/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/
https://medium.com/harrythegreat/aws-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4%EB%A5%BC-%EC%9C%84%ED%95%9C-rds-proxy%EC%84%9C%EB%B9%84%EC%8A%A4-fb5815b83cce
https://aws.amazon.com/ko/blogs/korea/amazon-rds-proxy-now-generally-available/

2020/6/29 Update

드디어 정식출시되었습니다만 제가사용중인 mysql 8.0 은 아직 미지원이네요!