Cloud SQL에 연결: Compute Engine, 비공개 IP, Cloud SQL 프록시

1. 소개

최종 업데이트: 2021년 5월 6일

연결 고려하기

다양한 유형의 애플리케이션과 프레임워크가 있습니다. 이 Codelab에서는 Cloud SQL 프록시를 사용하여 내부 비공개 IP 주소를 통해 Google Compute Engine의 관리형 가상 머신에서 실행되는 애플리케이션에서 Cloud SQL에 연결하는 방법을 알아봅니다. 이는 클라우드에서 상태 저장 애플리케이션을 실행하는 매우 안전한 방법입니다. 비공개 IP만 사용하고 SSL 연결을 처리하는 SQL 프록시를 사용하여 인터넷에 대한 노출을 최소화합니다.

이러한 경우의 일반적인 사용 사례는 로컬이 아닌 클라우드에서 실행되도록 전환된 온프레미스 애플리케이션입니다.

빌드할 항목

이 Codelab은 매우 미니멀합니다. 애플리케이션 자체에 대해 너무 많이 생각하지 않고 연결 부분의 세부사항을 안내하는 것이 목표입니다. 이상적인 상황에서는 Cloud SQL에 연결하는 것이 다른 SQL 데이터베이스 인스턴스에 연결하는 것과 같으므로 이 Codelab에서 만든 것을 모든 프로덕션 애플리케이션에 적용할 수 있습니다.

안내에는 GCP 콘솔에서 작업을 수행하는 방법과 CLI 또는 자동화에 사용할 gcloud 명령어에 대한 설명이 모두 포함됩니다.

개별 단계는 다음과 같습니다.

  • Cloud SQL 인스턴스에 연결할 수 있는 최소한의 서비스 계정 만들기
  • Google Compute Engine (GCE)에서 VM 만들기
  • Cloud SQL 인스턴스 만들기 (이 튜토리얼에서는 Postgres를 사용하지만 MySQL 또는 SQL Server에서도 유사하게 작동함)
  • GCE 인스턴스에서 Cloud SQL 프록시 다운로드 및 실행

필요한 항목

  • API를 사용 설정하고 서비스를 만들 수 있는 권한이 있는 GCP 계정

2. 서비스 계정 만들기

서비스 계정은 GCP 프로젝트 내에서 다양한 서비스를 사용할 수 있는 권한을 부여하는 데 사용됩니다. 이 Codelab에서는 Cloud SQL 인스턴스에 연결할 수 있는 Cloud SQL 프록시 권한을 부여하기 위해 하나가 필요합니다.

콘솔에서

IAM 서비스 계정 페이지로 이동하여 페이지 상단의 f8393a08b37a422c.png 버튼을 클릭합니다.

서비스 계정에 고유한 이름과 ID를 지정하고 '만들기'를 클릭합니다.

다음 페이지에서 '역할 선택' 드롭다운을 클릭합니다. 'Cloud SQL'로 필터링하고 Cloud SQL 클라이언트 역할을 선택합니다. 'CONTINUE'를 클릭합니다.

완료를 클릭합니다.

gcloud 사용

서비스 계정을 만듭니다.

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

이렇게 하면 서비스 계정이 생성되지만 현재 할당된 역할/권한이 없습니다. 적절한 역할을 할당하려면 다음을 실행하세요.

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

예를 들어 서비스 계정을 만들 때 이름이 sa-test이고 프로젝트가 my-project-test인 경우 명령어는 다음과 같습니다.

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. Compute Engine VM 만들기

Google Compute Engine은 연결하려는 애플리케이션을 보유하는 가상 머신이 실행되는 관리형 서비스입니다. 이 Codelab에서는 애플리케이션을 빌드하지 않지만 psql을 실행하여 연결을 확인합니다.

콘솔에서

Google Compute Engine 페이지로 이동하여 77c46cd1f51bed5c.png 버튼을 클릭합니다.

여기에는 다양한 옵션이 있으며, 다음 사항만 확인하면 됩니다.

  1. 인스턴스 이름을 지정합니다.
  2. Machine typef1-micro으로 변경합니다.
  3. 'ID 및 API 액세스'에서 Service account 드롭다운을 Default compute service account에서 이전 단계에서 만든 항목으로 변경합니다.
  4. 페이지 하단에 있는 '만들기'를 클릭합니다.

gcloud 사용

서비스 계정은 이전에 만든 서비스 계정의 전체 이름이므로 <NAME>@<PROJECT>.iam.gserviceaccount.com 형식입니다.

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. Cloud SQL 인스턴스 만들기

Cloud SQL은 Google의 관리형 관계형 데이터베이스 제품입니다. MySQL, PostgreSQL, SQL Server를 지원합니다. 이 Codelab에서는 Postgres 데이터베이스를 만들지만 세 가지 모두 안내가 비슷합니다.

콘솔에서

Cloud SQL 페이지로 이동하여 241836b315e11bf5.png 버튼을 클릭합니다.

앞서 언급한 것처럼 이 Codelab의 대부분은 모든 SQL 버전에 적용되지만 이 Codelab에서는 PostgreSQL을 선택합니다.

  1. 인스턴스에 ID 지정
  2. 기본 사용자의 비밀번호를 입력합니다 (사용자 이름은 선택한 DB의 기본값임.예: MySQL의 경우 root, PostgreSQL의 경우 postgres).
  3. 컴퓨팅 인스턴스의 리전을 변경한 경우 여기에서도 리전을 변경하여 일치시켜야 합니다.
  4. 아래로 스크롤하여 show configuration options
  5. Connectivity 섹션 펼치기
  6. Public IP 옵션을 선택 해제하고 Private IP 체크박스를 선택합니다.
  7. 비공개 IP가 선택되었을 때 표시되는 드롭다운에서 default가 선택되어 있는지 확인합니다.
  8. 아래로 스크롤하여 '만들기'를 클릭합니다.

인스턴스가 시작되는 데는 보통 몇 분 정도 걸립니다.

gcloud 사용

여기에서 API를 사용 설정하는 좋은 프롬프트가 없으므로 수동으로 사용 설정해야 합니다.

gcloud services enable servicenetworking.googleapis.com

다음으로 기본 VPC 네트워크에서 비공개 서비스 연결을 사용 설정해야 합니다. 이를 수행하는 첫 번째 단계는 인스턴스에 사용할 명명된 IP 주소 범위를 할당하는 것입니다.

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

다음으로 해당 IP 범위를 내부 서비스에 할당합니다 (약 1분 소요).

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

마지막으로 인스턴스 자체를 만드는 것은 현재 베타 버전에서만 사용할 수 있습니다. --no-assign-ip--network=default의 조합을 통해 비공개 IP 연결이 사용 설정됩니다. 현재 비공개 IP와 공개 IP를 동시에 사용 설정할 수 있는 방법은 없으므로 공개 액세스가 필요한 경우 인스턴스를 만든 후 수정해야 합니다. 이 명령어는 완료되는 데 몇 분 정도 걸립니다.

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. Cloud SQL 프록시 설정 및 실행

VM에 연결되면 인스턴스 연결 문자열이 필요합니다. 먼저 이를 가져온 다음 SSH를 통해 VM 자체에 연결합니다. 이러한 부분에 대한 안내는 콘솔과 gcloud의 각 섹션에 있으며, 나머지는 VM의 셸에서 실행되는 명령어입니다.

콘솔에서

여기로 이동하여 Cloud SQL 인스턴스의 이름을 클릭합니다.

아래로 조금 스크롤하여 나중에 사용할 수 있도록 Connection name를 복사합니다.

Google Compute Engine 인스턴스 목록 페이지로 이동하여 VM이 있는 행을 찾습니다.

Connect 열에서 SSH 버튼을 클릭하면 가상 머신에 안전하게 연결되는 별도의 창이 열립니다.

나머지 안내는 동일하므로 Using gcloud 섹션을 건너뜁니다.

gcloud 사용

<INSTANCE NAME>을 Cloud SQL 인스턴스 이름으로 바꿉니다.

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

나중에 사용할 수 있도록 인스턴스 연결 이름을 저장합니다.

<ZONE>을 인스턴스를 만들 때 사용한 영역으로 바꿔야 합니다. 변경하지 않았다면 us-central1-b로 설정된 것입니다. 또한 <INSTANCE_NAME>을 이전에 지정한 이름으로 바꿉니다.

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

VM에 연결된 후

먼저 프록시를 다운로드해야 합니다. 운영체제에 따라 다릅니다. VM 생성 시 OS를 변경하지 않았다면 Linux가 되며 다음을 사용할 수 있습니다.

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

운영체제를 전환한 경우 여기에서 운영체제에 맞는 프록시를 가져오는 올바른 명령어를 확인할 수 있습니다.

프록시를 실행하려면 Cloud SQL 인스턴스 세부정보에서 복사한 인스턴스 연결 이름을 가져와 <INSTANCE_CONNECTION_NAME>을 대체합니다. Postgres db를 사용하지 않거나 db가 수신 대기하는 기본 포트를 변경한 경우 tcp 포트 번호가 변경될 수 있습니다.

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. 연결 테스트 및 마무리

앞서 언급한 것처럼 테스트를 위해 GCE 인스턴스에서 실행하려는 애플리케이션이 있는 경우에도 괜찮습니다. 이 Codelab에서는 psql을 설치하고 해당 클라이언트를 사용하여 데이터베이스에 연결할 수 있는지 확인합니다.

VM의 SSH 세션에서 다음을 실행합니다.

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

그런 다음 Cloud SQL 인스턴스를 만들 때 설정한 기본 사용자 비밀번호를 지정합니다.

축하합니다. 모든 것이 잘 진행되었다면 Postgres 프롬프트가 표시되고 데이터베이스에 대해 명령을 실행할 수 있습니다.

다음 단계

다음 Codelab을 확인하세요.

참조 문서