[AWS] RDS IPv4 과금없이 외부접속

zirryo·2024년 12월 19일
0

⚡️ STUDY

목록 보기
17/17
post-thumbnail



1 - 사용중인 서비스 및 과금현황

청구서를 확인하다가 $0.005 per In-use public IPv4 address per hour 항목의 이용시간이 급증한 것을 확인했다.

EC2 외에 퍼블릭 IPv4 주소를 사용중인 것은 RDS 뿐이었기에, EC2와 이용시간이 같아야 하는데, 200시간 이상의 차이가 나고 있었다.

즉, 퍼블릭 IPv4 를 사용하는 다른 서비스가 활성화 되어 있다는 것이다.



사용중인 퍼블릭 IP 는 콘솔의 Amazon VPC IP Address Manager > 퍼블릭 IP 인사이트 에서 확인할 수 있다.

해당 서비스에 처음 접속했다면, IPAM 을 생성해야 한다는 메세지가 뜨는데, 프리티어 용으로 하나를 생성하고 몇 시간 정도를 기다리면 퍼블릭 IP 인사이트를 확인할 수 있다.

원인은 며칠 전 등록한 로드밸런서였다.

RDS 하나만 퍼블릭 IPv4 를 이용할 경우, 1일 요금이 0.005 * 24 = 0.12$ 이다. 로드밸런서로 인해 1일 요금이 3배인 0.36$ 가 되었고 한달이면 11$에 가까운 비용이 청구된다. 심지어 환율이 너무 올라서 15000원 이상은 지불해야 했다.
참고로 저 금액에서 부가세 10%를 별도로 지불해야 함

AWS는 퍼블릭 IPv4 대신 IPv6을 이용을 권장한다.
IPv6은 비용이 무료이기 때문에 IPv6 전환을 시도해보기로 했다.




2 - RDS 스냅샷 및 마이그레이션 시도

시작에 앞서, 현재 나의 네트워크가 IPv6을 지원하는 지 확인해 본다.
IPv6 테스트 결과 내가 사용중인 네트워크는 IPV6 지원이 되지 않는다는 것...을 알게 되었다.

불행인지 다행인지 모르겠지만, 검색을 해보니 적어도 한국에서는 된다는 사람이 거의 없는 것 같았다.



그래서 비용을 줄일 수 있는 다른 방법에 대해 서치하던 중 EC2(프리티어 인스턴스 1개는 IPv4 무료)와 RDS를 연결하고, 내부 넷망을 이용하여 RDS에 접속하면 RDS에 IPv4 주소가 없어도 외부에서 접속할 수 있다는 것을 알게 되었다.

다만, RDS와 EC2가 같은 영역에 있어야 하는데, 내 RDS는 EC2 와 다른 가용영역에 생성되어 있기 때문에 스냅샷을 떠서 EC2와 같은 가용영역으로 옮겨야 했다.



RDS > 스냅샷 > 스냅샷 생성

완료되기까지는 몇 분 정도가 걸린다.



스냅샷 선택 > 작업 > 스냅샷 마이그레이션

마이그레이션으로 들어가면 데이터베이스를 구성할 수 있다.

그러나, 마이그레이션에서는 프리티어 인스턴스 클래스를 사용할 수 없다.
비용을 줄여보려고 시작한건데 RDS를 프리티어가 아닌 인스턴스로 생성해야 한다면 이 방식을 사용할 이유가 없다.



현재 내가 이용하고 있는 데이터베이스는 개인 프로젝트용이기 때문에 일부 혹은 전체가 유실되어도 큰 상관이 없는 데이터로 이루어져 있다.

또한, 기존 DB 를 삭제하고 새로 만드는 동안 DB가 공석이 되더라도 아무 문제가 없기 때문에 CSV 파일로 현재 데이터를 내보낸 후 새로운 프리티어 RDS를 생성하여 불러오기로 한다.




3 - Datagrip CSV 내보내기 / 불러오기

현재 총 10개의 테이블을 가지고 있고 그 중 7개는 정말 다 삭제해도 상관없지만 나머지 3개는 프로젝트에 꼭 필요한 데이터라 반드시 복구해야 하기 때문에 DB를 삭제하기 전에 내보내기/불러오기 테스트를 해봤다.

우측 상단 > CSV > 데이터 내보내기



추출기 파일 확장자 선택 > 파일 저장 위치 지정 > 파일로 내보내기

파일을 확인해보면, 이미지와 같이 컬럼들이 쉼표로 구분되어져 있다.

지금은 되는 지 테스트만 해볼 예정이므로 다 지우고 형식에 맞게 하나의 행을 작성한 후 저장한다.

데이터를 추가할 테이블 우클릭 > 가져오기/내보내기 선택



데이터 미리보기를 보면 내가 추가하려는 데이터가 컬럼명으로 취급되고 있다.



csv 파일 클릭 > 첫 번째 행은 헤더입니다 체크해제



데이터 미리보기를 보면 컬럼명이 따로 생긴 것을 확인할 수 있고, 매핑에서 실제 내 데이터와 다른 곳이 있다면 수정 해준 후 확인을 누르면 된다.

테이블 새로고침을 하면 CSV 데이터가 잘 옮겨진 것을 확인할 수 있다.




3 - 신규 프리티어 RDS 생성

같은 방식으로 필요한 테이블의 데이터를 CSV 파일로 모두 내보내기 한 후, RDS를 삭제 및 재생성한다.

다른 부분에서는 상황에 맞게 선택하면 되고 연결 에서 몇 가지 신경써야 하는 부분이 있다.

  • 컴퓨팅 리소스 > EC2 컴퓨팅 리소스에 연결
  • EC2 인스턴스 선택

으로 하면 퍼블릭 액세스 - 아니오 로 설정되므로 기존 방식으로 datagrip 에서 외부 접속을 할 수 없고, ec2 를 통해서 연결할 수 있다.

가용영역은 자동으로 EC2 인스턴스와 동일하게 설정된다.

추가적으로, 나처럼 개인 프로젝트를 위해 RDS 를 사용하는 상황이라면 추가구성 > 자동백업 항목을 꺼서 불필요한 과금을 막을 수 있다. 스토리지 > 스토리지 자동 조정 비활성화도 반드시 확인해야 한다. 기본 설정은 1000GB 까지 자동 조정 활성화가 되어있기 때문에 의문의 과금폭탄을 당할 수 있다.




4 - DataGrip SSH 연결

JetBrain 의 DataGrip 을 사용하고 있기 때문에 이 툴을 기준으로 설명한다.

파일 > 데이터 소스 OR 데이터베이스 탐색기 하단의 + 버튼

  • 이름 - 원하는 이름을 작성
  • 호스트 - rds > 연결하고 싶은 데이터 베이스 선택 > 연결 및 보안 > 엔드포인트 복붙
  • 포트 - 따로 건드린 게 없다면 3306
  • 인증 - 데이터베이스를 생성할 때 작성했던 사용자 이름과 암호를 입력



SSH/SSL 탭 > SSH 터널 사용

... 을 클릭하여 구성 페이지로 이동한다.



SSH 구성

  • 호스트 - ec2 ssh 연결에 사용하는 주소 입력
  • 사용자 이름 - ubuntu
  • 인증타입 - 키 쌍
  • 비공개 키 파일 - ssh 연결할 때 사용하는 pem 파일 선택

연결테스트를 해 본 후, 연결이 되었다면 적용 > 확인

데이터 소스가 생성된 것을 확인할 수 있다.



application.yml 수정 및 연결 확인

spring:
  web:
    resources:
      static-locations: []
      add-mappings: false
  datasource:
    url: jdbc:mysql://${DB_ENDPOINT}?useSSL=false&serverTimezone=Asia/Seoul
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: admin
    password: ${DB_PASSWORD}
  jpa:
    hibernate:
      ddl-auto: create

현재 프로젝트의 경우 db 엔드포인트와 password 는 환경변수로 설정해 두었기 때문에, yml 파일에서는 ddl-autoupdate 에서 create 로 바꿔주면 된다.

환경변수는 vi .bashrc 명령어를 입력하여 변경할 수 있다.
변경 후 적용을 위해 source .bashrc 를 입력해야 한다.



포스트맨으로 POST 요청 중 하나인 회원가입 요청을 보내보았다.

시간도 한국 시간대로 잘 설정되어 있고 데이터도 문제 없이 주고 받아지는 것을 확인할 수 있었다. 중간에 ssh 연결 관련 에러 메세지가 뜨기도 했는데, 데이터 소스 설정으로 들어가서 연결 테스트를 다시 하고 나니 해결되었다.

CSV 로 내보냈던 파일도 문제없이 새 데이터베이스에 불러왔다.


🔗 reference1

0개의 댓글

관련 채용 정보