1. 簡介
上次更新時間:2021 年 5 月 6 日
思考連結
市面上有許多應用程式和架構,在本程式碼研究室中,我們將說明如何透過 Cloud SQL Proxy,使用內部私人 IP 位址,從 Google Compute Engine 中受管理的虛擬機器上執行的應用程式連線至 Cloud SQL。這是非常安全的方法,可在雲端執行有狀態的應用程式。您只使用私人 IP,並透過 SQL Proxy 處理 SSL 連線,盡可能減少暴露於網際網路的風險。
舉例來說,如果原本在本機執行的內部部署應用程式改為在雲端執行,就屬於這種情況。
建構項目
這個程式碼研究室非常簡潔,這個概念是引導您瞭解連線的基礎知識,不必過度思考應用程式本身。在理想情況下,連線至 Cloud SQL 就像連線至任何其他 SQL 資料庫執行個體一樣,因此您應該可以將本程式碼研究室建立的內容套用至任何正式版應用程式。
操作說明會逐步介紹如何在 GCP 主控台中執行操作,並提供對應的 gcloud 指令,方便您在 CLI 或自動化程序中使用。
具體步驟如下:
- 建立最精簡的服務帳戶,以啟用與 Cloud SQL 執行個體的連線
- 在 Google Compute Engine (GCE) 上建立 VM
- 建立 Cloud SQL 執行個體 (本教學課程使用 Postgres,但 MySQL 或 SQL Server 的運作方式類似)
- 在 GCE 執行個體上,下載並執行 Cloud SQL Proxy
軟硬體需求
- 您有權啟用 API 和建立服務的 GCP 帳戶
2. 建立服務帳戶
服務帳戶用於授予權限,以便在 GCP 專案中使用不同服務。在本 Codelab 中,我們需要一個服務帳戶,才能授予 Cloud SQL Proxy 連線至 Cloud SQL 執行個體的權限。
在控制台中
前往 IAM 服務帳戶頁面,然後按一下頁面頂端的
按鈕。
為服務帳戶指定專屬名稱和 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 頁面,然後點選
按鈕。
這裡有很多選項,你只需要:
- 為執行個體命名
- 將
Machine type變更為f1-micro - 在「身分和 API 存取權」下方,將
Service account的下拉式選單從Default compute service account變更為您在上一個步驟中建立的項目。 - 按一下頁面底部的「建立」
使用 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 頁面,然後按一下
按鈕。
如前所述,本程式碼研究室的大部分內容都適用於任何 SQL 類型,但請選擇 PostgreSQL。
- 為執行個體設定 ID
- 輸入預設使用者的密碼 (使用者名稱會是所選資料庫的預設名稱,例如 MySQL 的
root或 PostgreSQL 的postgres) - 如果您變更了運算執行個體的區域,也應在此變更區域,確保兩者一致。
- 向下捲動並點選
show configuration options - 展開「
Connectivity」部分 - 取消勾選
Public IP選項,並勾選Private IP核取方塊 - 確認已在勾選「私人 IP」後顯示的下拉式選單中選取
default - 向下捲動並點選「建立」
執行個體通常會在幾分鐘內啟動。
使用 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 範圍指派給內部服務 (約需一分鐘)。
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 後,我們需要執行個體連線字串。首先,我們會擷取該 IP 位址,然後透過 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,則系統會使用 Linux,您可以執行下列指令:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
如果已切換作業系統,請前往這裡取得適用於您作業系統的 Proxy 指令。
如要執行 Proxy,請複製您從 Cloud SQL 執行個體詳細資料取得的執行個體連線名稱,並取代 <INSTANCE_CONNECTION_NAME>。另請注意,如果您未使用 Postgres 資料庫,或已變更資料庫監聽的預設通訊埠,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 提示,並可對資料庫執行指令。
後續步驟
查看一些程式碼研究室…