저번 포스트에서는 AWS계정을 만들고 EC2 서버를 띄워봤는데요.
이번 포스트에서는 RDS로 DB를 띄우고 Private VPC를 접속하는 것까지 해보겠습니다.
✅ 바뀐 AWS 과금 정책
우선 저번 1편에 EC2 서버를 만들어두고 잠시 프로젝트에 전념하고 있었는데요...
분명 EC2 밖에 만들지 않았고 특별히 돈이 나갈 부분이 없는데 돈이 나가고 있더라고요..?
알고 보니 AWS 과금 정책이 2024년 2월에 바뀌게 되어서 IPv4 주소를 사용하는 경우 요금이 추가적으로 부과되고 있었습니다.
그냥 EC2의 IPv4 주소를 사용하는 것은 상관없었지만, 탄력적 IP를 사용하게 되면 돈이 나가도록 바뀌었다고 하네요... 이에 따라서 탄력적 IP를 해제해야겠습니다.. 1편의 내용을 업데이트해놨기 때문에 저만 해제해놓겠습니다...
- 혹시나 해제 방법이 궁금하신 분들을 위해서.. 탄력적 IP주소를 클릭해줍니다.
- 탄력적 IP 주소 연결해제 후 IP 주소 릴리즈를 해주시면 됩니다.
✅ RDS 선행 세팅
로컬에서 프로젝트와 관련된 연습을 할 때에는 MySQL을 로컬에 띄우고 Spring 어플리케이션도 함께 돌리면서 실습을 하곤 하는데요. 프리티어로 사용하는 EC2에서 Spring 어플리케이션과 MySQL을 동시에 띄워놓고 사용하게 되면 RAM에 부담이 많이 되어서 EC2 서버가 죽어버릴 수도 있습니다.
따라서 RDS라는 관계형 데이터베이스를 제공하는 AWS 서비스를 사용함으로써 EC2의 부담을 덜어주고 DB를 더 안전하게 관리할 수 있습니다. RDS는 보안 효과를 높이기 위해서 Private VPC에 띄우도록 하겠습니다.
- 현재 순서대로 실습을 진행하셨다면 Public Subnet과 Private Subnet이 하나씩 존재하고 있습니다. 하지만, RDS를 사용하기 위해서는 DB 서브넷을 만들어야 하는데... 최소 두 개의 가용영역을 요구하기 때문에 Private 서브넷을 하나 더 만들어 보겠습니다.
- VPC 메뉴에 들어와서 서브넷을 눌러주세요
- 서브넷 생성을 눌러주세요.
- 기존에 사용하던 VPC를 선택해주세요.
- 서브넷 이름은 자유롭게 선택해주시고, 사용하지 않았던 CIDR 서브넷과 가용영역을 선택해주세요.
- VPC 메뉴에서 리소스맵을 확인해 보니 private 라우팅 테이블에 잘 연결이 되어있습니다. 혹시 그렇지 않은 분들은 1편에서 라우팅 테이블을 연결해 준 방법으로 연결해주세요..!
- 다음으로 RDS에서 사용할 보안 그룹을 미리 만들어 주겠습니다.
- 보안 그룹 생성을 눌러주세요.
- 저는 MySQL을 사용할 예정이어서 3306 포트를 열어주었습니다. 다른 DB를 사용할 계획이시라면 DB에 맞는 포트를 열어주세요!
- 이름을 자유롭게 설정하고 기존에 만들어 놓은 VPC를 선택하고 생성해줍니다.
✅ RDS 구축하기
- 이제 RDS를 만들기 위한 준비를 해보겠습니다. AWS 검색창에 RDS를 검색하고 들어가 주세요.
- DB 서브넷을 만들기 위해 서브넷 그룹에 들어가 주세요.
- DB 서브넷 그룹을 생성해주세요.
- 이름과 설명은 자유롭게 작성해주세요.
- VPC는 이전에 만들었던 VPC를 선택해줍니다.
- 가용영역은 최소 2개를 골라야 하는데 반드시 private subnet이 위치한 가용영역들을 골라주세요.
- 서브넷은 만들어놓은 private 서브넷들을 선택해주세요.
- 데이터베이스 생성을 눌러주세요
- 이번 실습에서는 MySQL로 만들어 보겠습니다.
- 템플릿은 프리티어 이름은 자유롭게 설정해주세요.
- 마스터 사용자 이름과 비밀번호를 잊어버리시면 안돼요!!
- 과금 방지를 위해서 스토리지 자동 조정을 활성화 해줍시다.
- 연결은 다음과 같이 설정하고 기존에 사용하던 VPC를 선택해주세요.
- DB 서브넷 그룹은 아까 만들었던 서브넷 그룹을 선택해주시고 퍼블릭 엑세스는 아니오를 선택해주세요.
- 보안 그룹은 기존에 만들어 놓았던 RDS용 보안그룹은 선택하고 가용 영역은 private VPC 둘 중 하나의 가용 영역을 선택해줍시다.
- 자동 백업 활성화를 체크 해제하고 생성해주세요.
✅ 로컬에서 RDS 연결하기
이제 로컬에서 RDS에 연결을 해보도록 하겠습니다.
이렇게 RDS를 생성을 했다면, 현재 상태는 외부와 접속이 불가능한 Private Subnet에 RDS를 위치시켰기 때문에 주소만으로는 외부에서 접속할 수 없는 상태입니다. 1편에서 소개한 VPC 포스트에서 이런 경우 Bation Host를 사용하거나 Session Manager를 사용할 수 있다고 소개했습니다.
정확히 말하면 Private Subnet에 있는 인스턴스에 접속을 하기 위해서는 Public Subnet에 있는 Bation Host가 필요한 것은 동일합니다. 하지만, ssh 터널링을 사용할 수도 있고 Session Manager를 사용하는 방법도 있습니다. Session Manager를 사용하는 방법이 유용하다고 들어서 이번에는 Session Manger를 사용해보겠습니다.
- EC2의 22번 인바운드는 열릴 필요가 없으나(이건 ssh 터널링에 필요함), 443번 아웃바운드는 꼭 열려있어야 합니다. 실습을 따라오셨다면 모든 아웃 바운드를 열어놨기 때문에 그대로 진행해도 무방합니다.
- 우선 IAM > 사용자에 들어와서 액세스 키를 만들어주세요.
- CLI를 선택해주세요.
- 이름은 자유롭게 설정해주세요.
- 엑세스 키를 생성했다면 잘 보관해주세요..!
- 다음으로 역할로 들어가주세요.
- 역할 생성 후 다음과 같은 설정을 해주세요.
- AmazonSSMMangedInstanceCore 권한을 추가해주세요.
- 자유롭게 이름을 설정해주시고 생성해주세요.
- 다음으로 기존에 만들어 놓은 EC2로 들어가서 IAM 역할을 수정해주겠습니다.
- 참고로 EC2에 SSM agent가 설치가 되어 있어야 합니다. 하지만 기본으로 되어 있는 것 같아서 생략했습니다!
snap services amazon-ssm-agent //EC2 터미널에서 실행중인지 확인 가능
🤔 다음으로 로컬에 필요한 세팅을 시작하겠습니다.
1. 로컬에 AWS CLI를 설치해주세요 🔗
2. 로컬에서 터미널을 띄우고 AWS configure를 입력해 구성해주세요!
$ aws configure
AWS Access Key ID [None]: {각자에게 주어진 Access Key}
AWS Secret Access Key [None]: {각자에게 주어진 Secret Access Key}
Default region name [None]: ap-northeast-2
Default output format [None]: json
3.로컬에 Session Manager Plugin을 설치해주세요. 🔗
4. 이제 연결을 해봅시다 ! 로컬 터미널을 열어주세요
aws ssm start-session --target {EC2 인스턴스의 id} \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"portNumber":["3306"],"localPortNumber":["3306"],"host":["{RDS 엔드포인트}"]}'
위의 코드를 터미널에서 입력을 해서 성공했다면! (로컬에서 3306을 이미 사용하고 있는 경우 오류가 날 수 있습니다, 이 경에는 다른 포트를 사용해주세요 ex) 3307)
Waiting for connections... 이라는 문구가 계속 터미널에 떠있게 됩니다.. 이렇게 뜨면 성공이고 이제 RDS를 연결해주면 됩니다.
- 저는 그냥 인텔리제에서 예시를 보여드리겠습니다.
- MySQL 데이터 소스를 만들어줍시다.
- RDS에서 만들었던 아이디와 비밀번호만 입력하고 OK를 눌러줍니다. 성공했다면 연결이 되고..
Connection accepted for session 이런식으로 터미널에 응답이 오게됩니다!
다만, 장시간 입력이 없을 경우 다시 연결이 끊기기 때문에 다시 연결을 해주어야 하는 불편함이 있습니다
- 연결함 김에 쿼리 콘솔을 열어서 DB도 하나 바로 만들겠습니다.
// DB도 하나 만들어 주겠습니다..
CREATE DATABASE practice;
- practice 데이터 베이스 스키마가 생겼습니다! 보이지 않는다면 위의 리프레시를 해주지 않았기 때문입니다.
😢 총평
사실 내용을 정리하기 전에는 RDS를 Public Subnet에 위치시켜서 IntelliJ에 한번 연결해 두면 계속 연결이 되어 있었습니다. 이렇게 하게 되면 매번 다시 연결을 해야 하는 불편함이 존재하는 문제가 생기네요 ㅠㅠ.
개발 도중에는 Public Subnet으로 RDS를 위치시키는 것도 좋은 방법인 것 같습니다! 하지만, 운영 단계가 된다면 결국 RDS는 Private Subnet에 위치시키는 것이 좋기 때문에... 배포에 익숙해진다면 각자의 취향에 맞게 사용하시면 될 것 같아요...
다음 시간에는 CI/CD 파이프라인을 구축하고 깃허브 액션을 통해서 자동으로 서버에 배포가 되도록 해보겠습니다.
Reference:
티스토리 - [AWS] SSH 포트포워딩 및 SSM을 통해서 로컬에서 Private Subnet에 있는 RDS 접근하기 🔗
'프로젝트' 카테고리의 다른 글
배포의 모든 것 - 4. 도메인 연결과 HTTPS 적용하기 (0) | 2025.04.03 |
---|---|
배포의 모든 것 - 3. Github Action을 통한 CI/CD (0) | 2025.03.18 |
배포의 모든 것 - 1. AWS 시작하기 및 EC2 띄우기 (5) | 2025.01.25 |
Restful API Endpoint를 어떻게 설계해야 할까? (1) | 2025.01.14 |
DDD(Domain Driven Design) 구조 알아보기 (5) | 2025.01.14 |