連線至 Cloud SQL:Compute Engine、私人 IP 和 Cloud SQL Proxy

1. 簡介

上次更新時間:2021 年 5 月 6 日

思考關聯性

市面上的應用程式與架構有很多種。在本程式碼研究室中,我們將說明如何從在 Google Compute Engine 的代管虛擬機器中,透過使用 Cloud SQL Proxy 的內部私人 IP 位址來連線至 Cloud SQL 的應用程式。這是在 Cloud 中執行有狀態應用程式非常安全的方法。你可以限制只使用私人 IP,並透過 SQL Proxy 處理 SSL 連線,藉此盡可能降低暴露在網際網路的風險。

其中一項常見的用途為,像是地端部署應用程式改用雲端,而非本機。

建構項目

這個程式碼研究室的內容非常精簡。這個概念的用意是帶您瞭解相互連結的部分,而無需過度考慮應用程式本身。在最完美的情況下,連線至 Cloud SQL 就像是連結至 SQL 資料庫的任何其他執行個體一樣,因此您應該能取得在這個程式碼研究室中建立的內容,並套用至任何正式版應用程式。

這些操作說明包含使用 GCP 控制台的逐步操作說明,以及與 CLI 或自動化功能對應的 gcloud 指令。

個別步驟如下:

  • 建立最小的服務帳戶,以便連線至 Cloud SQL 執行個體
  • 在 Google Compute Engine (GCE) 中建立 VM
  • 建立 Cloud SQL 執行個體 (本教學課程使用 Postgres,但運作方式類似 MySQL 或 SQL Server)
  • 在 GCE 執行個體上下載並執行 Cloud SQL Proxy

軟硬體需求

  • 您的 GCP 帳戶有權啟用 API 及建立服務

2. 建立服務帳戶

服務帳戶可用於授予 GCP 專案中不同服務使用權限的權限。在這個程式碼研究室中,我們需要一個授予 Cloud SQL Proxy 連線至 Cloud SQL 執行個體的權限。

在控制台中

前往「IAM 服務帳戶」頁面,然後按一下頁面頂端的「f8393a08b37a422c.png」按鈕。

為服務帳戶設定不重複的名稱和 ID,然後按一下「建立」。

在下一頁中,按一下「選取角色」的下拉式選單。「Cloud SQL」篩選器然後選取「Cloud SQL 用戶端」角色按一下 [繼續]。

按一下「完成」。

使用 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 是一項代管服務,可讓虛擬機器加以執行,用於存放我們想要連線的應用程式。在本程式碼研究室中,我們不會建構應用程式,但會執行 psql 來確認連線狀態。

在控制台中

前往「Google Compute Engine」頁面,然後按一下 77c46cd1f51bed5c.png 按鈕。

提供多個選項,您唯一需要做的事包括:

  1. 為執行個體命名
  2. Machine type 變更為 f1-micro
  3. 在「Identity and API access」(身分及 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。在本程式碼研究室中,我們會建立 Postgres 資料庫,但這三種做法的操作說明相似。

在控制台中

前往「Cloud SQL」頁面,然後按一下 241836b315e11bf5.png 按鈕。

如先前所述,本程式碼研究室大部分都適用於任何 SQL 版本,但在本程式碼研究室中,請選擇 PostgreSQL。

  1. 為執行個體提供 ID
  2. 輸入預設使用者的密碼 (使用者名稱將是所選資料庫的預設值,例如 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

接著,我們需要在預設虛擬私有雲網路啟用私人服務連線。首先,我們要為執行個體分配已命名的 IP 位址範圍。

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

接下來,將 IP 範圍的 IP 範圍指派給我們的內部服務 (大約需要一分鐘)。

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

最後,目前只有 Beta 版可讓您建立執行個體本身。--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 Proxy

連線至 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 後

首先,我們需要下載 Proxy。視作業系統而定。如果您未在建立 VM 時變更 OS,表示該 OS 為 Linux,且可以使用:

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

如果您已更換作業系統,可以按這裡取得正確的指令,以便取得 OS 的 Proxy。

如要執行 Proxy,請擷取您從 Cloud SQL 執行個體詳細資料複製的執行個體連線名稱,以取代 <INSTANCE_CONNECTION_NAME>。另請注意,如果您未使用 Postgres db,或已變更資料庫監聽的預設通訊埠,tcp 通訊埠編號可能會改變。

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

6. 測試連線與包裝

如前所述,假如您希望應用程式能站在 GCE 執行個體中進行測試,那也無妨。在本程式碼研究室中,我們會安裝 psql,並透過該用戶端確認我們能否連線至資料庫。

在 VM 上的 SSH 工作階段中:

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

然後在建立 Cloud SQL 執行個體時,指定您設定的預設使用者密碼。

恭喜!如果一切順利,系統會顯示 Postgres 提示,並可針對資料庫執行指令。

後續步驟

查看一些程式碼研究室…

參考文件