[AWS] 서버리스를 위한 RDS Proxy서비스

Harry The Great
해리의 유목코딩
7 min readDec 28, 2019

RDS Proxy 2019년 12월 3일에 발표된 신규 AWS 서비스입니다. RDS Proxy란 관계형 데이터베이스에서 커넥션(Connection) 연결을 효율적으로 관리해주는 서비스입니다. 일반적으로 AWS Lambda 서비스를 사용한다면 DynamoDB와 같은 API 기반의 데이터베이스를 많이 사용할 수밖에 없습니다.

람다에서의 커넥션문제

서버리스 컴퓨팅에서 유휴 상태로 대기하다 프로비저닝 되며 호출되는 것을 콜드 스타트(Cold Start) 이미 프로비저닝이 되어있는 상태에서 다시 호출되는 것을 웜스 타트(Warm Start)라고 합니다. 윔스타트 상태에서는 연결된 커넥션을 공유할 수 있지만 더 많은 컴퓨팅이 프로비저닝 되며 콜드 스타트를 하거나 프로비저닝 된 윔상태의 람다가 일정 시간 이상 호출받지 못하여 다시 유휴 상태(콜드)로 돌아갔다가 호출되면 다시 새로운 커넥션을 잡아먹게 됩니다.

이런 이유로 람다는 일반 모노폴리(Monopoly) 아키텍처에 비해서 상당히 많은 수의 커넥션이 필요하게 되고 RDS의 퍼포먼스가 프로비저닝 된 성능의 10%만 사용하더라도 커넥션수가 부족하게 되면 계속해서 RDS를 스케일 업해야 합니다. 점점 성능을 위해서 RDS를 스케일 업하는 건지… 아니면 더 많은 커넥션을 위한 갈망으로 스케일 업하는 건지 혼동이 오게 됩니다.

물론 람다에서 커넥션을 효율적으로 관리해줄 수 있습니다. 예를 들어 람다 함수가 종료되는 콜백 이전에 connection을 바로바로 끊어준다거나 혹은 아이에 커넥션 타임아웃을 매우 짧게 잡아두고 호출하는 방법이 있지만 매번 커넥션을 새로 생성하는 경우의 부하와 지연시간뿐 아니라 동시에 호출되는 람다 중간에 커넥션이 끊기게 되면 람다에서 에러가 발생하게 됩니다.

RDS Proxy의 장점

RDS Proxy는 직접 커넥션을 관리해주기 때문에 RDS에 커넥션으로 발생하는 CPU와 메모리의 오버헤드를 줄여주고 더 많은 커넥션을 사용할 수 있도록 디자인되었습니다.

각각의 프록시는 서로 독립적으로 작동할 뿐만 아니라 프록시 내의 커넥션들이 재활용되기 때문에 개발자가 직접 람다에서 커넥션 숫자에 대한 부분을 신경 쓰지 않아도 되며 많은 커넥션을 생성할 수 있습니다.

라고 Doc에는 적혀있지만… Preview 단계이고 실제 프로덕션에 사용해보지않은이상 당한게 많아 믿을수는 없습니다…

2019년 12월 29일 현재 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(오레곤), EU 서부(아일랜드) 및 아시아 태평양(도쿄) 리전에서만 사용이 가능하며 Mysql, Aurora MySQL에 평가한(Preview)로 출시되어있습니다. 아래 예제에서는 도쿄리전을 중심으로 진행하였습니다.

AWS Secret Manager 세팅하기

RDS Proxy는 AWS Secret Manager를 통한 연결을 강제하고 있기 때문에 Secret Manager에 대한 설정을 먼저 해주어야 합니다.

AWS Secret Manager란?

AWS 서비스에 접근할 수 있는 보안암호를 쉽게 관리해줄 수 있도록 도와주는 서비스입니다. 특히 Lambda에서 비밀번호를 하드 코딩하여 넣는 것은 매우 위험하기 때문에 일반적으로 환경 변숫값을 이용하게 됩니다. Secret Manager는 AWS 서비스 접근에 대한 환경 변숫값을 서비스나 리전 단위에 상관없이 한 곳에서 관리할 수 있도록 도와주는 서비스입니다.

콘솔로 이동하기

콘솔에서 AWS Secret Manager로 이동합니다.

[새 보안 암호 저장]을 클릭합니다.

RDS 데이터베이스에 대한 자격 증명]을 선택합니다.

사용할 사용자 이름과 암호를 입력합니다. 다음으로 접속에 사용될 RDS를 선택한 후 하단[다음]을 클릭합니다.

이전에 단계에서 입력한 사용자 암호와 비밀번호가 RDS 접속을 위한 값이었다면 이번에 입력하는 보안 암호 이름은 Secret Manager 리소스를 구분하기 위한 이름입니다. 예를 들어 serverless.js를 사용하여 람다를 구축한다면 환경 변숫값을 위해 아래와 같이 사용할 수 있습니다.

custom:
supersecret: ${ssm:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager~true}

테스트를 위한 진행이기 때문에 자동교체를 비활성화한 후 완료합니다.

RDS Proxy 생성하기

도쿄 리전의 RDS에서 Proxies로 이동합니다.

[프록시 생성]을 클릭합니다.

클라이언트단에서 직접 연결을 제어하던 것과 달리 원하는 유휴 제한시간을 설정해줄 수 있습니다.

연결 풀 최대 연결 / 연결 차용 제한시간

만약 RDS의 최대 연결 개수가 100개이고 연결 풀 최대 연결에 100을 입력했다면 백분율 100%이기 때문에 프락시는 100개의 커넥션을 사용할 수 있습니다. 이 상태에서 커넥션 100개가 모두 열려있어 연결이 부족하다면 대기시간이 연결 차용 제한시간을 넘어서는 커넥션은 Timeout 에러를 반환시킵니다. 물론 유휴연결이 존재한다면 제한 시간은 작동하지않습니다.

하단 Secret Manager 보안 암호는 조금 전 만든 보안암호를 선택하고 서브넷 설정을 마친 후 [프락시 생성]을 클릭합니다.

이제 기존의 RDS 접속 엔드포인트와 아이디/암호를 프락시에 구성되어있는 내용으로 변경합니다.

실제로 성능은?

직접 테스트를 수행한 블로깅 글을 인용하면 30명의 사용자가 300회 호출하여 동시에 9000번이 호출된 경우 프록시를 적용하지 않았을 때는 커넥션이 18 -> 124 증가했지만 프록시를 사용했을때는 18 -> 43개 증가하였습니다. 단편적인 테스트지만 프록시를 사용하는것만으로 커넥션 개수를 1/3로 줄일 수 있다면 실제 한번 도입을 검토해볼 가능성은 충분한 것 같습니다.

마치며

올 9월에 또 하나의 뉴스가 있었습니다. VPC 내부에서 호출되는 람다의 성능이 대폭 개선되었다는 것과 이번에 발표된 RDS Serverless 게다가 이번 RDS Proxy까지 발표되며 클라우드가 정말 많이 발전하는 것 같습니다. 특히 람다에서 커넥션으로 인한 RDS 사용에 아쉬움이 많았는데 정말 좋은 뉴스 같습니다.

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.