Cloud Run 可讓您在多服務架構中保護內部工作負載,同時公開用戶端功能。在本教學課程中,您將建立安全的雙服務應用程式,其中包含公開前端 Markdown 編輯器,以及將 Markdown 文字轉譯為 HTML 的私人後端服務。
後端服務是私人的,使用 Cloud Run 內建的以 IAM 為基礎的服務對服務驗證功能,限制可呼叫服務的人員。這兩項服務都採用最小權限原則,除非必要,否則無法存取 Google Cloud 的其他部分。
本教學課程的限制或非目標
本教學課程不會說明使用者驗證,這種驗證方式會使用 Identity Platform 或 Firebase 驗證產生使用者 ID 權杖,並手動驗證使用者身分。如要進一步瞭解使用者驗證,請參閱 Cloud Run 的使用者驗證教學課程。
本教學課程不會示範如何結合 IAM 驗證和 ID 權杖方法,因為系統不支援這種做法。
目標
- 建立專屬服務帳戶,並授予最低權限,用於服務對服務驗證,以及服務存取 Google Cloud的其他部分。
- 編寫、建構及部署兩項會互相互動的服務至 Cloud Run。
- 在公開和私人 Cloud Run 服務之間提出要求。
費用
在本文件中,您會使用下列 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 API (如果尚未啟用)。
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。- 安裝並初始化 gcloud CLI。
- 安裝 curl 以試用服務
必要的角色
如要取得完成教學課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
- Cloud Build 編輯者 (
roles/cloudbuild.builds.editor) - Cloud Run 管理員 (
roles/run.admin) - 建立服務帳戶 (
roles/iam.serviceAccountCreator) - 專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin) - 服務帳戶使用者 (
roles/iam.serviceAccountUser) - 服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer) - 儲存空間管理員 (
roles/storage.admin) - Artifact Registry 存放區管理員 (
roles/artifactregistry.repoAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
設定 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 資訊主頁中查看區域。
擷取程式碼範例
如要擷取要使用的程式碼範例:
將範例應用程式存放區複製到 Cloud Shell 或本機電腦:
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 檔案,然後解壓縮。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
您也可以 下載範例 ZIP 檔案,然後解壓縮。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
您也可以 下載範例 ZIP 檔案,然後解壓縮。
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
您也可以 下載範例 ZIP 檔案,然後解壓縮。
變更為包含 Cloud Run 程式碼範例的目錄:
Node.js
cd nodejs-docs-samples/run/markdown-preview/
Python
cd python-docs-samples/run/markdown-preview/
Go
cd golang-samples/run/markdown-preview/
Java
cd java-docs-samples/run/markdown-preview/
C#
cd dotnet-docs-samples/run/markdown-preview/
查看私人 Markdown 轉譯服務
從前端的角度來看,Markdown 服務具有下列 API 規格:
/的一個端點- 預期 POST 要求
- POST 要求的內文為 Markdown 文字
您可以查看所有程式碼,瞭解是否有任何安全性疑慮,或只是瀏覽 ./renderer/ 目錄,進一步瞭解程式碼。請注意,本教學課程不會說明 Markdown 轉換程式碼。
推出私人 Markdown 轉譯服務
如要推送程式碼,請使用 Cloud Build 建構、上傳至 Artifact Registry,然後部署至 Cloud Run:
切換至
renderer目錄:Node.js
cd renderer/
Python
cd renderer/
Go
cd renderer/
Java
cd renderer/
C#
cd Samples.Run.MarkdownPreview.Renderer/
建立 Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
更改項目:
- 將 REPOSITORY 替換為存放區的專屬名稱。在專案中的每個存放區位置,存放區名稱不得重複。
- REGION:Artifact Registry 存放區要使用的 Google Cloud 區域。
執行下列指令,建構容器並發布至 Artifact Registry。
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
其中 PROJECT_ID 是 Google Cloud 專案 ID,
renderer則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
其中 PROJECT_ID 是 Google Cloud 專案 ID,
renderer則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
其中 PROJECT_ID 是 Google Cloud 專案 ID,
renderer則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
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/renderer
其中 PROJECT_ID 是 Google Cloud 專案 ID,
renderer則是您要為服務指定的名稱。成功後,您會看到「BUILD SUCCESS」訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
其中 PROJECT_ID 是 Google Cloud 專案 ID,
renderer則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
部署為存取權受限的私人服務。
Cloud Run 提供現成的存取控管和服務身分功能。存取控管功能提供驗證層,可限制使用者和其他服務叫用服務。服務身分可讓您建立權限有限的專屬服務帳戶,限制服務存取其他Google Cloud 資源。
建立服務帳戶,做為算繪服務的「運算身分」。根據預設,除了專案成員資格外,這項服務帳戶沒有其他權限。
指令列
gcloud iam service-accounts create renderer-identity
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
Markdown 轉譯服務不會直接與 Google Cloud中的任何其他項目整合。不需要其他權限。
使用
renderer-identity服務帳戶部署,並拒絕未經驗證的存取。指令列
gcloud run deploy renderer \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer \ --service-account renderer-identity \ --no-allow-unauthenticated
如果服務帳戶屬於同一個專案,Cloud Run 可以使用簡短形式的服務帳戶名稱,而非完整的電子郵件地址。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
試用私人 Markdown 轉譯服務
網路瀏覽器無法直接載入私人服務。請改用 curl 或類似的 HTTP 要求 CLI 工具,以便插入 Authorization 標頭。
如要將粗體文字傳送至服務,並查看服務將 Markdown 星號轉換為 HTML <strong> 標記,請按照下列步驟操作:
從部署作業輸出內容取得網址。
使用
gcloud衍生僅限開發使用的特殊身分權杖,以便進行驗證:TOKEN=$(gcloud auth print-identity-token)
建立 curl 要求,將原始 Markdown 文字做為網址逸出查詢字串參數傳遞:
curl -H "Authorization: Bearer $TOKEN" \ -H 'Content-Type: text/plain' \ -d '**Hello Bold Text**' \ SERVICE_URL
將 SERVICE_URL 替換為部署 Markdown 轉譯服務後提供的網址。
回應應為 HTML 程式碼片段:
<strong>Hello Bold Text</strong>
查看編輯器和算繪服務之間的整合
編輯器服務提供文字輸入 UI 和 HTML 預覽空間。繼續操作前,請先開啟 ./editor/ 目錄,查看先前擷取的程式碼。
接著,請瀏覽下列幾段程式碼,瞭解如何安全整合這兩項服務。
Node.js
render.js 模組會建立對私人轉譯器服務的已驗證要求。它會使用 Cloud Run 環境中的 Google Cloud 中繼資料伺服器建立身分權杖,並將其新增至 HTTP 要求,做為Authorization標頭的一部分。
在其他環境中,render.js 會使用應用程式預設憑證,向 Google 伺服器要求權杖。
從 JSON 剖析 Markdown,並傳送至轉譯器服務,轉換為 HTML。
Python
new_request 方法會建立對私人服務的已驗證要求。它會使用 Cloud Run 環境中的 Google Cloud 中繼資料伺服器建立身分權杖,並將其新增至 HTTP 要求,做為Authorization標頭的一部分。
在其他環境中,new_request 會使用應用程式預設憑證進行驗證,向 Google 伺服器要求身分權杖。
從 JSON 剖析 Markdown,並傳送至轉譯器服務,轉換為 HTML。
Go
RenderService 會向私人服務建立已驗證的要求。它會使用 Cloud Run 環境中的 Google Cloud 中繼資料伺服器建立身分識別權杖,並將其新增至 HTTP 要求,做為Authorization標頭的一部分。
在其他環境中,RenderService 會使用應用程式預設憑證進行驗證,向 Google 伺服器要求身分權杖。
要求會傳送至轉譯器服務,並加入要轉換為 HTML 的 Markdown 文字。系統會處理回應錯誤,區分通訊問題和算繪功能。
Java
makeAuthenticatedRequest 會建立對私人服務的已驗證要求。它會使用 Cloud Run 環境中的 Google Cloud 中繼資料伺服器建立身分權杖,並將其新增至 HTTP 要求,做為Authorization標頭的一部分。
在其他環境中,makeAuthenticatedRequest 會使用應用程式預設憑證進行驗證,向 Google 伺服器要求身分權杖。
從 JSON 剖析 Markdown,並傳送至轉譯器服務,轉換為 HTML。
C#
GetAuthenticatedPostResponse 會建立對私人服務的已驗證要求。它會使用 Cloud Run 環境中的 Google Cloud 中繼資料伺服器建立身分權杖,並將其新增至 HTTP 要求,做為Authorization標頭的一部分。
在其他環境中,GetAuthenticatedPostResponse 會使用應用程式預設憑證進行驗證,向 Google 伺服器要求身分權杖。
從 JSON 剖析 Markdown,並傳送至轉譯器服務,轉換為 HTML。
推出公開編輯器服務
如要建構及部署程式碼,請按照下列步驟操作:
切換至
editor目錄:Node.js
cd ../editor
Python
cd ../editor
Go
cd ../editor
Java
cd ../editor
C#
cd ../Samples.Run.MarkdownPreview.Editor/
執行下列指令,建構容器並發布至 Artifact Registry。
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
其中 PROJECT_ID 是 Google Cloud 專案 ID,
editor則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Container Registry 中,日後如有需要,可以重複使用。
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
其中 PROJECT_ID 是 Google Cloud 專案 ID,
editor則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
其中 PROJECT_ID 是 Google Cloud 專案 ID,
editor則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
Java
這個範例使用 Jib,透過常見的 Java 工具建構 Docker 映像檔。Jib 可最佳化容器建構作業,不需要 Dockerfile 或安裝 Docker。進一步瞭解如何使用 Jib 建構 Java 容器。mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
其中 PROJECT_ID 是 Google Cloud 專案 ID,
editor則是您要為服務指定的名稱。成功後,您會看到「BUILD SUCCESS」訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
其中 PROJECT_ID 是 Google Cloud 專案 ID,
editor則是您要為服務指定的名稱。若成功執行,您會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry,日後如有需要,可以重複使用。
部署為私人服務,並授予轉譯服務特殊存取權。
建立服務帳戶,做為私人服務的「運算身分」。根據預設,除了專案成員資格外,這項服務帳戶沒有其他權限。
指令列
gcloud iam service-accounts create editor-identity
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
編輯器服務不需要與 Google Cloud 中 Markdown 轉譯服務以外的任何項目互動。
將
editor-identity運算身分的存取權授予 Markdown 轉譯服務。任何使用這個帳戶做為運算身分的服務,都會具備這項權限。指令列
gcloud run services add-iam-policy-binding renderer \ --member serviceAccount:editor-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/run.invoker
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
由於這是在轉譯服務的背景中授予叫用者角色,因此轉譯服務是編輯者唯一可以叫用的私人 Cloud Run 服務。
使用
editor-identity服務帳戶部署,並允許公開、未經驗證的存取。指令列
gcloud run deploy editor --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor \ --service-account editor-identity \ --set-env-vars EDITOR_UPSTREAM_RENDER_URL=SERVICE_URL \ --allow-unauthenticated
更改項目:
- PROJECT_ID:專案 ID
- SERVICE_URL:部署 Markdown 轉譯服務後提供的網址。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
部署編輯器服務:
授予
allUsers叫用服務的權限:
瞭解 HTTPS 流量
使用這些服務轉譯 Markdown 時,會涉及三個 HTTP 要求。
editor-identity 的前端服務會叫用轉譯服務。editor-identity和renderer-identity的權限有限,因此任何安全性漏洞或程式碼插入對其他 Google Cloud 資源的存取權都有限。立即體驗
如要試用完整的雙服務應用程式,請按照下列步驟操作:
在瀏覽器中前往上一個部署步驟提供的網址。
試著編輯左側的 Markdown 文字,然後點選按鈕,即可在右側預覽。
如下所示:

如果您選擇繼續開發這些服務,請注意,這些服務對 Google Cloud 其餘部分的 Identity and Access Management (IAM) 存取權有限,必須授予其他 IAM 角色,才能存取許多其他服務。
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您已使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
刪除專案的方法如下:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除教學課程資源
刪除您在本教學課程中部署的 Cloud Run 服務:
gcloud
gcloud run services delete editor gcloud run services delete renderer
您也可以從Google Cloud 控制台刪除 Cloud Run 服務。
移除您在教學課程設定期間新增的 Google Cloud CLI 預設設定。
gcloud config unset run/region移除專案設定:
gcloud config unset project刪除在本教學課程中建立的其他 Google Cloud 資源:
- 從 Artifact Registry 刪除編輯器容器映像檔
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor - 從 Artifact Registry 刪除名為
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer的轉譯容器映像檔 - 刪除編輯者服務帳戶
editor-identity@PROJECT_ID.iam.gserviceaccount.com - 刪除轉譯服務帳戶
renderer-identity@PROJECT_ID.iam.gserviceaccount.com
- 從 Artifact Registry 刪除編輯器容器映像檔
後續步驟
- 請參閱安全使用 IAM 檢查清單,進一步保護專案
- 擴充這個範例應用程式,使用 Cloud Monitoring 自訂指標追蹤 Markdown 使用情形
- 請參閱 Pub/Sub 教學課程,瞭解如何建構安全、非同步的微服務