1. 簡介
Google API 端點
Google Cloud API 提供不同類型的端點來存取服務,主要差異在於處理要求路由、資料落地和區域隔離的方式。
請參閱產品說明文件,瞭解 API 端點類型。
以下是全球、區域和位置端點的詳細說明:
- 全球端點
- 格式:{service}.googleapis.com (例如 storage.googleapis.com)
- 說明:這些端點提供服務的單一全域存取點。網址中未指定區域。
- 轉送:要求會由全球 Google Front End (GFE) 和全球服務負載平衡器進行轉送,通常會將流量導向最近的健康區域,以盡量減少延遲。
- TLS 終止:發生在最靠近用戶端的 GFE,可能位於資料或資源所在的 Google Cloud 區域外部。
- 資料落地:不保證傳輸中的資料符合資料落地規定。資料在 GFE 解密後,可能會跨越區域界線。
- 區域隔離:有限。後端通常是區域性的,但進入點和負載平衡是全域性的,因此全域基礎架構某一部分的問題可能會影響其他區域的服務。
- 使用案例:一般用途的存取權,重點是為分散各地的使用者提供低延遲服務,且傳輸中的嚴格資料落地規定並非主要考量。
- 區域端點 (REP)
- 格式:{service}.{location}.rep.googleapis.com (例如 storage.us-east1.rep.googleapis.com)
- 說明:這些區域旨在提供高強度區域隔離和資料落地保證。位置 (特定 Google Cloud 區域) 會指定為子網域。這是現代標準,將取代位置端點。
- 轉送:使用完全區域化的前端堆疊,包括區域性外部負載平衡器和區域性服務負載平衡。從 DNS 到服務後端,整個要求路徑都會留在指定區域內。
- TLS 終止:發生於區域性外部負載平衡器內的指定區域。
- 資料落地:保證資料在傳輸和使用期間都會保留在指定區域,符合嚴格的法規遵循和主權要求。
- 區域隔離:強。單一區域前端基礎架構發生故障時,不會影響其他區域。
- 用途:應用程式需要嚴格的資料落地、高度區域隔離和法規遵循。
請注意,並非所有 Google API 都有區域性端點,如需支援的所有區域性端點,請參閱這裡。
多區域區域端點 (mREP) 也是區域端點,例如 us (美國)、eu (歐盟) 等等 (例如 storage.us.rep.googleapis.com)。
- 位置端點 (LEP)
- 格式:{location}-{service}.googleapis.com (例如 us-east1-storage.googleapis.com)
- 說明:這些端點是早期提供特定位置存取權的方法。位置資訊是主要主機名稱的一部分。注意:區域性端點將取代位置端點。
- 轉送:仍依賴全球 Google 前端。
- TLS 終止:通常發生在 GFE,可能不在主機名稱指定的區域。
- 資料落地:無法保證來自公用網際網路的流量在傳輸期間會留在指定區域。
- 區域隔離:比區域端點弱,因為使用全域前端基礎架構。
- 用途:過去用於某些區域存取情境,但現在一般不建議使用,建議改用區域端點,以獲得更強大的保證。
適用於 Google API 的 Private Service Connect
Private Service Connect 是 Google Cloud 網路功能,可讓消費者存取供應商服務。包括透過使用者虛擬私有雲中代管的私人端點連線至 Google API。
如何使用 PSC 端點存取 Google API:
- 全域 Google API 的 PSC 端點
- 區域 Google API 的 PSC 端點
- 您可以使用全域 Google API 的 PSC 端點,私下存取位置資訊 Google API。
如何使用 PSC 後端存取 Google API:
- Global Google API 的 PSC 後端
- 區域 Google API 的 PSC 後端
- 您可以使用全域 Google API 的 PSC 後端,私下存取區域性 Google API。
Cloud Run 將流量傳送至虛擬私有雲網路
直接虛擬私有雲輸出流量可為 Cloud Run 提供更強大的基礎架構,並簡化虛擬私有雲輸出流量設定,優點包括:
- 設定:Cloud Run 服務和作業可將流量傳送至虛擬私有雲網路,無須管理無伺服器 VPC 存取連接器,因此不會產生額外負擔。
- 費用:您只需支付網路流量費用,這項費用會隨著服務本身調度至零。
- 安全性:您可以在服務修訂版本中直接使用網路標記,進一步提升網路安全性。
- 效能:延遲時間較短、處理量較高。
您可以啟用直接虛擬私有雲輸出流量,讓 Cloud Run 服務、函式、作業或工作站集區將所有流量傳送至虛擬私有雲網路。
2. 學習內容
- 如何為全域 Google API 建立 PSC 端點。
- 如何為區域性 Google API 建立 PSC 端點。
- 如何變更 Cloud Run 程式碼中的 API 端點,以及設定輸出流量的網路。
3. 實驗室整體架構

4. 準備步驟
實驗室作業所需的 IAM 角色
首先,您要在專案層級將必要的 IAM 角色指派給 GCP 帳戶。
- Compute 網路管理員 (
roles/compute.networkAdmin):這個角色可讓您完全控管 Compute Engine 網路資源。 - 記錄管理員 (
roles/logging.admin):這個角色可授予所有記錄權限和相關權限的存取權。 - 服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin):這個角色可讓您啟用、停用及檢查服務狀態、檢查作業,以及使用消費者專案的配額和帳單。 - DNS 管理員 (
roles/dns.admin):這個角色可授予所有 Cloud DNS 資源的讀寫權限 - Cloud Run 管理員 (
roles/run.admin):這個角色可讓您全面控管所有 Cloud Run 資源。 - Storage 管理員 (
roles/storage.admin):這個角色可授予物件和 bucket 的完整控制權。
啟用 API
在 Cloud Shell 中,確認專案設定正確,並設定環境變數。
在 Cloud Shell 中執行下列操作:
gcloud auth login
gcloud config set project <your project id>
export project_id=<your project id>
export region=<your region>
export zone=$region-a
echo $project_id
echo $region
在專案中啟用所有必要的 Google API。在 Cloud Shell 中執行下列操作:
gcloud services enable \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
run.googleapis.com \
compute.googleapis.com \
dns.googleapis.com \
servicedirectory.googleapis.com \
networkconnectivity.googleapis.com
建立虛擬私有雲
在專案中,建立採用自訂子網路模式的虛擬私有雲網路。在 Cloud Shell 中執行下列操作:
gcloud compute networks create mynet \
--subnet-mode=custom
建立子網路
在 Cloud Shell 中執行下列操作,建立 IPv4 子網路:
gcloud compute networks subnets create mysubnet \
--network=mynet \
--range=10.0.0.0/24 \
--region=$region
建立 Cloud NAT 和 Cloud Router
Cloud NAT 可讓 Cloud Run 作業連線至外部網站。
gcloud compute routers create $region-cr \
--network=mynet \
--region=$region
gcloud compute routers nats create $region-nat \
--router=$region-cr \
--region=$region \
--nat-all-subnet-ip-ranges \
--auto-allocate-nat-external-ips
5. 為 Cloud Storage 建立 PSC 端點
您將為 Cloud Storage 建立兩個 PSC 端點,一個用於全域範圍,另一個用於區域範圍。
建立全球範圍的 PSC 端點
透過 Private Service Connect,您可以使用虛擬私有雲網路中的全域內部 IP 位址,建立全域範圍的私人端點。
您需要分配虛擬私有雲中未定義的專屬 IP 位址。請參閱這份IP 位址規定文件。
在 Cloud Shell 中執行下列操作,建立 IP 位址。請將 –addresses=<pscendpointip> 變更為您分配到的 IP 位址。
gcloud compute addresses create pscglobalip \
--global \
--purpose=PRIVATE_SERVICE_CONNECT \
--addresses=<pscendpointip> \
--network=mynet
pscendpointip=$(gcloud compute addresses list --filter=name:pscglobalip --format="value(address)")
echo $pscendpointip
建立轉送規則,將端點連線至 Google API 和服務。
gcloud compute forwarding-rules create pscendpoint \
--global \
--network=mynet \
--address=pscglobalip \
--target-google-apis-bundle=all-apis
在 Cloud DNS 中檢查 p.googleapis.com
建立端點時,系統會自動建立下列 DNS 設定:
- 系統會為 p.googleapis.com 建立 Service Directory 私人 DNS 區域。
- 對於透過 Private Service Connect 提供的部分常用 Google API 和服務,系統會在 p.googleapis.com 中建立 DNS 記錄,這些服務的預設 DNS 名稱結尾為 googleapis.com。
全域端點已向 Service Directory 註冊。您將使用 storage-[PSC 端點名稱].p.googleapis.com 存取 Cloud Storage。詳情請參閱產品說明文件。
執行指令,檢查是否已建立 p.googleaps.com 區域。
gcloud dns managed-zones list
如要使用預設 DNS 名稱 storage.googleapis.com,請在 Cloud DNS 中建立私人區域 storage.googleapis.com,並新增指向全域範圍 IP 位址 PSC 端點的頂點記錄。
為 Cloud Storage 建立區域範圍的 PSC 端點
您需要虛擬私有雲子網路中的一個 IP。執行下列指令,系統會為 PSC 端點分配子網路的 IP。
gcloud network-connectivity regional-endpoints create psc-regional-endpoint \
--region=$region \
--network=projects/$project_id/global/networks/mynet \
--subnetwork=projects/$project_id/regions/$region/subnetworks/mysubnet \
--target-google-api=storage.us-central1.rep.googleapis.com
取得在上一步驟中建立的端點 IP 位址。
regionalip=$(gcloud network-connectivity regional-endpoints describe psc-regional-endpoint --region=$region --format="value(address)")
echo $regionalip
您將使用 storage.us-central1.rep.googleapis.com 存取 Cloud Storage。您需要在 Cloud DNS 中,為 storage.us-central1.rep.googleapis.com 建立私人區域,以及為您剛才為區域端點建立的 IP 位址建立頂點記錄。
為 Cloud Storage 區域端點建立私人區域
您可以使用 storage.[region name].rep.googleapis.com 存取 Cloud Storage 區域端點。
您需要在 Cloud DNS 中建立私人區域,並新增指向 Cloud Storage 區域端點 IP 位址的頂點記錄。
在下列指令中,us-central1 是範例區域。您應使用區域名稱建立可用區。
gcloud dns managed-zones create psc-regional-endpoint-zone \
--description="" \
--dns-name="storage.us-central1.rep.googleapis.com" \
--visibility="private" \
--networks="mynet"
gcloud dns record-sets create storage.us-central1.rep.googleapis.com. \
--rrdatas=$regionalip \
--ttl=300 \
--type=A \
--zone=psc-regional-endpoint-zone
6. 使用全域範圍的 PSC 端點設定 Cloud Run 工作
取得程式碼
首先,您會探索 Node.js 應用程式,擷取網頁的螢幕截圖並儲存至 Cloud Storage。稍後,您會為應用程式建構容器映像檔,並在 Cloud Run 上以工作形式執行。
在 Cloud Shell 中執行下列指令,從這個存放區複製應用程式程式碼:
git clone https://github.com/GoogleCloudPlatform/jobs-demos.git
前往包含應用程式的目錄:
cd jobs-demos/screenshot
您應該會看到這個檔案版面配置:
|
├── Dockerfile
├── README.md
├── screenshot.js
├── package.json
以下簡要說明各個檔案:
- screenshot.js 包含應用程式的 Node.js 程式碼。應用程式會擷取網頁的螢幕截圖,並儲存在 Cloud Storage 中。
- package.json 定義程式庫依附元件。
- Dockerfile 會定義容器映像檔。
開啟 screenshot.js 程式碼,將 apiEndpoint 變更為 PSC 全球端點。搜尋程式碼,然後將 const storage = new Storage(); 替換為下列程式碼:
const storage = new Storage(
{
apiEndpoint:'https://storage-pscendpoint.p.googleapis.com.',
useAuthWithCustomEndpoint: true
}
);
部署工作
建立作業前,請先建立用於執行作業的服務帳戶。
gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"
將 storage.admin 角色授予服務帳戶,以便建立 bucket 和物件。
gcloud projects add-iam-policy-binding $project_id \
--role roles/storage.admin \
--member serviceAccount:screenshot-sa@$project_id.iam.gserviceaccount.com
將「Storage 物件使用者」角色、「記錄檔寫入者」角色和「Artifact Registry 存放區管理員」角色授予預設 Compute 服務帳戶。
project_number=$(gcloud projects describe $project_id --format="value(projectNumber)")
gcloud projects add-iam-policy-binding $project_id \
--role roles/storage.objectUser \
--member serviceAccount:$project_number-compute@developer.gserviceaccount.com
gcloud projects add-iam-policy-binding $project_id \
--role roles/logging.logWriter \
--member serviceAccount:$project_number-compute@developer.gserviceaccount.com
gcloud projects add-iam-policy-binding $project_id \
--role roles/artifactregistry.repoAdmin \
--member serviceAccount:$project_number-compute@developer.gserviceaccount.com
您將為 Cloud Run 作業啟用直接虛擬私有雲輸出流量,將所有流量傳送至虛擬私有雲網路。
在 Cloud Shell 中執行下列操作:
gcloud run jobs deploy screenshot-1 \
--source=. \
--args="https://example.com" \
--args="https://cloud.google.com" \
--tasks=2 \
--task-timeout=5m \
--region=$region \
--set-env-vars=BUCKET_NAME=screenshot-$project_id-$RANDOM \
--service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
--vpc-egress=all-traffic \
--network=mynet \
--subnet=mysubnet
執行工作
在 Cloud Shell 中執行下列操作:
gcloud run jobs execute screenshot-1 --region=$region
檢查工作狀態和記錄。前往 Cloud Run 控制台,找出該項工作。點選工作並查看記錄檔的記錄。您會看到類似下方的作業執行結果。

如要查看詳細的工作執行記錄,請按一下工作中的「查看記錄」。您會看到類似下方的作業記錄。

已建立新的值區。您可以前往 Cloud Storage 控制台,查看新建立的 bucket。請注意,使用 Cloud Storage 全域端點時,bucket 是多區域 bucket。你可以查看上傳至 bucket 的圖片。
測試結果顯示 Cloud Run 私下存取了 Cloud Storage 全球端點,這是您在 Cloud Run 工作中變更的項目:
apiEndpoint:‘https://storage-pscendpoint.p.googleapis.com.'
7. 使用區域範圍的 PSC 端點設定 Cloud Run 工作
在程式碼中,您會將 apiEndpoint 變更為具有區域範圍的 PSC 端點。
搜尋程式碼,然後將 const storage = new Storage(); 替換為下列程式碼 ( 我們以 us-central1 為例。請改用您所在區域的帳戶:
const storage = new Storage(
{
apiEndpoint:'https://storage.us-central1.rep.googleapis.com.',
useAuthWithCustomEndpoint: true
}
);
部署工作
確認您位於含有應用程式的目錄 (jobs-demos/screenshot)。
pwd
您可為作業啟用直接虛擬私有雲輸出功能,將所有流量傳送至虛擬私有雲網路。
在 Cloud Shell 中執行下列操作:
gcloud run jobs deploy screenshot-2 \
--source=. \
--args="https://example.com" \
--args="https://cloud.google.com" \
--tasks=2 \
--task-timeout=5m \
--region=$region \
--set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID-$RANDOM \
--service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
--vpc-egress=all-traffic \
--network=mynet \
--subnet=mysubnet
執行工作
在 Cloud Shell 中執行下列操作:
gcloud run jobs execute screenshot-2 --region=$region
檢查工作狀態和記錄。前往 Cloud Run 控制台,找出該項工作。按一下工作,然後查看工作記錄。您會看到類似下方的作業執行結果。

如要查看詳細的工作執行記錄,請按一下「查看記錄」。您會看到類似下方的作業記錄。

已建立新的值區。您可以前往 Cloud Storage 控制台,查看新建立的 bucket。請注意,使用 Cloud Storage 地區端點時,值區是單一地區值區。你可以查看上傳至 bucket 的圖片。
測試結果顯示 Cloud Run 私下存取了您在 Cloud Run 工作中變更的 Cloud Storage 區域端點:
apiEndpoint:‘https://storage.us-central1.rep.googleapis.com.'
8. 清理
清除 Cloud Run 工作
gcloud run jobs delete screenshot-1 \
--region=$region --quiet
gcloud run jobs delete screenshot-2 \
--region=$region --quiet
gcloud iam service-accounts delete screenshot-sa@$project_id.iam.gserviceaccount.com --quiet
清除 PSC 端點
gcloud compute forwarding-rules delete pscendpoint \
--global --quiet
gcloud network-connectivity regional-endpoints delete psc-regional-endpoint \
--region=$region --quiet
gcloud compute addresses delete pscglobalip \
--global --quiet
清理 Cloud NAT、Cloud Router 和 VPC
gcloud compute routers nats delete $region-nat \
--router=$region-cr \
--region=$region --quiet
gcloud compute routers delete $region-cr \
--region=$region --quiet
gcloud compute networks subnets delete mysubnet \
--region=$region --quiet
gcloud compute networks delete mynet --quiet
9. 恭喜
您已成功透過全域端點和區域端點,測試 Cloud Run 對 Cloud Storage 的私人存取權。