우선 배치시스템 전체적인 구조를 보자.
GitHub - luckkids/luckkids-batch-server: 럭키즈 배치 서버 👨🏻💻🍀
럭키즈 배치 서버 👨🏻💻🍀. Contribute to luckkids/luckkids-batch-server development by creating an account on GitHub.
github.com
Batch와 Scheduler의 차이
배치(Batch)는 논리적 또는 물리적으로 관련된 데이터를 그룹화하여 일괄 처리하는 방법을 의미한다. 스케줄러(Scheduler)는 주어진 작업을 미리 정의된 시간에 실행할 수 있게 해주는 도구나 소프트웨어를 의미한다. 여기서 주의할 점은 배치는 대량의 데이터를 일괄적으로 처리할 뿐, 특정 주기마다 자동으로 돌아가는 스케줄링과는 관련이 없다.
이 내용을 리마인드 하고 애매하지만 배치 시스템으로 칭하고 들어가려고 한다.
왜 AWS Lambda??
장황하게(?) 설명하면 너무 길어질 것 같아 간단하게 정리하면 다음과 같다:
- Spring Batch 사용 시의 부담: Spring Batch는 WAS 서버가 필요하며, 지금의 경우 t4g.small 인스턴스를 사용하고 있다. Lambda를 사용함으로써 서버 부하를 최소화하고 비용적인 이점을 얻을 수 있다.
- Airflow?: 배치 처리 작업을 위해 Airflow라는 도구를 들어본적이 있다. 하지만 Airflow를 사용하려면 추가적인 EC2 인스턴스가 필요하며, 이는 추가 비용 부담을 의미한다. 또한, Airflow를 효과적으로 사용하기 위해서는 학습 시간이 필요하다.
- AWS Lambda의 유연성 및 비용 효율성: AWS Lambda는 Python을 포함한 여러 프로그래밍 언어를 지원하며, 프리티어 기간 동안은 비용 부담 없이 거의 무료로 사용할 수 있다. 이는 초기 비용 부담을 크게 줄여주며, 특히 작은 규모의 프로젝트나 비용을 절약하고자 하는 경우에 유리하다.
RDS와 Lambda 구성
우선 기본적으로 Lambda 함수와 RDS가 이미 생성되어 있다고 가정하고 설명을 진행할 것이다.
Lambda 함수 구성
- 런타임: Python 3.12
- 메모리: 256MB
- 임시 스토리지: 512MB
RDS 구성 (프리티어)
- 클래스: db.t4g.micro
- 엔진: MariaDB (10.11.6)
Lambda - RDS 데이터베이스 연결
생성하고 나면 `구성 > VPC`를 들어가게 되면 RDS와 같은 VPC와 같은 구성들이 되어있을 것이다.
RDS - 연결된 컴퓨팅 리소스
[참고]
![](https://blog.kakaocdn.net/dn/HDASD/btsE93319vm/nOFuFB8L0NQL0a6Tg3SAx1/img.png)
위에 교차 AZ 요금이 적용될 수 있다고 경고도 떴고 연결된 컴퓨팅 리소스에서도 다중 AZ라고 나와있는데 이걸 해결하는 방법은 `Lambda > 함수 > 구성 > VPC`에 가서 서브넷을 RDS와 같이 하나로 바꾸면 된다.
![](https://blog.kakaocdn.net/dn/cnThoe/btsFbfQuDie/GlObyinvkAQYtitFOHuAA1/img.png)
[해결]
![](https://blog.kakaocdn.net/dn/oV2Ob/btsFbTGtsez/oVPkvT3SkaFFTDaNan3Oa0/img.png)
Lambda가 DB를 연결하지 못함
구성을 마치고 함수 테스트를 돌려봤는데 제한 시간 timeout이 난다.
- 원인을 파악하기 위해 인바운드 가장 유력한 RDS 인바운드 규칙을 `0.0.0.0/0` 으로 수정해 보기로 했다.
- 인바운드 규칙을 모든 IP로 열어두니 10초 만에 테스트가 통과했고 잘 작동한 것까지 확인했다.
우선 `0.0.0.0/0`으로 IP 전체를 열어두는 건 마음이 불편해서 다시 이 규칙은 제거하고 Lambda가 RDS에 연결할 수 있게 해야 한다.
- 같은 VPC내에 있음
- 서로 연결이 잘 되어 있음 = 인바운드 아웃바운드 규칙이 자동으로 연결됨 (이게 문제(?))
- AWSLambdaVPCAccessExecutionRole 권한도 잘 가지고 있음
++ 추가로 RDS와 Lambda가 연결되어 있는 상태에 RDS 인바운드 규칙을 ` 0.0.0.0/0`으로 열었을 때는 또 DB연결이 안 돼서 람다 테스트가 실패한다.
++ 참고해 볼 만한 공식문서: https://repost.aws/ko/knowledge-center/connect-lambda-to-an-rds-instance
언제나 잘못된 설명이나 부족한 부분에 대한 피드백은 환영입니다🤍