Cloud Is My Life
[26WKRD2] SQS와 Lambda를 통해 서버리스하게 MySQL 사용하기 본문

개요
SQS와 Lambda를 활용하면 별도의 서버를 운영하지 않고도 MySQL과 안정적으로 연동되는 비동기 처리 아키텍처를 구현할 수 있습니다. 애플리케이션은 요청을 즉시 처리하는 대신 메시지를 SQS에 적재하고, Lambda가 이를 순차적으로 가져와 MySQL에 반영함으로써 트래픽 급증 상황에서도 유연하게 대응할 수 있습니다. 이 구조는 서비스와 데이터베이스 사이에 완충 지점을 두기 때문에, 장애 전파를 줄이고 처리 안정성을 높이는 데 특히 유리합니다.
이 글에서는 SQS와 Lambda를 조합해 서버리스 환경에서 MySQL을 사용하는 기본 흐름을 소개하고, 왜 이 방식이 확장성, 비용 효율성, 운영 편의성 측면에서 의미가 있는지 살펴봅니다. 또한 메시지 중복 처리, Lambda 동시성 제어, 데이터베이스 커넥션 관리처럼 실제 구성 시 반드시 고려해야 할 핵심 포인트도 함께 정리해, 실무에 바로 적용할 수 있는 관점으로 풀어낼 예정입니다.
0. 사전 준비
실습 시 <이 레포>를 사용하니 클론받아 준비해두기 바랍니다.
사전 준비 단계에서는 이후 사용할 VPC와 SG 등을 생성합니다.
먼저, VPC를 구성해봅시다. 필자는 아래와 같이 구성하였습니다.

이후, 보안 그룹을 구성합니다. 필자는 아래와 같이 구성하였습니다.
1. lambda-sg; Deny inbound, Allow outbound to 0.0.0.0/0 from any.
2. db-sg; Allow inbound from lambda-sg to port 3306, Allow outbound to 0.0.0.0/0 from any.
마지막으로, Lambda에서 사용할 Role을 생성하도록 하겠습니다.

그리고, 권한 추가 -> 인라인 정책 추가를 선택합니다. 아래 접은글 내의 정책을 참고합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": "rds-db:connect",
"Resource": "arn:aws:rds-db:ap-northeast-2:156041424727:*"
}
]
}
위와 같은 정책을 가진 람다 역할을 생성합니다.
1. Database 구성
먼저, RDS가 배치될 서브넷의 집합인 서브넷 그룹과 DB 옵션의 집합인 파라미터 그룹을 생성합니다.
필자는 아래와 같이 Private subnet only 서브넷 그룹과 파라미터 그룹을 생성하였습니다.


이제, RDS를 생성해봅시다. 필자는 MySQL과 다중 AZ DB 인스턴스 배포 기법을 선택하였습니다.

엔진 버전은 Parameter Group의 버전인 8.4 시리즈의 Latest를 선택하였습니다.
이후, 인스턴스 이름, 사용자 이름을 선택하고, Secrets Manager 기반의 암호 관리 기법을 선택합니다.

이후, 인스턴스는 필자의 경우 db.t3.medium을 선택하였습니다.

스토리지는 20GiB를 할당하였고, 앞서 생성한 VPC와 SubnetGroup을 선택하였으며, 외부에서의 접속을 차단하고자 퍼블릭 액세스를 차단하였습니다.

보안 그룹은 DB SG, RDS 프록시도 생성하도록 합니다.

모니터링의 경우, 적당히 입맛에 따라 설정합니다.

앞서 생성한 Parameter Group을 선택하고, 초기 데이터베이스 이름은 shop으로 지정합니다.

이제, 생성합니다.
생성까지 시간이 걸리므로 이후 단계를 밟다가 다시 돌아오는 것을 권장합니다.
2. Lambda Setup
이제, 서비스를 구동하기 위한 Lambda를 셋업해봅시다.
먼저, PyMySQL를 설치하여야 하는데, Lambda 특성 상 Layer로 올려야 하므로 참고 문서 1을 참고하여 생성하도록 합시다.
생성을 완료했다면, Lambda 함수를 생성해봅시다.
새로 작성을 선택하고, 함수의 이름을 작성하고, Python 3.14를 선택합니다. 아키텍처는 x86_64를 선택하도록 합니다.
그리고 기본 실행 역할은 0번에서 생성한 Lambda Role을 선택합니다.

Lambda가 Private하게 RDS에 연결해야 하므로 VPC에 연결을 선택하고, Private subnet에 lambda-sg를 가진 채로 생성되게 합니다.

자, 이제 생성합니다.
그 후, 참고 문서 1의 절차를 따라 레이어를 함수와 연결합니다.
이제, 람다의 기본 lambda_handler.py를 삭제하고 앞서 클론받은 레포의 app/{db, lambda_function}.py를 업로드, 배포합니다.
다음으로 람다의 구성 -> 환경 변수 탭으로 들어가 아래와 같이 환경 변수를 세팅합니다.
단, Key 값 조합들은 반드시 여러분들의 App 구성에 맞게 구성하시기 바랍니다.

이제 마지막입니다. Lambda -> 함수 선택 -> 구성 -> RDS 데이터베이스로 들어가 아래와 같이 뜨는지 확인합니다.

만약 뜨지 않는다면 아래와 같이 선택해서 생성합니다. 그리고 생성했는지 여부와 무관하게 Add proxy로 프록시도 다시 한번 추가합니다.
만약 Proxy 추가 시 오류가 발생한다면, 다시 시도합니다.


이제, 테스트해봅시다.
클론받은 Repo의 batch_orders.json을 테스트 json으로 하는 테스트를 아래와 같이 생성합니다.

그리고 테스트합니다.

잘 되네요 Yarr~
3. SQS 구성하고 연동하기
이제, Lambda가 처리해야 하는 작업들을 담을 Queue를 생성해봅시다. Queue는 AWS Managed 서비스인 SQS를 사용합니다.
아래 설정값들은 모두 필자가 임의로 설정한 값들이오니 실제 구성 시에는 여러분의 값으로 채워야 함에 유의합니다.
먼저, DLQ를 생성합니다.

DLQ의 경우, 이 외의 모든 값은 기본값으로 생성했습니다.
이제, 메인 Queue를 생성해보겠습니다.
큐 유형을 선택하고, 이름을 설정합니다.

구성의 경우, 다양한 값들을 설정할 수 있으나, 필자는 기본 값으로 두었습니다. 여러분들이 구성 시에는 해당 값을 적절히 입맛에 맞게 설정하시기 바랍니다.

암호화도 적절히 설정하고,

액세스 정책은 잘 설정합니다. 필자는 기본값으로 두었으나, 여러분 조직의 조건에 맞게 잘 설정하시면 될 것 같습니다.

리드라이브 정책의 경우, DLQ에 해당되는 사항이기에 설정하지 않습니다.
그 후, 배달 못한 편지 대기열을 앞서 생성한 DLQ로 정의합니다.

이제 생성합시다.

잘 생성되었네요.
이제 sqsql-queue -> Lambda 트리거 -> Lambda 함수 트리거 구성으로 이동합니다.
아래와 같이 잘 세팅하고 저장합니다.

다시 Lambda로 돌아와 확인해보면, 아래와 같이 SQS가 잘 달려있는 것을 볼 수 있습니다.

4. 테스트 및 검증
이제, SQS에 데이터를 적재하고, 제대로 처리되는지 확인해봅시다.
앞서 클론받은 Repo의 test/test_sqs.py를 실행합니다.


위와 같이 Queue에 정상적으로 메세지가 적재된 것을 알 수 있습니다. 수신된 메세지가 4로 뜨는 이유는 제가 실수로 명령어를 2번 실행했기 때문이니 참고하세요 ㅎㅎ.

Lambda 함수의 CloudWatch Metrics에도 정상적으로 호출 수 메트릭이 쌓인 모습을 볼 수 있습니다.

매우 잘 들어가고 있는 모습을 볼 수 있습니다.
실제로 DB를 직접 조회해봐도 매우 잘 들어가는 모습을 볼 수 있습니다.


마치며
SQS와 Lambda, 그리고 MySQL을 조합한 이번 구조는 단순히 "서버를 덜 운영한다"는 수준을 넘어, 트래픽 변동에 유연하게 대응하고 장애 전파를 완화하는 실용적인 서버리스 아키텍처라는 점에서 의미가 있습니다. 특히 서비스와 데이터베이스 사이에 큐를 두는 방식은 처리량을 평준화하고, 시스템 전체의 안정성을 높이는 데 큰 도움이 됩니다. 작은 규모의 실습 환경에서도 충분히 효과를 확인할 수 있지만, 실제 운영 환경에서는 더욱 큰 가치를 발휘할 수 있습니다.
다만 실무에서는 단순 연결만으로 끝나지 않고, 메시지 중복 처리 방지, Lambda 동시성 조절, RDS Proxy와 커넥션 관리, DLQ 운영 전략처럼 세밀하게 챙겨야 할 요소들이 많습니다. 이번 글이 서버리스 환경에서 데이터베이스 연동 구조를 설계할 때 기본적인 출발점이 되었기를 바라며, 이후에는 FIFO 큐, 재처리 전략, 모니터링 고도화까지 함께 확장해보시면 더욱 견고한 아키텍처를 구성하실 수 있을 것입니다.
참고 문서
[1] Lambda에 패키지 추가하는 법 - Lambda Layer - https://ninejuan.tistory.com/entry/26WKRD2-Lambda%EC%97%90-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94-%EB%B2%95-Lambda-Layer
