
在GCP上構建生產就緒無服務器應用的專門技能。涵蓋Cloud Run服務(容器化)、Cloud Run Functions(事件驅動)、冷啟動優化和Pub/Sub事件驅動架構。下載地址Skill源碼下載地址agentic-awesome-skills/skills/gcp-cloud-run at main · sickn33/agentic-awesome-skills · GitHub技能概述gcp-cloud-run 技能是一個用于在GCP上構建生產就緒無服務器應用的技能。它涵蓋Cloud Run服務(容器化)、Cloud Run Functions(事件驅動)、冷啟動優化和Pub/Sub事件驅動架構幫助開發者構建高效、可擴展的無服務器應用。主要功能Cloud Run服務容器化Web服務和APICloud Run Functions事件驅動函數冷啟動優化最小化冷啟動延遲并發配置正確的并發設置Pub/Sub集成事件驅動處理Cloud SQL連接安全數據庫連接核心原則Cloud Run用于容器Functions用于簡單事件處理器使用啟動CPU加速和最小實例優化冷啟動根據工作負載設置并發(從8開始調整)內存包括/tmp文件系統 - 相應規劃僅在需要時使用VPC Connector(增加延遲)容器應快速啟動且無狀態優雅處理信號以實現干凈關閉Cloud Run服務模式何時使用Web應用和API需要任何運行時或庫具有多個端點的復雜服務無狀態容器化工作負載Dockerfile示例# Dockerfile - 多階段構建以獲得更小的鏡像FROM node:20-slim AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --onlyproductionFROM node:20-slimWORKDIR /app# 僅復制生產依賴COPY --frombuilder /app/node_modules ./node_modulesCOPY src ./srcCOPY package.json ./# Cloud Run使用PORT環境變量ENV PORT8080EXPOSE 8080# 以非root用戶運行USER nodeCMD [node, src/index.js]部署命令# 直接gcloud部署gcloud run deploy my-service \--source . \--region us-central1 \--allow-unauthenticated \--memory 512Mi \--cpu 1 \--min-instances 1 \--max-instances 100 \--concurrency 80 \--cpu-boostCloud Run Functions模式何時使用簡單事件處理器Pub/Sub消息處理Cloud Storage觸發器HTTP webhooksHTTP函數示例// index.jsconst functions require(google-cloud/functions-framework);functions.http(helloHttp, (req, res) {const name req.query.name || req.body.name || World;res.send(Hello, ${name}!);});Pub/Sub函數示例const functions require(google-cloud/functions-framework);functions.cloudEvent(processPubSub, (cloudEvent) {// 解碼Pub/Sub消息const message cloudEvent.data.message;const data message.data ? JSON.parse(Buffer.from(message.data, base64).toString()) : {};console.log(Received message:, data);// 處理消息processMessage(data);});冷啟動優化優化影響優化措施效果Startup CPU Boost冷啟動快50%Min Instances消除流量高峰的冷啟動Distroless鏡像更小攻擊面更快拉取延遲初始化將重加載推遲到第一個請求優化命令# 啟用啟動CPU加速gcloud run deploy my-service \--cpu-boost \--region us-central1# 設置最小實例gcloud run deploy my-service \--min-instances 1 \--region us-central1并發配置并發指南并發值適用場景Concurrency1僅用于CPU密集型或不安全代碼Concurrency8-20內存密集型工作負載Concurrency80默認值適合I/O密集型Concurrency250最大值用于非常輕量的處理器Pub/Sub集成創建推送訂閱# 創建主題gcloud pubsub topics create orders# 創建到Cloud Run的推送訂閱gcloud pubsub subscriptions create orders-push \--topic orders \--push-endpoint https://my-service-xxx.run.app/pubsub \--ack-deadline 600處理Pub/Sub推送消息const express require(express);const app express();app.use(express.json());app.post(/pubsub, async (req, res) {// 驗證請求來自Pub/Subif (!req.body.message) {return res.status(400).send(Invalid Pub/Sub message);}try {// 解碼消息數據const message req.body.message;const data message.data ? JSON.parse(Buffer.from(message.data, base64).toString()) : {};console.log(Processing order:, data);await processOrder(data);// 返回200確認res.status(200).send(OK);} catch (error) {console.error(Processing failed:, error);// 返回500觸發重試res.status(500).send(Processing failed);}});Cloud SQL連接# 使用Cloud SQL連接部署gcloud run deploy my-service \--add-cloudsql-instances PROJECT:REGION:INSTANCE \--set-env-vars INSTANCE_CONNECTION_NAMEPROJECT:REGION:INSTANCE \--set-env-vars DB_NAMEmydb \--set-env-vars DB_USERmyuserSecret Manager集成# 創建密鑰echo -n my-secret-value | gcloud secrets create my-secret --data-file-# 作為環境變量掛載gcloud run deploy my-service \--update-secretsAPI_KEYmy-secret:latest# 作為文件卷掛載gcloud run deploy my-service \--update-secrets/secrets/api-keymy-secret:latest注意事項/tmp文件系統計入內存Cloud Run使用內存文件系統作為/tmp。寫入/tmp的任何文件都會消耗容器的內存分配。512MB容器下載200MB文件到/tmp后只剩約300MB給應用。建議流式處理而非緩沖使用Cloud Storage處理大文件。并發1導致擴展瓶頸設置并發為1意味著每個容器一次只處理一個請求。在流量高峰期間100個并發請求100個容器實例每個實例都有冷啟動開銷。建議僅在絕對必要時使用并發1。非請求處理時CPU被限制默認情況下Cloud Run在不主動處理請求時將CPU限制到接近零。建議使用--cpu-throttlingfalse啟用CPU始終分配或將后臺工作移至Cloud Tasks。