본문 바로가기

Cloud

[GCP] VM Instance, Cloud SQL 생성 및 Spring Boot 세팅

들어가며

이번에 Google Solution Challenge에 참여하게 되면서, Google 기술 중 하나 이상을 반드시 사용해서 프로젝트를 진행해야 하는 상황이 생겼다. 서버 개발을 혼자 맡게 되어서 스택을 자유롭게 정하면 되었는데, 우리 팀의 경우 프론트는 React, 백은 SpringBoot를 활용하기로 해서 Google 기술인 Flutter 등을 하나도 사용하지 않게 되었다. 클라우드 쪽은 비교적 익숙한 AWS EC2, RDS, S3 등을 사용해 빨리 세팅하려고 계획했었는데, 프로젝트 내에서 Google API를 추가로 사용하지 않는 이상 조건을 만족하려면 GCP를 사용할 수 밖에 없게 됐다.

그래도 AWS말고 새로운 것을 써볼 수 있는 기회이기도 하고, Google 측에서 Solution Challenge 참가자들을 위해 크레딧도 준다고 해서 이번 프로젝트에서는 GCP를 사용해보기로 결정했다! GCP는 처음 사용해보는데, 90일동안 300$ 무료 크레딧도 주고 너무 좋다!

처음 접하는 김에 VM instance(Compute Engine), Cloud SQL를 새로 생성하고 Spring Boot 프로젝트와 연동하는 과정을 기록해보려 한다. 아마 프로젝트에서 Cloud Storage도 사용해야 될 것 같아서 이 부분도 GCP를 활용할지, AWS S3를 활용할지는 좀 더 고민해볼 예정이다.


1) VM Instance 생성

프로젝트는 기본으로 생성되어 있는 My First Project를 사용해도 되지만, 나는 우리팀의 프로젝트명으로 새로 만들어줬다. 해당 프로젝트로 들어가 가장 먼저 Compute Engine인 VM Instance를 새로 생성해보자. 

GCP 콘솔 탭에서 VM 만들기 → 사용 → 인스턴스 만들기를 순서대로 클릭하면 다음과 같은 설정 화면이 뜬다.

 

 

VM 이름은 프로젝트 이름으로 설정하고, 리전은 asia-northeast3(서울)으로 지정했다. 낮은 CO2(좀 더 싼 월별 비용)를 가진 리전도 있었지만, 한 달에 4달러 정도밖에 차이가 안나기도 하고 크레딧은 넉넉하니까 서울로 골랐다.
머신은 범용-E2, e2-small(메모리 2GB)로 설정해줬다. 어떻게 구성하냐에 따라 오른쪽에 월별 예상 가격이 바로 바뀌니까 확인해보면서 적절한 가격대에 맞추는 것도 좋을 것 같다. 
VM 프로비저닝은 표준, 부팅 디스크는 Ubuntu 22.04 LTS로 설정하고, 방화벽 부분에서 HTTP, HTTPS 트래픽을 허용해준다.
이렇게 설정했을 때 월별 예상 가격은 $16.21 정도였고, 충분히 크레딧 내에서 해결할 수 있을 것 같다.

다른 부분은 원래 상태 그대로 두고 만들기 버튼을 눌러 VM 인스턴스를 생성해준다.

 

 

 

2) 방화벽 규칙 설정

항상 서버에 접속이 잘 안되면 가장 먼저 확인해봐야 할 그것..바로 인바운드 규칙 설정! 여기서도 마찬가지로 인바운드 트래픽을 허용하도록 규칙을 설정해보자.

 

GPC 인스턴스 이름을 클릭해, 세부 페이지로 들어가 쭉 내리다 보면 네트워크 인터페이스 부분이 나온다. 네트워크 이름을 클릭하면 해당 인스턴스와 연결된 VPC 네트워크 페이지가 나오는데, 좌측에 보면 방화벽 정책 메뉴가 있다.

 

해당 메뉴로 들어가 상단에 있는 방화벽 규칙 만들기 버튼을 클릭해 새로운 규칙을 추가해주자!

 

먼저 MySQL 사용을 위해 3306 포트를 열어준다.

네트워크는 해당 VPC를 골라주면 되고, 우선순위는 최우선 순위인 1000으로 설정해준다. 소스 IP는 0.0.0.0/0으로 다 열어주고, TCP 3306 포트를 지정해주면 된다.

 

 

다음으로는, 동일한 방법으로 8080 포트도 열어준다.

 

다른 포트들은 기본으로 다 설정되어 있는 것 같고, 새로 생성한 인바운드 규칙은 위와 같다.

나중에 추가할 규칙이 있다면 다시 위 방식으로 추가해주면 된다.

 

 

 

3) Cloud SQL 생성

VM 인스턴스 관련 설정은 마무리하고, 다음으로는 클라우드 DB를 만들어보자!

Cloud SQL을 사용하려면 콘솔 상에서 새 인스턴스를 만들거나 기존의 SQL DB를 Google 클라우드로 마이그레이션하는 방법도 있다는데, 따로 로컬에서 만들지 않고 콘솔 상에서 바로 인스턴스를 만들어볼 예정이다.

 

우선 SQL 탭에 들어가 인스턴스 만들기를 클릭하고, MySQL 엔진을 선택해준다.

그리고 아래와 같이 설정해 인스턴스를 생성해준다.

인스턴스 ID, 비밀번호를 설정해주고, 데이터베이스 버전은 MySQL 8.0으로 설정한다.
Cloud SQL의 버전은 Enterprise, 샌드박스로, 리전은 아까 생성한 VM 인스턴스와 동일한 리전에 위치하도록 한다.
그리고 영역 가용성은 단일 영역을 고르고, 인스턴스 맞춤 설정에서 머신 종류를 선택해준다.
우선 기본으로 설정되어 있던 vCPU 2개, 8GB 그대로 두고, 저장 용량 옵션에서 저장용량 자동 증가 사용 설정을 선택해제 해준다.
일일 백업 자동화 설정도 비용이 드는 것 같아 우선은 해제해줬다.
나머지는 다 그대로 두고, 드디어 인스턴스 만들기를 클릭해 생성해준다!

 

 

인스턴스가 생성되기 까지 몇 분 정도 기다려 주면, 아래와 같이 인스턴스가 성공적으로 세팅된다.

 

 

3-1) 데이터베이스 생성

방금 만들어준 인스턴스 ID를 클릭해 세부 페이지로 들어간 후, 좌측 메뉴에서 데이터베이스를 클릭한다.

데이터베이스 만들기 버튼을 클릭해 프로젝트에서 사용할 DB 스키마를 새로 만들어준다. 이름만 잘 설정해주고 다른 옵션은 기본값으로 둔다.

 

3-2) 연결 설정

다시 좌측 메뉴의 연결 탭을 클릭하고, 네트워킹 탭으로 들어가 승인된 네트워크 부분에 네트워크를 추가해준다.

0.0.0.0/0으로 어느 IPv4에서든 접속 가능하도록 설정해줬다.

 

 

4) Cloud SQL에 테스트 접속

개인적으로 워크벤치보다는 인텔리제이 Database 탭 통해서 RDS 연결하는 것을 선호해서 인텔리제이 프로젝트에서 방금 생성한 RDS에 접속이 잘되는지 확인해보려 한다.

 

우선 application.yml 파일에 RDS 관련 설정을 추가해준 후 프로젝트를 run시켜야 한다.

spring:
  datasource:
    url: jdbc:mysql://[Public IP]/[DB 이름]?characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: # Cloud SQL 인스턴스 생성 시 설정한 pw
    driver-class-name: com.mysql.cj.jdbc.Driver

 

 

각자 DB에 맞게 application.yml 파일을 잘 작성해준 후, Database 탭에서 +버튼을 눌러 새로 DB 연결을 생성해주고 Driver는 MySQL을 선택해주면 아래와 같이 Data Sources 정보를 입력하는 창이 뜬다.

Name은 원하는대로 작성하면 되고, Host 부분에 RDS의 Public IP, Port에 3306을 입력한다.
그리고 User는 root, Password는 Cloud SQL 인스턴스 생성시 작성한 Password를 입력해준다.
Database에는 방금 전 콘솔에서 생성해준 DB 스키마 이름을 작성해주고, 아래 Test Connection을 클릭해 잘 연결되는지 확인한 후, Apply → OK를 누르면 성공적으로 RDS에 연결된 것이다!

 

Trouble Shooting

rds [28000][1045] Access denied for user 'admin'

처음에는 User 부분에 Cloud SQL 인스턴스 생성 시 작성한 인스턴스 ID를 넣고 Test Connection을 했는데, 위와 같이 내가 입력한 user에 대해 거부되었다고 에러가 났다. 이 에러는 보통 DB에 없는 유저 또는 권한이 없는 유저로 접속하려 할 때 발생하는 걸로 알고 있어서 인스턴스 ID로 유저가 생성된게 아닌거구나하는 생각이 들었다.

그래서 DB 유저를 확인해보기 위해 콘솔에서 좌측 메뉴에 있는 사용자 탭에 들어가봤더니 역시 %(모든 호스트)에 대해 'root'라는 이름으로 유저가 생성되어 있었다. User 이름을 어떻게 입력할지 잘 모르겠다면 Cloud SQL 해당 인스턴스 세부 페이지에 들어가 사용자 탭을 확인해보자!

+) 인스턴스 생성 시 작성한 인스턴스 ID는 말 그대로 해당 인스턴스를 식별하기 위한 식별자일 뿐, DB 연결 시 입력하는 user와는 관련이 없다.

 

정리

VM Instance와 Cloud SQL를 생성하고, RDS 연결을 위한 간단한 Spring Boot 설정까지 정리해봤다!

평소에 AWS만 사용하는 편인데, 이번 기회에 GCP를 접해보니 생각보다 덜 복잡했던 것 같다! GCP UI에 좀 더 익숙해진다면 간단한 작업만 하기에는 GCP가 더 수월할 수도 있을 것 같다고 느꼈다. 그런데 서버 하나 만들거나 방화벽 규칙 하나 만드는데도 AWS보다 훨씬 더 설정할게 많고 세세한 느낌이긴 해서, 클라우드 자체를 처음 접해보시는 분들이 사용하기에는 살짝 헷갈리지 않을까하는 생각은 든다.

 

그래도 이번에는 비교적 간단한 작업만 필요했어서, GCP도 충분히 고려해 볼만하다고 생각한다! 역시 뭐든지 직접 경험해보면 또 새로운 걸 깨닫게 된다는 걸 다시 한 번 느꼈고, 앞으로도 GCP 사용할 때  이 글 참고해서 세팅하면 되겠다!

 

 

+) 추가

무료 크레딧 사용하겠다는 생각으로 리전을 서울로 뒀더니 생각보다 이렇게 가다가는 금방 크레딧 다 사용해버릴 것 같아서...CLoud SQL 비용 최대한 줄일 수 있도록 Compute Engine이랑 Cloud SQL 다시 만들기로 결정했다.

 

아래 이미지는 15일에 만들고 나서 예상 비용청구서인데, GCP는 Compute Engine 비용 청구할 때 서버가 켜져 있는 동안 초단위로 계산한다고 해서 정지시켜서 하루에 15원만 청구된 상태다. 아직 프로젝트 개발 중이라 배포 하기 전에 로컬로만 확인하면 돼서 Compute Engine은 중지해뒀다가 사용할 때만 켜도 된다.

하루에 5710원씩 과금되는 Cloud SQL..

 

https://cloud.google.com/free/docs/free-cloud-features?hl=ko#storage

 

Google Cloud 무료 프로그램

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 의견 보내기 Google Cloud 무료 프로그램 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Goog

cloud.google.com

그리고 GCP도 AWS처럼 프리티어가 존재한다! GCP 프리티어 기준은 위 링크가면 자세히 확인할 수 있는데, 내가 관심있는 부분은 Cloud Storage와 Compute Engine이다. 아래 기준표를 보면 둘 다 리전은 미국에 한정되어 있다. 추후 프로젝트 내에서 이미지를 사용하는 부분이 있어서 Cloud Storage 세팅도 해야하기 때문에, Compute Engine이랑 Cloud Storage의 리전을 미국으로 바꿔야겠다.

 

 

먼저 Compute Engine을 다시 만들어보자!

리전은 us-west1(오리건), 머신은 e2-micro, 부팅 디스크는 Ubuntu 22.04 LTS(X86)에 표준 영구 디스크 30GB로 설정해줬다. 그리고 전과 마찬가지로 방화벽 부분에서 HTTP, HTTPS 트래픽을 허용해 새로운 Compute Engine을 만들어줬다.

 

 

다음으로 Cloud SQL도 다시 만들어주자

인스턴스 ID, 비밀번호를 설정해주고, 데이터베이스 버전은 MySQL 8.0으로 설정한다.
Cloud SQL의 버전은 Enterprise, 샌드박스로, 리전은 VM 인스턴스와 동일한 리전인 us-west1(오리건)을 선택한다.
그리고 영역 가용성은 단일 영역을 고르고, 인스턴스 맞춤 설정에서 머신 종류를 선택해준다.
머신 구성은 vCPU 1개, 3.75GB를 선택해주고 저장 용량 옵션에서 저장용량 자동 증가 사용 설정을 선택해제 해준다.
일일 백업 자동화 설정도 비용이 드는 것 같아 우선은 해제해줬다.
나머지는 다 그대로 두고, 인스턴스 만들기를 클릭해 생성해준다!

 

데이터베이스 생성과 네트워크 연결 설정은 위에 작성한 방법과 동일하게 진행해줬고, 아래와 같이 외부에서 DB 연결도 성공적으로 마쳤다!