[GCP에 서비스 배포하기]
(1) docker image기반으로 cloudrun 실행하기
알파 환경을 구성하고 나서 브랜치 전략을 세우려고 하기 때문에 하나의 도커 이미지로 프로덕션과 알파 환경을 구성했다.
[환경 구성]
- spring profile 구성하기
각 prod(프로덕션), alpha(알파환경- 개발 환경), local(로컬환경 - 로컬 개발 환경) 용도로 profile을 구성해
환경을 분리해서 빌드할 필요까지 느끼지 못해 아래와 같이 resource 를 한 번에 넣고 빌드했다.
- docker 에 실행할 profile 환경 변수 주입하기
cloudrun을 실해할 때 환경변수로 profile을 주입했다.
아래 글 참고
https://www.baeldung.com/spring-boot-docker-start-with-profile
https://wfreud.tistory.com/295
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide#profile-groups
[c.f.데이터 덤프떠서 옮기기]
기존 운영 데이터를 덤프 떠서 알파환경에 그대로 업로드 했다.
-- 덤프 뜨기
mysqldump -u {username} -p -h {host} {db}>{filename}.sql
-- DB 옮기기
mysql -u {username} -p -h {host} -P {port} {db} < {filename}.sql
(2) cloudrun 서비스 생성하기
cloudrun을 선택한 이유:
- 컨테이너 이미지 기반의 fully managed computing platform으로 인프라를 구성하는 데에 들어가는 공수가 적다.
- 배포 버저닝 관리
- 무중단 배포
- AB 테스팅을 위한 트래픽 제어(Blue-Green 전략) 지원
- 100만건까지 무료: 초반 서비스를 띄워놓기에 저렴하다.
https://cloud.google.com/run/docs/overview/what-is-cloud-run?hl=ko
GCP 서비스 생성 방법은 아래와 같다:
https://cloud.google.com/run/docs/quickstarts/jobs/create-execute?hl=ko
(3) LB로 고정 IP 생성하기
고정 IP가 필요했던 이유는 다음과 같다:
- cloudrun은 아래 그림과 같이 기본적으로 동적 할당되는 IP와 임의의 Domain을 제공한다. 고정 Domain을 만들기 위해 고정 IP를 할당
- DNS와 연결하기 위해서: 도메인 (XXX.com)을 만들어서 관련 서비스들을 하위 도메인으로 모아 관리
- 특히 이번에는 CORS에러를 해결하기 위해서였다. (CORS 에러에 관한 글)
설정방법: https://cloud.google.com/load-balancing/docs/https/setting-up-reg-ext-https-serverless?hl=ko#creating_the_load_balancer
(4) cloudflare 로 DNS 서비스 연결하기
CloudFlare를 선택한 이유:
- 비용이 저렴하다
- 인증서 등록이 쉽다 (https)
- 클라우드 플레어 페이지스 사용: CDN 용도로 사용
- 트래픽 분석
- worker, R2 스토리지 등 사용할 수 있는 서비스가 편리
마지막으로 Custom 한 Domain Name을 사용하기 위해 cloudflare를 사용했다.
이미 도메인 서비스를 지정한 상태를 가정하고 고정 IP에 A 레코드로 IP-Domain 연결을 해보려고 한다.
A 레코드와 cname 에 대한 설명은 아래 블로그를 참고할 수 있다
https://dev.plusblog.co.kr/30
'백엔드 개발' 카테고리의 다른 글
#034. 쿼리개선: "연산"을 해서 index를 사용하지 못한 쿼리 개선 (0) | 2023.04.25 |
---|---|
#033. 리팩터링: Transaction DB 와 Query DB 분리하기 (Mikro ORM) (0) | 2023.04.21 |
#031. 쿼리개선: N*M -> N+M 개선하기 (0) | 2023.04.09 |
#030. CORS 에러 원인과 해결 (feat. 서버에서 CORS 테스트 하기) (0) | 2023.04.08 |
#029. 리팩터링: any 보다 unknown 타입 사용하기 (feat. 이중 단언문) (0) | 2023.04.05 |