昨天講環境變數、URL、log 這些日常操作。今天收尾兩件事:服務帳號的權限邊界,以及一件我覺得所有雲端教學都該做但很少做的事,在同一頁附上刪除指令。
Cloud Run 預設可以設成允許匿名存取(--allow-unauthenticated),做 demo 很方便。真的要 agent 互打的話會需要帶 token,這部分我在 codelab 階段沒有完整實作,先標一句未實測,不寫成教學。
「允許匿名存取」聽起來只是個方便的開關,代價卻不小:等於任何知道這個 URL 的人都能呼叫你的 agent。demo 給評審看的時候這是優點,對方不用先跟你要 token 就能試。但一旦這個 agent 背後真的接了要付費的 LLM 呼叫,匿名就代表任何人都能刷你的額度,這在正式環境是不能接受的風險,跟 Day 24 講的 --min 1 持續計費是同一種性質。
要讓 agent 互打帶 token,方向大致是把呼叫方的 service account 加進被呼叫服務的 IAM invoker 名單,呼叫時附上識別身分的憑證。這條路我沒有真的走過,方向是從文件推的,不寫成教學步驟,也不假裝自己驗證過。
gcloud run services delete <svc> --region <region>
我想把這件事講成一個原則,而不只是一條指令:
部署任何雲端資源時,同一頁就附上刪除指令。
不要放在文章最後、不要放在附錄、不要寫成「記得清理喔」。就寫在建立指令的正下方。
理由很簡單。教學文件的讀者跟著做完 demo 之後就走了,沒有人會回頭找清理步驟。做完 demo 的心理狀態是「跑起來了,收工」,不是「翻到文件最後一頁找清理段落」。而昨天講的 --min 1 這種參數會在他忘記之後繼續計費。教學作者省下的那三行,由讀者的信用卡付。
要點名的清單:--min-instances、常駐 VM、Cloud SQL 實例、負載平衡器、保留的靜態 IP。這幾樣的共同點是「沒有流量也收錢」。這件事之所以反直覺,是因為 Cloud Run 本身「零流量零費用」的印象太深,讀者會帶著這個印象去理解整個專案,卻忽略了掛在旁邊的這幾樣資源走的是完全不同的計費模型,常態計費,不跟著流量走。
Cloud Run 這三篇的重點:部署本身很簡單,難的是那些不會報錯的東西。佔位符號不報錯、計費參數不報錯、忘記刪除也不報錯。
所以檢查要靠量測,讀輸出不夠。