AWS Elastic Beanstalk 에서 Mongodb Atlas 호출 시 Timeout 발생하는 문제 (with VPC Peering)
# 개요
- AWS의 Elastic Beanstalk (이하 EB)를 Mongodb Atlas와 VPC Peering으로 연결 후 호출하는 Backend 구조를 잡음
- EB에서는 두 대의 EC2 서버를 운영
- 그러나 DB 호출 시 한 번은 정상 호출, 두 번째는 Timeout 발생
# 결론
- 원인은 못 찾고 VPC Peering을 삭제하고 다시 연결하니 정상 동작
# 추론한 방법
테스트 1: IP Access List에 추가
- 가장 먼저 의심했던 내용은 IP 제약
- Mongodb Atlas에 IP Access List를 추가하는 부분이 있음
- Whitelist로 등록한 IP만 통신이 됨
- IP에 모든 IP를 다 넣어봄. VPC 대역, 서브넷 대역, EC2의 Private IP, Public IP
- 최종으로 모든 IP를 허용하는 0.0.0.0/0 을 넣어도 안 됨
- 결론: IP 문제는 아님
테스트 2: 문제있는 서버 중지 후 테스트
- 특정 서브넷 대역의 EC2에서 커넥션 Timeout이 발생하는 것을 서버 로그에서 발견함
- 한 번은 되고 한 번은 Timeout 걸리는 이유가 EB에 로드 밸런서가 라운드 로빈을 돌며 한 번은 이 서버, 한 번은 저 서버 이런 식으로 EC2 두 대를 번갈아 호출함
- 이 때 문제있는 서버에서 Timeout이 걸리니 한 번은 호출되고 한 번은 안되는게 반복됨
- 문제있는 서버를 중지함
- EB 에서는 Auto-Scaling 때문에 중지 시 자동으로 새로운 서버가 올라옴
- 그러나 해당 서브넷에 새롭게 올라온 서버도 동일한 Timeout 에러 발생함
- 결론: 서버 문제는 아님
테스트 3: VPC Peering을 제거 후 테스트
- EB와 Mongodb를 연결하는 VPC Peering을 제거 후 다시 연결함
- 문제없이 잘 호출됨
- 결론: VPC Peering의 연결 문제
# 대안
- 명확한 원인을 찾지 못하고 설정상의 문제라고 결론 지어서 애매함
- 대안 1: Mongodb Atlas의 Private Endpoint로 VPC Peering을 대체
- 대안 2: PaaS인 Mongodb Atlas를 안 쓰고 EC2에 직접 Mongodb 구축
- 대안 3: AWS에서 서비스하는 Nosql(dynamo db, document db) 사용
- 대안 4: VPC Peering 사용 안 하고 Public 망으로 DB 통신