透過 Cloud Run 私人存取 Cloud Storage 全球端點和區域端點

1. 簡介

Google API 端點

Google Cloud API 提供不同類型的端點來存取服務,主要差異在於處理要求路由、資料落地和區域隔離的方式。

請參閱產品說明文件,瞭解 API 端點類型

以下是全球、區域和位置端點的詳細說明:

  1. 全球端點
  • 格式:{service}.googleapis.com (例如 storage.googleapis.com)
  • 說明:這些端點提供服務的單一全域存取點。網址中未指定區域。
  • 轉送:要求會由全球 Google Front End (GFE) 和全球服務負載平衡器進行轉送,通常會將流量導向最近的健康區域,以盡量減少延遲。
  • TLS 終止:發生在最靠近用戶端的 GFE,可能位於資料或資源所在的 Google Cloud 區域外部。
  • 資料落地:不保證傳輸中的資料符合資料落地規定。資料在 GFE 解密後,可能會跨越區域界線。
  • 區域隔離:有限。後端通常是區域性的,但進入點和負載平衡是全域性的,因此全域基礎架構某一部分的問題可能會影響其他區域的服務。
  • 使用案例:一般用途的存取權,重點是為分散各地的使用者提供低延遲服務,且傳輸中的嚴格資料落地規定並非主要考量。
  1. 區域端點 (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)。

  1. 位置端點 (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:

如何使用 PSC 後端存取 Google API:

Cloud Run 將流量傳送至虛擬私有雲網路

直接虛擬私有雲輸出流量可為 Cloud Run 提供更強大的基礎架構,並簡化虛擬私有雲輸出流量設定,優點包括:

  • 設定:Cloud Run 服務和作業可將流量傳送至虛擬私有雲網路,無須管理無伺服器 VPC 存取連接器,因此不會產生額外負擔。
  • 費用:您只需支付網路流量費用,這項費用會隨著服務本身調度至零。
  • 安全性:您可以在服務修訂版本中直接使用網路標記,進一步提升網路安全性。
  • 效能:延遲時間較短、處理量較高。

您可以啟用直接虛擬私有雲輸出流量,讓 Cloud Run 服務、函式、作業或工作站集區將所有流量傳送至虛擬私有雲網路。

2. 學習內容

  • 如何為全域 Google API 建立 PSC 端點。
  • 如何為區域性 Google API 建立 PSC 端點。
  • 如何變更 Cloud Run 程式碼中的 API 端點,以及設定輸出流量的網路。

3. 實驗室整體架構

8f5328678688f210.png

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 控制台,找出該項工作。點選工作並查看記錄檔的記錄。您會看到類似下方的作業執行結果。

bae25d504ea20384.png

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

aa0468dc463f4320.png

已建立新的值區。您可以前往 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 控制台,找出該項工作。按一下工作,然後查看工作記錄。您會看到類似下方的作業執行結果。

1065ce25136d355e.png

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

837afb2f95a7049b.png

已建立新的值區。您可以前往 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 的私人存取權。