https://billig-front.vercel.app/
얼마전에 aws 요금 때문에 EC2 인스턴스와 S3 버킷 등을 날리는 바람에, BilliG 프로젝트 백엔드 서버가 죽어버렸다.
프로젝트를 보여주어야 하기에 빠른 복구가 필요했다.
기본적으로 아래의 단계를 통해 처음부터 구축해 나갔다.
AWS EC2 인스턴스 생성
node, npm 설치
nginx, pm2 설치
git clone
nginx proxy 설정
pm2 start npm -- run start
AWS 로드밸런서 생성
AWS 타깃 그룹 지정 (인스턴스)
ACM 발급후 SSL 연결 허용
ACM 활용해서 https 연결 설정
route53으로 연결 설정
S3 버킷연결을 위한 코드 수정
프론트엔드 연결 테스트
s3 연결 테스트 (사진 잘뜨는지)
뜨는데 이미지가 없는경우, 이미지 업로드 작업..
AWS 인증서를 발급 받는데 시간이 좀 걸렸다.
Route53 - ELB - EC2 형태로 연결되는데,
ELB에서 바로 HTTPS 를 받으려니, 인증서가 필요했고, 인증서를 받기위해서는 도메인이 필요했으며, 도메인을 통해 인증서를 받기위해서는 결국 Route53으로 http를 먼저 열여놓고
유효한 사이트임을 보여준 이후에 AWS ACM을 통해 인증서를 발급 받아야 했다.
인스턴스 생성 후, 인스턴스를 타깃 그룹으로 만들어 둔 다음 로드밸런서를 listener:80 으로 생성해서 해당 타깃그룹으로 연결되도록 지정. 그 후 Route53에서 도메인으로 레코드를 생성하여 해당 로드벨런스로 이어지도록 설정. (레코드 유형 A, 별칭으로 로드밸런스를 지정 가능)
다만, 도메인을 옮기는데 기존계정에서 생성한 백엔드 도메인을 다시 재활용 하려 했고,
이를 위해서는 네임서버 변경이 필요했다. Route53 에서 지정해준 네임서버 4개를 이전 계정에서 생성한 도메인의 네임서버에 복붙하여 설정완료.
이렇게 http 설정을 먼저 해두고, 인증서를 발급받아 로드밸런서에 listener:443 을 추가했다. 이러면 Route53에 CNAME으로 레코드를 추가할 수 있다.
인증서 발급때문에 1-2일 소요.
인증서를 포함해서 https 설정까지 모두 마쳤다.
바로 S3를 개설해서 연결하려는데, 생각대로 되지 않는 부분이 있었다.
액세스 지점을 생성해서, EC2가 구동중인 VPC에서만 접속이 가능하도록 Public 접속을 모두 막았는데, 설정을 다루는 옵션이 익숙하지 않아 실패했다.
결국 모든 S3를 Public으로 두고, 액세스 키를 발급받아 연결하는 방식으로 진행했다.
액세스 키는 AWS IAM 에서 액세스 키 관리를 통해 생성했다.
NestJS로 기반의 백엔드 서버에 S3 버킷의 주소를 갱신하고, 액세스 아이디와 키를 모두 기입했다. 보안상의 이유로 .env 파일로 작성해서 변수를 통해 인식하게 했다.
그런데 이 env 파일을 다 인식하지 못하는 문제가 발생하여, 여러 시도를 하다가
dotenv 라이브러리를 통해 설정값을 불러 올 수 있도록 설정했다.
그리고 이제 알았는데 env파일에서 AWS_S3_ACCESS_KEY="awefsfsdfssf..."에서 등호 양 옆으로 공백이 있으면 설정값을 안먹더라..
아무튼 s3 설정까지 마치고 프론트엔드 서버에 띄워보니 CORS 에러가 뜨며 안된다.
백엔드서버에서 했던 CORS 설정은 프론트에서 해달라는대로 했었기에, 별로 관심이 없었는데,
CORS는 대충 여러곳에서 데이터를 동시에 못받아오도록 (보안상의 이유) 허가난 사이트를 적어놓는 것이다. 이것은 http와 https도 구분한다.
엘리스에서 발표이후에 서버를 옮기기 위해 프론트엔드 서버를 새로 구축했는데, 그 링크가 main.ts 의 cors 설정에 반영되지 않아서 일어난 문제였다.
둘다 설정함으로써 에러는 해결.
마지막 문제는 물건을 게시글로 올리는 것 까지는 되는데, 사진을 불러오질 못했다.
백엔드 서버에서는 200으로 잘 전달하는 것을 보아 백 서버 문제는 아니었고,
프론트서버에서 전달받은 링크를 통해 S3 버킷에서 이미지를 받아오는데, 읽기 권한이 없어서 거부를 먹는 것 같았다. 쓰기는 multer-s3를 통해 아이디와 키를 구현해두었기 때문에 가능했다. 이미지는 보안상 이슈가 없어서 s3 버킷에서 읽기 허용 정책을 추가하는 방식으로 해결했다.
드디어 백엔드 서버 복구가 끝났다.
이제 남은 작업은 이전 S3링크가 담긴 게시물들을 일일히 수정하는 것....