為 Cloud Storage 值區啟用 IAP

本文說明如何使用 Cloud Run 和 Identity-Aware Proxy,透過 Cloud Storage 提供安全的靜態內容。

Cloud Run 可讓您託管網路伺服器,從私人 Cloud Storage bucket 提供靜態內容。新增 IAP 有助於保護 Cloud Run 服務,防止未經授權的存取,同時避免在內容變更時重新建構容器映像檔。

Cloud Storage 靜態網站託管功能只會提供公開內容,且必須授予 allUsers 的讀取權限。如果貴組織使用禁止公開存取或網域限制共用等組織權限限制政策限制公開 bucket,就無法使用內建的 Cloud Storage 靜態網站託管功能。請改為將 bucket 設為私人,在 Cloud Run 部署 NGINX 網路伺服器,並將 bucket 掛接為磁碟區,然後使用 IAP 控管 Cloud Run 服務的存取權。

事前準備

如要完成本文件中的操作說明,您需要:

  • 已啟用計費功能的 Google Cloud 專案。前往 Google Cloud 控制台

  • 包含靜態檔案 (例如 index.html、CSS 和圖片) 的私人 Cloud Storage bucket。確認 bucket 並未公開。

  • 已安裝 Google Cloud CLI。

授予 Cloud Storage bucket 存取權

Cloud Run 必須取得權限,才能從私人 Cloud Storage bucket 讀取檔案。您必須將 bucket 的 Storage 物件檢視者 (roles/storage.objectViewer) 角色授予 Cloud Run 服務身分。

建議您為 Cloud Run 服務使用使用者自行管理的服務帳戶,而非預設的 Compute Engine 服務帳戶。

  1. 建立要用作服務身分的服務帳戶:

    gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \
        --description="Service account for Cloud Run serving Cloud Storage" \
        --display-name="Cloud Run Cloud Storage Reader"
    
  2. 將 bucket 的 Storage 物件檢視者 (roles/storage.objectViewer) 角色授予服務帳戶:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID." \
        --role="roles/storage.objectViewer"
    

部署 Cloud Run 服務

將 NGINX 網路伺服器部署至 Cloud Run,並掛接 Cloud Storage bucket。您必須使用第二代執行環境,才能支援磁碟區掛接。

如要掛接 bucket,請使用磁碟區旗標部署服務:

gcloud run deploy SERVICE_NAME \
    --image=nginx \
    --port=80 \
    --execution-environment=gen2 \
    --service-account=RUN_SERVICE_ACCOUNT@PROJECT_ID. \
    --add-volume=name=static,type=cloud-storage,bucket=BUCKET_NAME,readonly=true \
    --add-volume-mount=volume=static,mount-path=/usr/share/nginx/html \
    --no-allow-unauthenticated

更改下列內容:

  • SERVICE_NAME:Cloud Run 服務名稱

  • RUN_SERVICE_ACCOUNT:您在上一個步驟中建立的服務帳戶

  • PROJECT_ID:您的 Google Cloud 專案 ID

  • BUCKET_NAME:Cloud Storage bucket 的名稱

bucket 會掛接至 /usr/share/nginx/html,這是 NGINX 尋找靜態資產的預設目錄。也就是說,bucket 中的檔案會直接對應至服務的根路徑。舉例來說,儲存在 gs://BUCKET_NAME/index.html 的檔案可透過 https://SERVICE_URL/index.html 存取。

如要驗證部署作業,請確認服務會封鎖未經驗證的存取,並在未提供憑證的情況下存取時傳回 403 Forbidden 狀態:

curl -I SERVICE_URL

或者,您也可以先測試容器是否正確轉譯私人 Cloud Storage bucket 中的檔案,再設定 IAP 存取權。請執行下列指令,使用開發人員憑證傳送已驗證的要求:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

將 SERVICE_URL 替換為 Cloud Run 服務的網址。

啟用 IAP

部署 Cloud Run 服務後,您可以啟用 IAP 來保護服務。

建議您直接在 Cloud Run 服務上啟用 IAP。如需操作說明,請參閱「為 Cloud Run 設定 IAP」。

或者,如果您在 Cloud Run 服務前方使用外部 HTTPS 負載平衡器,則可在後端服務上啟用 IAP。如需操作說明,請參閱「透過後端服務或負載平衡器啟用 IAP」。

快取和效能

使用 Cloud Storage 磁碟區掛接時,Cloud Run 讀取的每個檔案都會轉譯為 Cloud Storage API 呼叫。如要盡可能縮短延遲時間並降低 API 費用,您可以在網路伺服器中設定快取 (例如使用 NGINX 快取指令),或設定 Cloud Storage FUSE 掛接選項。

如果您使用外部 HTTPS 負載平衡器,也可以在後端服務上啟用 Cloud CDN。IAP 與 Cloud CDN 無法在同一個後端服務上並存,因此如果兩者都需要,可能需要相應調整架構。

限制

從 Cloud Storage 磁碟區掛接讀取檔案的速度,可能比存取本機檔案系統慢。如要縮短讀取延遲時間,請設定快取。

其他用途

您也可以在其他情境使用 Cloud Storage 磁碟區掛接:

  • 事件驅動函式:函式直接從檔案系統讀取上傳的檔案。

  • 生成式 AI 應用程式:應用程式使用標準檔案系統讀取作業,從 Cloud Storage bucket 載入向量資料庫 (例如 Chroma)。

替代方案:掛接 NFS 磁碟區

如果檔案儲存在 Filestore 或自行託管的 NFS 伺服器,您可以將 NFS 磁碟區掛接至 Cloud Run 服務,而非 Cloud Storage bucket。詳情請參閱「掛接 NFS 磁碟區」。