本教學課程說明如何建立投票服務,其中包含下列元件:
瀏覽器用戶端,可執行下列操作:
- 使用 Identity Platform 擷取 ID 權杖。
- 允許使用者票選最喜歡的家畜。
- 將該 ID 權杖新增至要求,傳送給處理投票的 Cloud Run 伺服器。
Cloud Run 伺服器,可執行下列操作:
- 確認使用者已提供有效的 ID 權杖,完成驗證。
- 處理使用者的投票。
- 使用自己的憑證,將投票結果傳送至 Cloud SQL 儲存。
儲存投票結果的 PostgreSQL 資料庫。
為求簡單,本教學課程使用 Google 做為供應商。使用者必須使用自己的使用者帳戶進行驗證,才能取得 ID 權杖。不過,您也可以使用其他供應商或驗證方式讓使用者登入。
本文中的「使用者帳戶」一詞,是指 Google 帳戶,或由識別資訊提供者管理並與員工身分聯盟連結的使用者帳戶。
您可以使用使用者帳戶提供的憑證登入工具。
這項服務會使用 Secret Manager 保護用於連線至 Cloud SQL 執行個體的機密資料,盡可能降低安全風險。此外,這項服務也會使用最小權限服務身分,安全地存取資料庫。
目標
編寫、建構及部署服務至 Cloud Run,瞭解如何:
使用 Identity Platform 向 Cloud Run 服務後端驗證使用者。
為服務建立最小權限身分,授予 Google Cloud 資源的最低存取權。
將 Cloud Run 服務連結至 PostgreSQL 資料庫時,請使用 Secret Manager 處理機密資料。
費用
在本文件中,您會使用下列 Google Cloud計費元件:
您可以使用 Pricing Calculator,根據預測用量估算費用。
事前準備
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
啟用 Cloud Run、Secret Manager、Cloud SQL、Artifact Registry 和 Cloud Build API (如有尚未啟用的 API)。
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。
必要的角色
如要取得完成教學課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
- Artifact Registry 存放區管理員 (
roles/artifactregistry.repoAdmin) - Cloud Build 編輯者 (
roles/cloudbuild.builds.editor) - Cloud Run 管理員 (
roles/run.admin) - Cloud SQL 管理員 (
roles/cloudsql.admin) - 建立服務帳戶 (
roles/iam.serviceAccountCreator) - Identity Platform 管理員 (
roles/identityplatform.admin) - OAuth 設定編輯者 (
roles/oauthconfig.editor) - 專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin) - Secret Manager 管理員 (
roles/secretmanager.admin) - 服務帳戶使用者 (
roles/iam.serviceAccountUser) - 服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer) - 儲存空間管理員 (
roles/storage.admin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
設定 gcloud CLI 預設值
如要為 Cloud Run 服務設定 Google Cloud CLI 預設值,請按照下列步驟操作:
設定您的預設專案:
gcloud config set project PROJECT_ID
將 PROJECT_ID 替換為您為本教學課程建立的專案名稱。
為所選區域設定 Google Cloud CLI:
gcloud config set run/region REGION
將 REGION 替換為您選擇的支援 Cloud Run 區域。
Cloud Run 位置
Cloud Run 具有區域性,這表示執行 Cloud Run 服務的基礎架構位於特定區域,並由 Google 負責管理,實現該區域內所有可用區之間的備援可用性。
選擇執行 Cloud Run 服務的區域時,主要考量重點在於延遲時間、可用性或耐用性需求。原則上可以選擇距離使用者最近的區域,但也應考慮 Cloud Run 服務所用其他 Google Cloud產品的位置。如果跨多個位置使用 Google Cloud 產品,可能會影響服務的延遲時間和費用。
Cloud Run 可在下列地區使用:
採用級別 1 定價
asia-east1(臺灣)asia-northeast1(東京)asia-northeast2(大阪)asia-south1(印度孟買)asia-southeast3(曼谷)europe-north1(芬蘭)低二氧化碳排放
europe-north2(斯德哥爾摩)低二氧化碳排放
europe-southwest1(馬德里)低二氧化碳排放
europe-west1(比利時)低二氧化碳
europe-west4(荷蘭)低二氧化碳排放
europe-west8(米蘭)低二氧化碳排放
europe-west9(巴黎)低二氧化碳排放
me-west1(特拉維夫)northamerica-south1(墨西哥)us-central1(愛荷華州)低二氧化碳排放
us-east1(南卡羅來納州)us-east4(北維吉尼亞州)us-east5(哥倫布)us-south1(達拉斯)低二氧化碳排放
us-west1(奧勒岡州)低二氧化碳排放
採用級別 2 定價
africa-south1(約翰尼斯堡)asia-east2(香港)asia-northeast3(韓國首爾)asia-southeast1(新加坡)asia-southeast2(雅加達)asia-south2(印度德里)australia-southeast1(雪梨)australia-southeast2(墨爾本)europe-central2(波蘭華沙)低二氧化碳
europe-west10(柏林)europe-west12(杜林)低二氧化碳排放
europe-west2(英國倫敦)低二氧化碳排放
europe-west3(德國法蘭克福)europe-west6(瑞士蘇黎世)低二氧化碳
me-central1(杜哈)me-central2(達曼)northamerica-northeast1(蒙特婁)低二氧化碳排放
northamerica-northeast2(多倫多)低二氧化碳排放
southamerica-east1(巴西聖保羅)低二氧化碳排放
southamerica-west1(智利聖地牙哥)低二氧化碳排放
us-west2(洛杉磯)us-west3(鹽湖城)us-west4(拉斯維加斯)
如果您已建立 Cloud Run 服務,可以在Google Cloud 控制台的 Cloud Run 資訊主頁中查看區域。
擷取程式碼範例
如要擷取要使用的程式碼範例:
將應用程式存放區範例複製到本機電腦中:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
您也可以 下載範例 ZIP 檔案,然後解壓縮。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
您也可以 下載範例 ,然後解壓縮 ZIP 檔案。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
您也可以 下載範例 ZIP 檔案,然後解壓縮。
變更為包含 Cloud Run 程式碼範例的目錄:
Node.js
cd nodejs-docs-samples/run/idp-sql/
Python
cd python-docs-samples/run/idp-sql/
Java
cd java-docs-samples/run/idp-sql/
以圖表呈現架構
使用者向 Cloud Run 伺服器發出第一個要求。
用戶端會在瀏覽器中載入。
使用者透過 Identity Platform 的 Google 登入對話方塊提供登入憑證。系統會顯示快訊,歡迎已登入的使用者。
控制權會重新導向回伺服器。使用者透過用戶端投票,用戶端會從 Identity Platform 擷取 ID 權杖,並將其新增至投票要求標頭。
伺服器收到要求後,會驗證 Identity Platform ID 權杖,確認使用者已通過適當驗證。接著,伺服器會使用自己的憑證,將投票傳送至 Cloud SQL。
瞭解核心程式碼
範例會以用戶端和伺服器的形式實作,詳情請見下文。
與 Identity Platform 整合:用戶端程式碼
這個範例使用 Firebase SDK 與 Identity Platform 整合,以便登入及管理使用者。如要連線至 Identity Platform,用戶端 JavaScript 會將專案憑證的參照保留為設定物件,並匯入必要的 Firebase JavaScript SDK:
Firebase JavaScript SDK 會提示使用者透過對話方塊視窗登入 Google 帳戶,藉此處理登入流程。然後將使用者重新導向回服務。
使用者成功登入後,用戶端會使用 Firebase 方法建立 ID 權杖。用戶端將 ID 權杖新增至傳送給伺服器的要求 Authorization 標頭。
與 Identity Platform 整合:伺服器端程式碼
伺服器會使用 Firebase Admin SDK 驗證用戶端傳送的使用者 ID 權杖。如果提供的 ID 權杖格式正確、未過期且已正確簽署,這個方法會傳回解碼的 ID 權杖。伺服器會擷取該使用者的 Identity Platform uid。
Node.js
Python
Java
將伺服器連線至 Cloud SQL
伺服器會使用以下格式連線至 Cloud SQL 執行個體 Unix 網域通訊端:/cloudsql/CLOUD_SQL_CONNECTION_NAME。
Node.js
Python
Java
使用 Spring Cloud Google Cloud PostgreSQL 啟動器整合,透過 Spring JDBC 程式庫與 Cloud SQL 中的 PostgreSQL 資料庫互動。設定 MySQL 適用的 Cloud SQL,自動設定DataSource Bean,並搭配 Spring JDBC 提供 JdbcTemplate 物件 Bean,以便執行查詢及修改資料庫等作業。
使用 Secret Manager 處理機密設定
Secret Manager 提供集中且安全的儲存空間,可存放 Cloud SQL 設定等機密資料。伺服器會在執行階段,使用環境變數從 Secret Manager 插入 Cloud SQL 憑證。進一步瞭解如何搭配使用 Cloud Run 和密鑰。
Node.js
Python
Java
設定 Identity Platform
Identity Platform 必須在 Google Cloud 控制台手動設定。
在 Google Cloud 控制台啟用 Identity Platform API:
設定專案:
在新視窗中,前往「Google Auth Platform」>「總覽」頁面。
按一下「開始使用」,然後按照專案設定步驟操作。
在「應用程式資訊」對話方塊中:
- 提供應用程式名稱。
- 選取其中一個顯示的使用者支援電子郵件地址。
在「目標對象」對話方塊中,選取「外部」。
在「聯絡資訊」對話方塊中,輸入聯絡電子郵件地址。
同意使用者資料政策,然後按一下「建立」。
建立並取得 OAuth 用戶端 ID 和密鑰:
在 Google Cloud 控制台中,依序前往「API 和服務」>「憑證」頁面。
按一下頁面頂端的「建立憑證」,然後選取「
OAuth client ID」。在「Application Type」部分,選取「網頁應用程式」並提供名稱。
按一下「Create」(建立)
client_id和client_secret值將用於下一個步驟。
將 Google 設為供應商:
前往 Google Cloud 控制台的「Identity Providers」(識別資訊提供者) 頁面。
按一下「Add A Provider」。
從清單中選取「Google」。
在 Web SDK 設定中,輸入上一步的
client_id和client_secret值。在「Configure your application」(設定應用程式) 下方,按一下「Setup Details」(設定詳細資料)。
將設定複製到應用程式:
- 將
apiKey和authDomain值複製到範例的static/config.js,初始化 Identity Platform 用戶端 SDK。
- 將
部署服務
請按照下列步驟完成基礎架構佈建和部署作業:
使用控制台或 CLI,建立含有 PostgreSQL 資料庫的 Cloud SQL 執行個體:
gcloud sql instances create CLOUD_SQL_INSTANCE_NAME \ --database-version=POSTGRES_16 \ --region=CLOUD_SQL_REGION \ --cpu=2 \ --memory=7680MB \ --root-password=DB_PASSWORD
將 Cloud SQL 憑證值新增至
postgres-secrets.json:Node.js
Python
Java
使用控制台或 CLI 建立 Secret 版本:
gcloud secrets create idp-sql-secrets \ --replication-policy="automatic" \ --data-file=postgres-secrets.json
使用控制台或 CLI 為伺服器建立服務帳戶:
gcloud iam service-accounts create idp-sql-identity
使用控制台或 CLI,授予 Secret Manager 和 Cloud SQL 存取權的角色:
允許與伺服器相關聯的服務帳戶存取建立的密鑰:
gcloud secrets add-iam-policy-binding idp-sql-secrets \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
允許與伺服器相關聯的服務帳戶存取 Cloud SQL:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudsql.client
建立 Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
REPOSITORY是存放區名稱。在專案中,每個存放區位置的存放區名稱不得重複。
使用 Cloud Build 建構容器映像檔:
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Java
這個範例使用 Jib,透過常見的 Java 工具建構 Docker 映像檔。Jib 可最佳化容器建構作業,不需要 Dockerfile 或安裝 Docker。進一步瞭解如何使用 Jib 建構 Java 容器。
使用 gcloud 憑證輔助程式,授權 Docker 推送至 Artifact Registry。
gcloud auth configure-docker
使用 Jib Maven 外掛程式建構容器,並推送至 Artifact Registry。
mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
使用控制台或 CLI 將容器映像檔部署至 Cloud Run。請注意,伺服器部署後,未經驗證的使用者也能存取。這樣使用者才能載入用戶端並開始程序。伺服器會驗證手動新增至投票要求的 ID 權杖,驗證使用者身分。
gcloud run deploy idp-sql \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql \ --allow-unauthenticated \ --service-account idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --add-cloudsql-instances PROJECT_ID:REGION:CLOUD_SQL_INSTANCE_NAME \ --update-secrets CLOUD_SQL_CREDENTIALS_SECRET=idp-sql-secrets:latest
另外,請注意
--service-account、--add-cloudsql-instances和--update-secrets旗標,這些旗標分別指定服務身分、Cloud SQL 執行個體連線,以及含有版本的密鑰名稱 (做為環境變數)。
最後修飾
Identity Platform 要求您授權 Cloud Run 服務網址,做為使用者登入後允許的重新導向:
按一下右側面板中「Authorized Domains」下方的「Add Domain」,然後輸入 Cloud Run 服務網址。
您可以在建構或部署作業完成後,在記錄中找到服務網址,也可以隨時使用下列指令查看:
gcloud run services describe idp-sql --format 'value(status.url)'
-
按一下 OAuth 用戶端 ID 旁的鉛筆圖示進行編輯,然後點選「
Authorized redirect URIs click the」下方的「新增 URI」按鈕。在欄位中複製及貼上下列網址,然後點選頁面底部的「儲存」按鈕。
https://PROJECT_ID.firebaseapp.com/__/auth/handler
立即體驗
如要試用完整服務,請按照下列步驟操作:
在瀏覽器中前往上一個部署步驟提供的網址。
點選「使用 Google 帳戶登入」按鈕,然後完成驗證流程。
投下你的一票!
如下所示:
如果您選擇繼續開發這些服務,請注意,這些服務對 Google Cloud 其餘部分的 Identity and Access Management (IAM) 存取權有限,必須授予其他 IAM 角色,才能存取許多其他服務。
清除所用資源
為避免系統向您的 Google Cloud 帳戶收取額外費用,請刪除您在本教學課程中部署的所有資源。
刪除專案
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
刪除專案的方法如下:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除教學課程資源
刪除您在本教學課程中部署的 Cloud Run 服務。Cloud Run 服務在收到要求前不會產生費用。
如要刪除 Cloud Run 服務,請執行下列指令:
gcloud run services delete SERVICE-NAME
將 SERVICE-NAME 改為您的服務名稱。
您也可以從Google Cloud 控制台刪除 Cloud Run 服務。
移除您在教學課程設定期間新增的
gcloud預設區域設定:gcloud config unset run/region移除專案設定:
gcloud config unset project刪除在本教學課程中建立的其他 Google Cloud 資源:
後續步驟
- 深入瞭解如何從 Cloud Run 連線至 Cloud SQL
- 進一步瞭解登入方式和如何使用 Identity Platform 管理使用者
- 查看其他驗證開發人員、服務和使用者的方式,適用於部署至 Cloud Run 的服務
- 探索其他 Cloud Run 示範、教學課程和範例