가장 최근 프로젝트에서 다음의 사항을 모두 만족하는 배포를 진행했기 때문에 기록을 겸하여 남겨두는 글
- 도메인 사용
- HTTPS (SSL 인증서) 사용
- AWS EC2 사용
- Docker 컨테이너 사용
참고로 해당 프로젝트는 플러터 기반 모바일 앱으로, 이 플젝기록은 모바일 용 백엔드 API 서버와 DB를 구축하는 작업을 다룸.
단계가 정리된 글은 아니고, 당시의 진행과정을 그대로 기록해둔 글이라 가이드라인 보다는 흐름을 전체적으로 훑어보는 참고용으로 쓸 것. 사진은... 노션에는 있는데 따로 저장해둔 이미지가 아니라서 올리기 너무 불편하여 일단 스킵...
(1)에서는 내가 진행했던 작업 흐름을 순서대로 나열할 거고, 이후 생긴 이슈나 보완했던 부분은 차츰 정리해서 업로드 예정
사용한 툴과 흐름 요약: 가비아 - DNSzi - Nginx Proxy Manager - AWS EC2 - RDS - Docker - GitHub Actions
1. 가비아에서 도메인 구매
웹을 넘어 클라우드로. 가비아
그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브
www.gabia.com
2. DNSzi에 도메인 등록 및 가비아에서 네임서버 변경
DNSZi - 무료 네임서버(dns) 관리 서비스! 무료파킹서비스! 무료포워딩서비스!
<!-- --> 도메인 DNS관리를 웹에서 쉽게 하세요! - DNS를 관리하는데 시간과 비용이 드시나요?- 번거롭게 도메인 등록업체에 매번 DNS정보 수정을 요청하시나요?- DNS관리자에게 DNS정보 수정을 요청하
www.dnszi.com
3. AWS EC2 인스턴스 생성
4. 탄력적 IP 할당 및 EC2 인스턴스 연결
(→ 이후 과금 문제로 해지했음 - 다음 포스트에서 언급 예정)
5. DNSzi에서 A레코드 설정
: 모바일 애플리케이션에서 사용할 도메인과 백엔드 서버 도메인은 보안과 관리의 유연성을 위해 분리하는 것이 좋다. 따라서 백엔드 도메인에 이전에 할당받은 탄력적 IP를 연결하여 A레코드로 등록한다.
: HTTPS 설정을 위해 웹 포워딩 관리도 등록해주려 했으나, 어차피 nginx에서 SSL 인증서랑 같이 처리해야 하지 않나 싶어서 일단 패스했다.
6. AWS RDS 인스턴스 생성
: 보안 그룹 설정 시 RDS 인스턴스의 IP 접근 범위를 제한해야 한다. EC2 인스턴스의 IP만 허용하거나 CIDR로 지정한다.
: 로컬 접속을 위해 내 공인 IP도 지정해둔다. 다만 로컬 IP는 인터넷 서비스 제공업체(ISP)에 따라 변경될 수 있다. 변경된 IP로 매번 보안 그룹을 수정하기 번거로울 수 있지만… Elastic IP, VPN, EC2로 SSH 터널링 (주로 쓰던 sqlyog는 유료버전만 ssh 연결을 지원해서, workbench나 Dbeaver 설치가 필요했다.) 등의 방법이 더 귀찮으니 일단은 접속 전에 AWS 보안 그룹에서 내 공인 IP를 등록하는 걸로 했다.
: 라우팅 테이블 수정해서 서브넷을 public으로 변경함. 이게 보안에는 좋지 않다는데, 일단 로컬에서 접속은 되어야 해서 이렇게 했다.
※ sqlyog에서 접속이 안되다가 두 번째 라우팅 테이블의 라우팅에 [0.0.0.0/0 → 인터넷 게이트웨이] 를 추가하고서야 sqlyog에서 접속이 되었다.
(→ 이후 보안 문제로 SSH 터널링 연결해서 터미널로 접근하여 사용함)
7. docker-compose.yml, gradle.yml, deploy.yml 작성
: Docker Hub 통해서 이미지를 생성하고 자동으로 빌드하도록 docker-compose 파일을 구성한다. API 컨테이너 뿐 아니라 NPM 컨테이너 활용을 위한 세팅도 함께 작성했다. gradle 파일은 GitHub Actions에서 진행될 자동 배포 관련 설정을 담았다.
8. GitHub Actions 통한 1차 배포
: Docker 컨테이너를 띄우기 위한 목적이다. 그래야 NPM 대시보드에 접속 할 수 있다. 보통 http://<EC2-Elastic-IP>:81
인 편이다.
: NPM 대시보드는 최초 접속 시, id: admin@example.com / pw: changeme 이다. 접속 직후 바꿔준다.
9. Nginx Proxy Manager 통한 SSL 인증서 발급 및 포트포워딩 설정
: NPM은 대시보드에서 무료로 SSL 인증서(Let’s Encrypt)를 지원한다. 기간 제한이 있지만 그냥 캘린더에 기록해두고 갱신해주면 돼서 사이드 프로젝트 용으로는 쓸만하다.
: NPM에서 Let’s Encrypt를 사용하려면 애플리케이션 컨테이너가 HTTP 응답을 반환해야 한다. 사용할 도메인에 8080 포트로 포워딩 되도록 호스트네임을 등록해준다.
10. 그 외 추가 설정을 위한 Advanced configuration 구성
: 프록시 관련 설정이랑, 에러 페이지 리디렉션 등에 대한 설정을 구성한다. NGINX 따로 띄울 때 쓰는 설정과 유사하게 하면 된다.
※ 이거 이후에 HTTPS로 swagger 접속하면 흰 화면만 나오고 HTTP로 URL에 포트 입력해서 접속하면 잘 떠서 한참 헤맸었는데, NPM 설정에서 Cache Assets 설정 끄니까 해결되었다.
Advanced configuration에 작성한 설정이랑 NPM에서 제공하는 NGINX 기본 설정이랑 충돌이 났거나, 캐싱이 잘못 작동해서 생긴 문제 같은데 확실한 원인은 모르겠다. 다른 API 호출은 되는데 swagger만 문제였던 상황이라 캐싱 문제일 가능성이 유력하긴 한데, 근데 이후에 다시 옵션을 켰더니 다시 흰 화면이 반복되어서... 몇 차례 반복한 결과 Cache Assets 설정을 off로 해두면 같은 문제는 발생하지 않는다는 결론에 도달했다. (안될 경우 Websockets Support도 꺼볼 것)
'프로젝트 · 트러블 슈팅' 카테고리의 다른 글
[플젝기록/트러블슈팅] 서버 및 DB 배포(AWS)와 CI/CD 구성 (3) (0) | 2025.06.03 |
---|---|
[플젝기록/트러블슈팅] 서버 및 DB 배포(AWS)와 CI/CD 구성 (2) (2) | 2025.05.29 |
[플젝기록] 논리 삭제 (0) | 2025.05.13 |