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

1. 소개

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

연결에 대해 생각하기

다양한 유형의 애플리케이션과 프레임워크가 있습니다. 이 Codelab에서는 Cloud SQL 프록시를 사용하여 내부 비공개 IP 주소를 통해 Google Compute Engine의 관리형 가상 머신에서 실행되는 애플리케이션에서 Cloud SQL에 연결하는 방법을 다룹니다. 이는 클라우드에서 스테이트풀(Stateful) 애플리케이션을 실행하는 매우 안전한 방법입니다. 비공개 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은 관리형 관계형 데이터베이스 제품입니다. 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

운영체제를 바꾼 경우 여기로 이동하여 사용 중인 OS의 프록시를 가져오는 올바른 명령어를 확인할 수 있습니다.

프록시를 실행하려면 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을 확인하세요.

참조 문서