本文說明如何使用 Cloud Run 和 Identity-Aware Proxy,從 Cloud Storage 提供安全靜態內容。
Cloud Run 可讓您託管網路伺服器,從私有 Cloud Storage bucket 提供靜態內容。新增 IAP 有助於保護 Cloud Run 服務,防止未經授權的存取行為,同時避免在內容變更時重建容器映像檔。
Cloud Storage 靜態網站託管服務只會提供公開內容,且必須授予 allUsers 讀取權限。如果貴機構使用禁止公開存取或網域限定共用等政策限制公開值區,就無法使用內建的 Cloud Storage 靜態網站代管功能。請改為將值區設為私有、在 Cloud Run 上部署 NGINX 網路伺服器,並將值區掛接為磁碟區,然後使用 IAP 控制 Cloud Run 服務的存取權。
事前準備
如要完成本文中的操作說明,您需要下列項目:
- 已啟用計費功能的 Google Cloud 專案。 前往 Google Cloud 控制台
- 含有靜態檔案的私人 Cloud Storage 值區 (例如
index.html、CSS 和圖片)。確認 bucket 不是公開。 - 已安裝 Google Cloud CLI。
授予 Cloud Storage bucket 的存取權
Cloud Run 需要權限,才能從您的私人 Cloud Storage bucket 讀取檔案。您必須授予 Cloud Run 服務身分 bucket 的「Storage 物件檢視者」角色 (roles/storage.objectViewer)。
建議您為 Cloud Run 服務使用使用者管理的服務帳戶,而非預設的 Compute Engine 服務帳戶。
建立服務帳戶,做為服務身分:
gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \ --description="Service account for Cloud Run serving Cloud Storage" \ --display-name="Cloud Run Cloud Storage Reader"將 bucket 的「Storage 物件檢視者」
roles/storage.objectViewer角色授予服務帳戶:gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/storage.objectViewer"
部署 Cloud Run 服務
將 NGINX 網路伺服器部署至 Cloud Run,並掛接 Cloud Storage 值區。如要支援磁碟區掛接,必須使用第二代執行環境。
如要掛接值區,請使用磁碟區旗標部署服務:
gcloud run deploy SERVICE_NAME \
--image=nginx \
--port=80 \
--execution-environment=gen2 \
--service-account=RUN_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \
--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 專案 IDBUCKET_NAME:Cloud Storage bucket 的名稱
值區會掛接至 /usr/share/nginx/html,這是 NGINX 尋找靜態資產的預設目錄。也就是說,儲存空間中的檔案會直接對應至服務的根路徑。舉例來說,儲存在 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 磁碟區」。