저는 데이터베이스가 필요할 때 Cloud SQL을 사용하는 편입니다.
App Engine에서 Cloud SQL에 연결하는 방법은 2가지 방식이 있는데 아래와 같습니다.

  1. Cloud SQL 프록시
  2. 비공개 IP(VPC)

처음에는 Cloud SQL 프록시가 기본 연결 방식이라서 이 방법을 사용 했지만 문제를 발견했습니다.

Cloud SQL 프록시 연결 속도 문제

웹 개발자 도구로 네트워크를 확인하면 SQL 작업이 필요한 부분은 모두 기본 1.5 ~ 2초 정도의 시간을 잡아먹습니다. 데이터베이스 클라이언트로 연결해서 확인해보니 SQL자체가 느린 것이 아니라 연결 속도가 굉장히 느리다는 것을 알았습니다

구글에서 검색해본 결과 여러 명이 이 현상을 겪고 있었고 다들 Cloud SQL 프록시가 느리다고 합니다.

Cloud SQL 비공개 IP 연결 방식 사용하기

그래서 비공개 IP 연결 방식을 사용하는 방법을 알려드리려고 합니다.

일단 GCP 콘솔 페이지에 접속하셔서 SQL 메뉴로 이동합니다.
만들어둔 SQL 인스턴스를 눌러 상세 페이지로 이동합니다.

SQL 인스턴스 상세페이지

  1. 개요 상단에 있는 수정 버튼을 눌러서 인스턴스 맞춤 설정 -> 연결 -> 비공개 IP를 체크해주세요.
  2. 네트워크를 선택해주세요.
    • 따로 만들어둔 네트워크가 없다면 기본적으로 만들어져 있는 default 네트워크를 사용하셔도 됩니다.

연결 설정 변경

  1. 위와 같은 사진이 나왔다면 연결 설정 버튼을 누릅니다.
  2. Service Networking API 사용 설정을 누릅니다.
  3. IP 범위 할당을 진행합니다
    • 직접 ip 범위를 설정할 수 있지만 여기서는 자동으로 할당을 선택하겠습니다.

우측에 뜨는 연결 설정 화면

  1. 연결 만들기를 눌러주세요. (약 2분 정도 걸립니다.)
  2. 해당 설정을 저장해주세요.

여기까지 진행하면 SQL 인스턴스는 비공개 IP 연결이 준비가 됩니다. 참고로 비공개 IP로 변경 시 SQL 인스턴스 재시작이 되는데 꽤 오래 걸립니다...

인스턴스가 정상적으로 재시작이 되고 나서 개요에 아래와 같은 화면이 나오면 Cloud SQL 비공개 IP 설정은 끝입니다.

연결 개요

서버리스 VPC 액세스 설정하기

App Engine에서 비공개 IP 방식으로 Cloud SQL에 연결하려면 서버리스 VPC 액세스 커넥터가 필요합니다.

GCP 콘솔 페이지에서 VPC 네트워크 메뉴를 눌러서 이동하시고 서버리스 VPC 액세스로 이동합니다.
그리고 상단에 있는 커넥터 만들기를 눌러주세요.

  1. 이름은 원하시는 데로 입력해주세요.
  2. 리전은 되도록 App Engine, Cloud SQL 리전과 같거나 가까운 위치로 설정해주세요.
    • 저는 asia-northeast3(서울)에 설정했습니다.
  3. 네트워크는 이전에 Cloud SQL에서 비공개 IP 설정할 때 사용한 네트워크로 선택해주세요.
  4. 서브넷은 맞춤 IP 범위를 선택해주세요.
  5. IP 범위는 기존 VPC 네트워크 또는 커넥터에서 사용 중인 IP 범위만 아니면 됩니다.
    • 처음 만드시는 거라면 10.8.0.0을 적어주시면 웬만하면 됩니다.

커넥트 만들기

App Engine 구성 파일 수정

App Engine에서 방금 만든 VPC 커넥터를 사용하기 위해 구성 파일인 app.yaml 파일을 수정합니다.
아래 코드를 추가해주세요.

vpc_access_connector:
  name: projects/[project_id]/locations/asia-northeast3/connectors/mysql-connector
  • [project_id]: 프로젝트 ID
  • asia-northeast3: 커넥터의 리전 위치
  • mysql-connector: 커넥터 이름

저와 리전, 이름을 다르게 했다면 바꿔주세요 :)

데이터베이스 호스트 설정 변경

저는 env를 사용했지만 host 값을 Cloud SQL 비공개 IP로 변경해주세요.

module.exports = ({ env }) => {
  return {
    defaultConnection: 'default',
    connections: {
      default: {
        connector: 'bookshelf',
        settings: {
          client: 'mysql',
          host: env('DATABASE_HOST'),
          database: env('DATABASE_NAME'),
          username: env('DATABASE_USERNAME'),
          password: env('DATABASE_PASSWORD'),
        },
        options: {}
      },
    },
  };
}

변경한 파일들 App Engine에 배포

변경한 파일들을 App Engine에 배포하기 위해 아래 명령어를 app.yaml가 있는 디렉토리에서 실행해주세요.

gcloud app deploy

비공개 IP 연결로 바꾼 뒤로 속도 체크

확실히 줄어들었습니다.
웹 개발자 도구로 네트워크를 확인하면 SQL 작업이 필요한 부분은 150ms ~ 300ms 정도로 프록시 연결 방식에 비해 많이 빨라졌습니다.

다음부터는 프록시가 아닌 비공개 IP로 설정하는 것이 필수가 되겠네요...

해당 글 내용에 관련한 FAQ

  • 데이터베이스 연결 시 주소가 없다고 오류가 뜹니다.
    • 데이터베이스 호스트를 Cloud SQL 인스턴스의 생성된 비공개 IP로 바꾸셨는지 확인해주세요.
    • 전에 프록시 연결방식을 사용했더라면 데이터베이스 설정에서 socketPath 관련 옵션이 있는지 확인해주세요. (있으면 지워주세요. 프록시 연결을 위해 있는 옵션입니다.

 

  • 만약 Cloud Build를 사용 중이시라면 빌드 중 권한 오류가 발생할 수 있습니다.
    • IAM 관리자에서 [ID]@cloudbuild.gserviceaccount.com 구성원 수정을 진행해주셔야 합니다. 아래 권한들이 있어야 합니다.
      • App Engine 관리자
      • Compute 뷰어
      • 서버리스 VPC 액세스 사용자

긴 글 읽어주셔서 감사합니다 :)