문제 상황
- RDS 퍼블릭 액세스를 차단하고 난 뒤, EC2에서 DB 접속에 문제가 발생함
- docker-compose와 ci-cd 로직 및 rds와 ec2의 보안그룹 문제라고 판단함.
1. RDS 생성
→ 생성 시 퍼블릭 액세스 차단으로! (퍼블릭 IP로 인한 Virtual IP 비용 청구됨)
→ Postgresql DB를 활용할 예정이므로, psql을 기준으로 설명하겠음.
2. RDS와 EC2의 네트워크 환경 확인
- AWS 콘솔 → EC2 → 해당 인스턴스 선택 → 네트워크 인터페이스 확인
- AWS 콘솔 → RDS → 해당 DB 인스턴스 선택 → VPC 및 서브넷 정보 확인
- EC2와 RDS가 같은 VPC 및 서브넷에 있는지 확인
3. EC2 와 RDS 간의 보안 그룹 설정
퍼블릭 액세스를 차단한 경우, EC2에서만 접근 가능하도록 RDS 보안 그룹을 설정해야 한다.
🔹 RDS의 보안 그룹 (Inbound Rule) 설정
- AWS 콘솔 → RDS → 보안 그룹 설정 이동
- 인바운드 규칙 추가
- Type: PostgreSQL(5432) 또는 MySQL(3306)
- Protocol: TCP
- Port Range: 5432 (PostgreSQL) 또는 3306 (MySQL)
- Source: EC2의 보안 그룹 선택
📌 RDS가 EC2 인스턴스와 통신할 수 있도록 RDS 보안 그룹에서 EC2의 사설 IP 또는 **VPC 내부에서의 접근 (보안그룹)**을 허용해야 한다.
✅ 0.0.0.0/0 (퍼블릭) 허용 X
🔹 EC2의 보안 그룹 설정 (Outbound Rule)
- AWS 콘솔 → EC2 → 해당 인스턴스의 보안 그룹 설정 이동
- 아웃바운드 규칙 추가
- Type: All traffic
- Protocol: ALL
- Destination: RDS의 보안 그룹 선택
✅ EC2가 RDS로 나가는 요청을 허용해야 함
4. EC2 내에서 DB에 접속해야 할 db-cli 설치
sudo apt install -y postgresql-client
psql 테스트
psql -h <RDS-PRIVATE-ENDPOINT> -p 5432 -U <DB_USER> -d <DB_NAME>
5. Spring application.yml 설정
🔹 올바른 RDS 엔드포인트 사용 (프라이빗 엔드포인트)
퍼블릭 액세스를 차단했으므로 프라이빗 엔드포인트를 사용해야 함.
spring:
datasource:
url: jdbc:postgresql://<RDS-PRIVATE-ENDPOINT>:5432/<DB_NAME>
username: <DB_USER>
password: <DB_PASSWORD>
driver-class-name: org.postgresql.Driver
📌 MySQL을 사용할 경우
spring:
datasource:
url: jdbc:mysql://<RDS-PRIVATE-ENDPOINT>:3306/<DB_NAME>?serverTimezone=UTC
username: <DB_USER>
password: <DB_PASSWORD>
driver-class-name: com.mysql.cj.jdbc.Driver
<RDS-PRIVATE-ENDPOINT> 는 RDS 콘솔에서 확인 가능
추가
- docker-compose.yml에 환경변수가 들어가지 않는 문제 발생
- 따라서 ci-cd.yml 파일 수정
(.env 파일 안에 환경변수들을 추가하면 docker가 알아서 컨테이너 환경변수에 추가)
- 또한, yml 파일을 환경변수로 쓰기 위해 docker-compose.yml에서 환경변수 삽입 영역을 삭제
참고
https://velog.io/@tlsdmsgp33/AWS-RDS-퍼블릭-액세스-허용안할-시-스프링부트-yml-설정-방법SSH-터널링-AWS-과금-문제
[AWS RDS] 퍼블릭 액세스 허용안할 시 스프링부트 yml 설정 방법(SSH 터널링) , AWS 과금 문제
정말 이 부분때문에 고생했습니다..저처럼 헤매는 분들이 없기를 바라며 글을 작성했습니다!분명 프리티어 기간이 남았는데도 불구하고 프로젝트에서 사용하는 aws 계정에서 과금이 됐습니다.
velog.io
[AWS] 프리티어 RDS PostgreSQL DB생성과 연결하기 : 초보자도 쉽게 따라하기
0. 들어가기 전 프리티어는 완전한 무료가 아니며, 잘못 설정하면 과금이 발생할 수 도 있습니다.최대한 과금이 나올 요소들을 체크를 안하며 어떻게 생성하는지 초보자도 따라 할 수 있게 만들
coasis.tistory.com
https://yerim-coding.tistory.com/68
[AWS] AWS RDS 인스턴스 생성 및 연결하기(PostgreSQL)
이제 AWS 에서 제공해주는 관리형 서비스인 RDS(Relational Database Service)를 생성해 보겠습니다. ✅ RDS란? AWS에서 지원하는 클라우드기반 관계형 데이터베이스 하드웨어 프로비저닝, 데이터베이스 설
yerim-coding.tistory.com
'Infra & Cloud' 카테고리의 다른 글
[Apache Kafka] Kafka Producer의 데이터 멱등성 보장하기 (0) | 2025.03.26 |
---|---|
[Apache Kafka] kafka 파헤치기 (2) | 2025.03.25 |
[EC2] 인스턴스 HikariCP Connection 고갈 문제 (2) | 2025.01.28 |
[Nginx] 413 Request Entity Too Large 오류 (3) | 2024.11.27 |