티스토리 뷰

배포

1년 만에 프로젝트 복원: PlanetScale에서 AWS RDS & EC2로 이전하기

YG - 96년생 , 강아지 있음, 개발자 희망 2025. 2. 22. 15:21

예전에 진행했던 포트폴리오 사이트 프로젝트를 이어가려 하는데, 오랜만에 'coDDink' 프로젝트를 다시 살펴봤습니다.

 

1년 동안 방치된 프로젝트였지만, 다시 살려보고 싶어졌어요.

 

프로젝트를 다시 살리려고 보니 첫 번째 난관에 부딪혔습니다. 기존에 사용하던 PlanetScale이 2024년 4월부터 Hobby 플랜을 중단했다는 소식이었죠.

 

무료로 사용할 수 있었던 서비스가 이제는 유료로만 이용 가능하다니, 학생이나 취준생의 입장에서는 꽤나 부담스러운 변화였습니다.

 

 

Hobby tier deprecation - FAQ — PlanetScale

Learn how to use PlanetScale to power your application.

planetscale.com

 

 

고민 끝에 AWS 프리티어를 활용해보기로 결정했습니다. 물론 PlanetScale의 편리함은 포기해야 하지만, 비용을 아낄 수 있다는 점에서 AWS가 더 나은 선택이었습니다.

 

이번 글에서는 제가 Prisma와 PlanetScale 조합에서 AWS RDS로 마이그레이션하는 과정을 상세히 공유해보려 합니다.

 

1. RDS에서 MySQL 생성하기

AWS의 RDS에서는 관리형 MySQL 데이터 베이스를 사용할 수 있는데요. 프리티어인 계정을 하나 만들었기 때문에 진행해보겠습니다. 비용이 나오지 않도록 설정을 잘 해줘야해요.

 

그리고 최근에 알았는데 IPv4를 사용하면 매달 요금이 발생하게 되는데요. IPv6를 사용하거나 EC2를 통해서 RDS에 접근하는 방식으로 비용이 안나오도록 설정할 수 있었어요.

 

RDS 생성할 때 EC2 컴퓨팅 리소스에 연결을 눌러주면 됩니다.

 

 

AWS public IP 요금 부과에 따른 대처 및 EC2를 이용한 RDS 외부 연결하기

AWS에서 2024년 2월부터 퍼블릭 IPv4 주소에 대한 요금이 부과되기 시작하면서, 비용 절감을 위해 AWS 인프라를 IPv6로 전환하고 퍼블릭 IP 사용을 최소화하려는 노력이 필요해졌다. 이에 퍼블릭 IP 없

inchan.dev

 

 

 

그리고 EC2에 접속해서 RDS에 연결하기 때문에 EC2의 보안그룹에서 3306 포트를 추가해줬습니다

 

2. EC2에서 PlanetScale 데이터 가져오기

저는 PlanetScale에 있는 데이터를 dump 파일로 만든 뒤 RDS로 파일을 이동시키려고 EC2에 PlanetScale Cli를 설치했어요.

 

 

Release v0.221.0 · planetscale/cli

Changelog 16ba5f5 Add CSV and MarshalJSON 0766289 Add cmd 41de2d3 Add org 4861cf4 Add rollout status 7079623 Add to mock 8152584 Change header from name to shard c02a0e5 Fix double import 2b83c26 ...

github.com

 

1. pscale 다운로드

wget https://github.com/planetscale/cli/releases/download/v0.221.0/pscale_0.221.0_linux_amd64.deb

2. DEB 패키지 설치:

sudo dpkg -i pscale_0.221.0_linux_amd64.deb

 

3. 설치 확인

pscale --version

 

4. cli에 로그인하기

pscale login

5. dump 파일 생성하기

pscale database dump [database] [branch]

 

 

Can I download backup locally? · planetscale discussion · Discussion #168

Hello guys, awesome product! Trying it for the first time with Prisma and I am really impressed :-) Btw how can I download backup and save it locally?

github.com

 

 

3. RDS로 데이터 복원하기

 

mysql -h <RDS-endpoint> -u <mysql-username> -p <복원할 데이터베이스 이름> < backup.sql

 

sql로 복원시켜야한다고 해서 dump 파일 생성된 것이 폴더더라구요. 들어가보니 여러개로 되어 있었습니다. 하나로 합쳐주고 복원시켜줬어요.

 

cat *.sql > combined_backup.sql

 

RDS에서 복원할 데이터베이스도 선택해야하는데 저는 coddink로 복원시키기로 했습니다.

 

 

저는 아래와 같은 명령어로 복원했고, 잘 복원된 것을 확인해볼 수 있었어요

 

mysql -h database-1.crgqesoa2l90.ap-northeast-2.rds.amazonaws.com -u coddink -p coddink < combined_backup.sql

 

 

4. Next.js 환경변수 설정하기

 

nextjs + vercel로 배포되어 있어서 .env로 연결을 해야하는데 RDS로 직접 연결은 어려우니 EC2를 통해서 연결을 해야했습니다.

 

그래서 Vecel이 아닌 EC2에서 배포하기로 하고 EC2에서 git clone을 통해서 프로젝트를 설치해줬습니다.

 

아래 사진의 에러는 .env.production으로 이름을 적었었는데 그냥 .env로 해줬더니 해결했습니다.

 

 

그 다음 에러는 자격증명이 잘못되었다고 했는데요. 아래처럼 잘 입력했는데 원인은 비밀번호에 있었습니다. 

 

비밀번호에 $와 같이 특수문자가 들어갔는데 이걸 인코딩해줘야 했어요. 원인을 알 수가 없어서 한참을 해멨네요

 

원래 비밀번호: $Aa1234

인코딩 후 비밀번호: %24Aa1234

DATABASE_URL="mysql://<유저이름>:<비밀번호>@<RDS 앤드포엔트>:3306/<데이터베이스 이름>"

 

 

Authentication failed aginst database server at , the provided database credentials for are not valid.

 

 

 

5. 도메인 연결 및 HTTPS 적용하기

 

squarespace에 coddink라는 도메인을 다른 사이트에 이용중이라서 앞에 portfoilio.coddink.com으로 연결되도록 DNS 설정을 portfolio, A 타입, EC2 퍼블릭 IP를 입력해줬습니다.

 

 

 

그리고 nginx를 이용해서 :3000 포트로 입력하지 않아도 바로 연결되도록 했습니다.

 

Nginx 설치 및 리버스 프록시 설정

 

설치 후 Nginx를 시작하고 부팅 시 자동 실행되도록 설정

sudo apt install nginx -y

sudo systemctl start nginx
sudo systemctl enable nginx

 


Nginx 리버스 프록시 설정

sudo nano /etc/nginx/sites-available/default

 

http로 들어올경우 https로 접속되도록 했습니다.

# 1️⃣ HTTP (80) → HTTPS (443) 리디렉션
server {
    listen 80;
    server_name portfolio.coddink.com www.portfolio.coddink.com;

    return 301 https://$host$request_uri;
}

# 2️⃣ HTTPS (443) 설정
server {
    listen 443 ssl;
    server_name portfolio.coddink.com www.portfolio.coddink.com;

    ssl_certificate /etc/letsencrypt/live/portfolio.coddink.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/portfolio.coddink.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

 

 

 

설정을 저장한 후, Nginx 구성을 확인하고 재시작

 

sudo nginx -t  # 설정 파일 검증
sudo systemctl restart nginx  # Nginx 재시작

 

HTTPS 적용 (Let's Encrypt SSL)

 

certbot을 통해 인증서를 설치해보도록 하겠습니다.

sudo apt install certbot python3-certbot-nginx -y

 

portfolio.coddink.com에 대한 SSL 인증서를 발급받고, Ngnix 설정을 자동으로 업데이트합니다.

sudo certbot --nginx -d portfolio.coddink.com www.portfolio.coddink.com

 

그리고 수동으로 한다면 90일마다 인증서를 갱신해야 하기에 자동 갱신하도록 명령어를 입력해줬습니다.

sudo certbot renew --dry-run

 

 

 

이번 과정을 통해 Vercel과 PlanetScale 환경을 AWS로 성공적으로 마이그레이션할 수 있었습니다.
비용 효율적인 서버 운영이 필요한 분들에게 도움이 되길 바랍니다!

 

https://portfolio.coddink.com/

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함