{"id":"5575cecd-6689-4607-a21f-53094518ddf8","shortId":"GAwb3T","kind":"skill","title":"gcp-cloud-run","tagline":"Specialized skill for building production-ready serverless","description":"# GCP Cloud Run\n\nSpecialized skill for building production-ready serverless applications on GCP.\nCovers Cloud Run services (containerized), Cloud Run Functions (event-driven),\ncold start optimization, and event-driven architecture with Pub/Sub.\n\n## Principles\n\n- Cloud Run for containers, Functions for simple event handlers\n- Optimize for cold starts with startup CPU boost and min instances\n- Set concurrency based on workload (start with 8, adjust)\n- Memory includes /tmp filesystem - plan accordingly\n- Use VPC Connector only when needed (adds latency)\n- Containers should start fast and be stateless\n- Handle signals gracefully for clean shutdown\n\n## Patterns\n\n### Cloud Run Service Pattern\n\nContainerized web service on Cloud Run\n\n**When to use**: Web applications and APIs,Need any runtime or library,Complex services with multiple endpoints,Stateless containerized workloads\n\n```dockerfile\n# Dockerfile - Multi-stage build for smaller image\nFROM node:20-slim AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nFROM node:20-slim\nWORKDIR /app\n\n# Copy only production dependencies\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY src ./src\nCOPY package.json ./\n\n# Cloud Run uses PORT env variable\nENV PORT=8080\nEXPOSE 8080\n\n# Run as non-root user\nUSER node\n\nCMD [\"node\", \"src/index.js\"]\n```\n\n```javascript\n// src/index.js\nconst express = require('express');\nconst app = express();\n\napp.use(express.json());\n\n// Health check endpoint\napp.get('/health', (req, res) => {\n  res.status(200).send('OK');\n});\n\n// API routes\napp.get('/api/items/:id', async (req, res) => {\n  try {\n    const item = await getItem(req.params.id);\n    res.json(item);\n  } catch (error) {\n    console.error('Error:', error);\n    res.status(500).json({ error: 'Internal server error' });\n  }\n});\n\n// Graceful shutdown\nprocess.on('SIGTERM', () => {\n  console.log('SIGTERM received, shutting down gracefully');\n  server.close(() => {\n    console.log('Server closed');\n    process.exit(0);\n  });\n});\n\nconst PORT = process.env.PORT || 8080;\nconst server = app.listen(PORT, () => {\n  console.log(`Server listening on port ${PORT}`);\n});\n```\n\n```yaml\n# cloudbuild.yaml\nsteps:\n  # Build the container image\n  - name: 'gcr.io/cloud-builders/docker'\n    args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA', '.']\n\n  # Push the container image\n  - name: 'gcr.io/cloud-builders/docker'\n    args: ['push', 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA']\n\n  # Deploy to Cloud Run\n  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'\n    entrypoint: gcloud\n    args:\n      - 'run'\n      - 'deploy'\n      - 'my-service'\n      - '--image=gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA'\n      - '--region=us-central1'\n      - '--platform=managed'\n      - '--allow-unauthenticated'\n      - '--memory=512Mi'\n      - '--cpu=1'\n      - '--min-instances=1'\n      - '--max-instances=100'\n      - '--concurrency=80'\n      - '--cpu-boost'\n\nimages:\n  - 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA'\n```\n\n### Structure\n\nproject/\n├── Dockerfile\n├── .dockerignore\n├── src/\n│   ├── index.js\n│   └── routes/\n├── package.json\n└── cloudbuild.yaml\n\n### Gcloud_deploy\n\n# Direct gcloud deployment\ngcloud run deploy my-service \\\n  --source . \\\n  --region us-central1 \\\n  --allow-unauthenticated \\\n  --memory 512Mi \\\n  --cpu 1 \\\n  --min-instances 1 \\\n  --max-instances 100 \\\n  --concurrency 80 \\\n  --cpu-boost\n\n### Cloud Run Functions Pattern\n\nEvent-driven functions (formerly Cloud Functions)\n\n**When to use**: Simple event handlers,Pub/Sub message processing,Cloud Storage triggers,HTTP webhooks\n\n```javascript\n// HTTP Function\n// index.js\nconst functions = require('@google-cloud/functions-framework');\n\nfunctions.http('helloHttp', (req, res) => {\n  const name = req.query.name || req.body.name || 'World';\n  res.send(`Hello, ${name}!`);\n});\n```\n\n```javascript\n// Pub/Sub Function\nconst functions = require('@google-cloud/functions-framework');\n\nfunctions.cloudEvent('processPubSub', (cloudEvent) => {\n  // Decode Pub/Sub message\n  const message = cloudEvent.data.message;\n  const data = message.data\n    ? JSON.parse(Buffer.from(message.data, 'base64').toString())\n    : {};\n\n  console.log('Received message:', data);\n\n  // Process message\n  processMessage(data);\n});\n```\n\n```javascript\n// Cloud Storage Function\nconst functions = require('@google-cloud/functions-framework');\n\nfunctions.cloudEvent('processStorageEvent', async (cloudEvent) => {\n  const file = cloudEvent.data;\n\n  console.log(`Event: ${cloudEvent.type}`);\n  console.log(`Bucket: ${file.bucket}`);\n  console.log(`File: ${file.name}`);\n\n  if (cloudEvent.type === 'google.cloud.storage.object.v1.finalized') {\n    await processUploadedFile(file.bucket, file.name);\n  }\n});\n```\n\n```bash\n# Deploy HTTP function\ngcloud functions deploy hello-http \\\n  --gen2 \\\n  --runtime nodejs20 \\\n  --trigger-http \\\n  --allow-unauthenticated \\\n  --region us-central1\n\n# Deploy Pub/Sub function\ngcloud functions deploy process-messages \\\n  --gen2 \\\n  --runtime nodejs20 \\\n  --trigger-topic my-topic \\\n  --region us-central1\n\n# Deploy Cloud Storage function\ngcloud functions deploy process-uploads \\\n  --gen2 \\\n  --runtime nodejs20 \\\n  --trigger-event-filters=\"type=google.cloud.storage.object.v1.finalized\" \\\n  --trigger-event-filters=\"bucket=my-bucket\" \\\n  --region us-central1\n```\n\n### Cold Start Optimization Pattern\n\nMinimize cold start latency for Cloud Run\n\n**When to use**: Latency-sensitive applications,User-facing APIs,High-traffic services\n\n## 1. Enable Startup CPU Boost\n\n```bash\ngcloud run deploy my-service \\\n  --cpu-boost \\\n  --region us-central1\n```\n\n## 2. Set Minimum Instances\n\n```bash\ngcloud run deploy my-service \\\n  --min-instances 1 \\\n  --region us-central1\n```\n\n## 3. Optimize Container Image\n\n```dockerfile\n# Use distroless for minimal image\nFROM node:20-slim AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nFROM gcr.io/distroless/nodejs20-debian12\nWORKDIR /app\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY src ./src\nCMD [\"src/index.js\"]\n```\n\n## 4. Lazy Initialize Heavy Dependencies\n\n```javascript\n// Lazy load heavy libraries\nlet bigQueryClient = null;\n\nfunction getBigQueryClient() {\n  if (!bigQueryClient) {\n    const { BigQuery } = require('@google-cloud/bigquery');\n    bigQueryClient = new BigQuery();\n  }\n  return bigQueryClient;\n}\n\n// Only initialize when needed\napp.get('/api/analytics', async (req, res) => {\n  const client = getBigQueryClient();\n  const results = await client.query({...});\n  res.json(results);\n});\n```\n\n## 5. Increase Memory (More CPU)\n\n```bash\n# Higher memory = more CPU during startup\ngcloud run deploy my-service \\\n  --memory 1Gi \\\n  --cpu 2 \\\n  --region us-central1\n```\n\n### Optimization_impact\n\n- Startup_cpu_boost: 50% faster cold starts\n- Min_instances: Eliminates cold starts for traffic spikes\n- Distroless_image: Smaller attack surface, faster pull\n- Lazy_init: Defers heavy loading to first request\n\n### Concurrency Configuration Pattern\n\nProper concurrency settings for Cloud Run\n\n**When to use**: Need to optimize instance utilization,Handle traffic spikes efficiently,Reduce cold starts\n\n## Understanding Concurrency\n\n```bash\n# Default concurrency is 80\n# Adjust based on your workload\n\n# For I/O-bound workloads (most web apps)\ngcloud run deploy my-service \\\n  --concurrency 80 \\\n  --cpu 1\n\n# For CPU-bound workloads\ngcloud run deploy my-service \\\n  --concurrency 1 \\\n  --cpu 1\n\n# For memory-intensive workloads\ngcloud run deploy my-service \\\n  --concurrency 10 \\\n  --memory 2Gi\n```\n\n## Node.js Concurrency\n\n```javascript\n// Node.js is single-threaded but handles I/O concurrently\n// Use async/await for all I/O operations\n\n// GOOD - async I/O\napp.get('/api/data', async (req, res) => {\n  const [users, products] = await Promise.all([\n    fetchUsers(),\n    fetchProducts()\n  ]);\n  res.json({ users, products });\n});\n\n// BAD - blocking operation\napp.get('/api/compute', (req, res) => {\n  const result = heavyCpuOperation(); // Blocks other requests!\n  res.json(result);\n});\n```\n\n## Python Concurrency with Gunicorn\n\n```dockerfile\nFROM python:3.11-slim\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\nCOPY . .\n\n# 4 workers for concurrency\nCMD exec gunicorn --bind :$PORT --workers 4 --threads 2 main:app\n```\n\n```python\n# main.py\nfrom flask import Flask\napp = Flask(__name__)\n\n@app.route('/api/data')\ndef get_data():\n    return {'status': 'ok'}\n```\n\n### Concurrency_guidelines\n\n- Concurrency=1: Only for CPU-bound or unsafe code\n- Concurrency=8 20: Memory-intensive workloads\n- Concurrency=80: Default, good for I/O-bound\n- Concurrency=250: Maximum, for very lightweight handlers\n\n### Pub/Sub Integration Pattern\n\nEvent-driven processing with Cloud Pub/Sub\n\n**When to use**: Asynchronous message processing,Decoupled microservices,Event-driven architecture\n\n## Push Subscription to Cloud Run\n\n```bash\n# Create topic\ngcloud pubsub topics create orders\n\n# Create push subscription to Cloud Run\ngcloud pubsub subscriptions create orders-push \\\n  --topic orders \\\n  --push-endpoint https://my-service-xxx.run.app/pubsub \\\n  --ack-deadline 600\n```\n\n```javascript\n// Handle Pub/Sub push messages\nconst express = require('express');\nconst app = express();\napp.use(express.json());\n\napp.post('/pubsub', async (req, res) => {\n  // Verify the request is from Pub/Sub\n  if (!req.body.message) {\n    return res.status(400).send('Invalid Pub/Sub message');\n  }\n\n  try {\n    // Decode message data\n    const message = req.body.message;\n    const data = message.data\n      ? JSON.parse(Buffer.from(message.data, 'base64').toString())\n      : {};\n\n    console.log('Processing order:', data);\n\n    await processOrder(data);\n\n    // Return 200 to acknowledge\n    res.status(200).send('OK');\n  } catch (error) {\n    console.error('Processing failed:', error);\n    // Return 500 to trigger retry\n    res.status(500).send('Processing failed');\n  }\n});\n```\n\n## Publishing Messages\n\n```javascript\nconst { PubSub } = require('@google-cloud/pubsub');\nconst pubsub = new PubSub();\n\nasync function publishOrder(order) {\n  const topic = pubsub.topic('orders');\n  const messageBuffer = Buffer.from(JSON.stringify(order));\n\n  const messageId = await topic.publishMessage({\n    data: messageBuffer,\n    attributes: {\n      type: 'order_created',\n      priority: 'high'\n    }\n  });\n\n  console.log(`Published message ${messageId}`);\n  return messageId;\n}\n```\n\n## Dead Letter Queue\n\n```bash\n# Create DLQ topic\ngcloud pubsub topics create orders-dlq\n\n# Update subscription with DLQ\ngcloud pubsub subscriptions update orders-push \\\n  --dead-letter-topic orders-dlq \\\n  --max-delivery-attempts 5\n```\n\n### Cloud SQL Connection Pattern\n\nConnect Cloud Run to Cloud SQL securely\n\n**When to use**: Need relational database,Migrating existing applications,Complex queries and transactions\n\n```bash\n# Deploy with Cloud SQL connection\ngcloud run deploy my-service \\\n  --add-cloudsql-instances PROJECT:REGION:INSTANCE \\\n  --set-env-vars INSTANCE_CONNECTION_NAME=\"PROJECT:REGION:INSTANCE\" \\\n  --set-env-vars DB_NAME=\"mydb\" \\\n  --set-env-vars DB_USER=\"myuser\"\n```\n\n```javascript\n// Using Unix socket connection\nconst { Pool } = require('pg');\n\nconst pool = new Pool({\n  user: process.env.DB_USER,\n  password: process.env.DB_PASS,\n  database: process.env.DB_NAME,\n  // Cloud SQL connector uses Unix socket\n  host: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`,\n  max: 5,  // Connection pool size\n  idleTimeoutMillis: 30000,\n  connectionTimeoutMillis: 10000,\n});\n\napp.get('/api/users', async (req, res) => {\n  const client = await pool.connect();\n  try {\n    const result = await client.query('SELECT * FROM users LIMIT 100');\n    res.json(result.rows);\n  } finally {\n    client.release();\n  }\n});\n```\n\n```python\n# Python with SQLAlchemy\nimport os\nfrom sqlalchemy import create_engine\n\ndef get_engine():\n    instance_connection_name = os.environ[\"INSTANCE_CONNECTION_NAME\"]\n    db_user = os.environ[\"DB_USER\"]\n    db_pass = os.environ[\"DB_PASS\"]\n    db_name = os.environ[\"DB_NAME\"]\n\n    engine = create_engine(\n        f\"postgresql+pg8000://{db_user}:{db_pass}@/{db_name}\",\n        connect_args={\n            \"unix_sock\": f\"/cloudsql/{instance_connection_name}/.s.PGSQL.5432\"\n        },\n        pool_size=5,\n        max_overflow=2,\n        pool_timeout=30,\n        pool_recycle=1800,\n    )\n    return engine\n```\n\n### Best_practices\n\n- Use connection pooling (max 5-10 per instance)\n- Set appropriate idle timeouts\n- Handle connection errors gracefully\n- Consider Cloud SQL Proxy for local development\n\n### Secret Manager Integration\n\nSecurely manage secrets in Cloud Run\n\n**When to use**: API keys, database passwords,Service account keys,Any sensitive configuration\n\n```bash\n# Create secret\necho -n \"my-secret-value\" | gcloud secrets create my-secret --data-file=-\n\n# Mount as environment variable\ngcloud run deploy my-service \\\n  --update-secrets=API_KEY=my-secret:latest\n\n# Mount as file volume\ngcloud run deploy my-service \\\n  --update-secrets=/secrets/api-key=my-secret:latest\n```\n\n```javascript\n// Access mounted as environment variable\nconst apiKey = process.env.API_KEY;\n\n// Access mounted as file\nconst fs = require('fs');\nconst apiKey = fs.readFileSync('/secrets/api-key', 'utf8');\n\n// Access via Secret Manager API (when not mounted)\nconst { SecretManagerServiceClient } = require('@google-cloud/secret-manager');\nconst client = new SecretManagerServiceClient();\n\nasync function getSecret(name) {\n  const [version] = await client.accessSecretVersion({\n    name: `projects/${projectId}/secrets/${name}/versions/latest`\n  });\n  return version.payload.data.toString();\n}\n```\n\n## Sharp Edges\n\n### /tmp Filesystem Counts Against Memory\n\nSeverity: HIGH\n\nSituation: Writing files to /tmp directory in Cloud Run\n\nSymptoms:\nContainer killed with OOM error.\nMemory usage spikes unexpectedly.\nFile operations cause container restarts.\n\"Container memory limit exceeded\" in logs.\n\nWhy this breaks:\nCloud Run uses an in-memory filesystem for /tmp. Any files written\nto /tmp consume memory from your container's allocation.\n\nCommon scenarios:\n- Downloading files temporarily\n- Creating temp processing files\n- Libraries caching to /tmp\n- Large log buffers\n\nA 512MB container that downloads a 200MB file to /tmp only has\n~300MB left for the application.\n\nRecommended fix:\n\n## Calculate memory including /tmp usage\n\n```yaml\n# cloudbuild.yaml\nsteps:\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args:\n      - 'run'\n      - 'deploy'\n      - 'my-service'\n      - '--memory=1Gi'  # Include /tmp overhead\n      - '--image=gcr.io/$PROJECT_ID/my-service'\n```\n\n## Stream instead of buffering\n\n```python\n# BAD - buffers entire file in /tmp\ndef process_large_file(bucket_name, blob_name):\n    blob = bucket.blob(blob_name)\n    blob.download_to_filename('/tmp/large_file')\n    with open('/tmp/large_file', 'rb') as f:\n        process(f.read())\n\n# GOOD - stream processing\ndef process_large_file(bucket_name, blob_name):\n    blob = bucket.blob(blob_name)\n    with blob.open('rb') as f:\n        for chunk in iter(lambda: f.read(8192), b''):\n            process_chunk(chunk)\n```\n\n## Use Cloud Storage for large files\n\n```python\nfrom google.cloud import storage\n\ndef process_with_gcs(bucket_name, input_blob, output_blob):\n    client = storage.Client()\n    bucket = client.bucket(bucket_name)\n\n    # Process directly to/from GCS\n    input_blob = bucket.blob(input_blob)\n    output_blob = bucket.blob(output_blob)\n\n    with input_blob.open('rb') as reader:\n        with output_blob.open('wb') as writer:\n            for chunk in iter(lambda: reader.read(65536), b''):\n                processed = transform(chunk)\n                writer.write(processed)\n```\n\n## Monitor memory usage\n\n```python\nimport psutil\nimport logging\n\ndef log_memory():\n    memory = psutil.virtual_memory()\n    logging.info(f\"Memory: {memory.percent}% used, \"\n                f\"{memory.available / 1024 / 1024:.0f}MB available\")\n```\n\n### Concurrency=1 Causes Scaling Bottlenecks\n\nSeverity: HIGH\n\nSituation: Setting concurrency to 1 for request isolation\n\nSymptoms:\nAuto-scaling creates many container instances.\nHigh latency during traffic spikes.\nIncreased cold starts.\nHigher costs from more instances.\n\nWhy this breaks:\nSetting concurrency to 1 means each container handles only one\nrequest at a time. During traffic spikes:\n\n- 100 concurrent requests = 100 container instances\n- Each instance has cold start overhead\n- More instances = higher costs\n- Scaling takes time, requests queue up\n\nThis should only be used when:\n- Processing is truly single-threaded\n- Memory-heavy per-request processing\n- Using thread-unsafe libraries\n\nRecommended fix:\n\n## Set appropriate concurrency\n\n```bash\n# For I/O-bound workloads (most web apps)\ngcloud run deploy my-service \\\n  --concurrency=80 \\\n  --max-instances=100\n\n# For CPU-bound workloads\ngcloud run deploy my-service \\\n  --concurrency=4 \\\n  --cpu=2\n\n# Only use 1 when absolutely necessary\ngcloud run deploy my-service \\\n  --concurrency=1 \\\n  --max-instances=1000  # Be prepared for many instances\n```\n\n## Node.js - use async properly\n\n```javascript\n// With high concurrency, ensure async operations\nconst express = require('express');\nconst app = express();\n\napp.get('/api/data', async (req, res) => {\n  // All I/O should be async\n  const data = await fetchFromDatabase();\n  const enriched = await enrichData(data);\n  res.json(enriched);\n});\n\n// Concurrency 80+ is safe for async I/O workloads\n```\n\n## Python - use async framework\n\n```python\nfrom fastapi import FastAPI\nimport asyncio\nimport httpx\n\napp = FastAPI()\n\n@app.get(\"/api/data\")\nasync def get_data():\n    # Async I/O allows high concurrency\n    async with httpx.AsyncClient() as client:\n        response = await client.get(\"https://api.example.com/data\")\n        return response.json()\n\n# Concurrency 80+ safe with async framework\n```\n\n## Calculate concurrency\n\n```\nconcurrency = memory_limit / per_request_memory\n\nExample:\n- 512MB container\n- 20MB per request overhead\n- Safe concurrency: ~25\n```\n\n### CPU Throttled When Not Handling Requests\n\nSeverity: HIGH\n\nSituation: Running background tasks or processing between requests\n\nSymptoms:\nBackground tasks run extremely slowly.\nScheduled work doesn't complete.\nMetrics collection fails.\nConnection keep-alive breaks.\n\nWhy this breaks:\nBy default, Cloud Run throttles CPU to near-zero when not actively\nhandling a request. This is \"CPU only during requests\" mode.\n\nAffected operations:\n- Background threads\n- Connection pool maintenance\n- Metrics/telemetry emission\n- Scheduled tasks within container\n- Cleanup operations after response\n\nRecommended fix:\n\n## Enable CPU always allocated\n\n```bash\n# CPU allocated even outside requests\ngcloud run deploy my-service \\\n  --cpu-throttling=false \\\n  --min-instances=1\n\n# Note: This increases costs but enables background work\n```\n\n## Use startup CPU boost for initialization\n\n```bash\n# Boost CPU during cold start only\ngcloud run deploy my-service \\\n  --cpu-boost \\\n  --cpu-throttling=true  # Default, throttle after request\n```\n\n## Move background work to Cloud Tasks\n\n```python\nfrom google.cloud import tasks_v2\nimport json\n\ndef create_background_task(payload):\n    client = tasks_v2.CloudTasksClient()\n    parent = client.queue_path(\n        \"my-project\", \"us-central1\", \"my-queue\"\n    )\n\n    task = {\n        \"http_request\": {\n            \"http_method\": tasks_v2.HttpMethod.POST,\n            \"url\": \"https://my-service.run.app/process\",\n            \"body\": json.dumps(payload).encode(),\n            \"headers\": {\"Content-Type\": \"application/json\"}\n        }\n    }\n\n    client.create_task(parent=parent, task=task)\n\n# Handle response immediately, background via Cloud Tasks\n@app.post(\"/api/order\")\nasync def create_order(order: Order):\n    order_id = await save_order(order)\n\n    # Queue background processing\n    create_background_task({\"order_id\": order_id})\n\n    return {\"order_id\": order_id, \"status\": \"processing\"}\n```\n\n## Use Pub/Sub for async processing\n\n```yaml\n# Move heavy processing to separate service\nsteps:\n  # Main service - responds quickly\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args: ['run', 'deploy', 'api-service',\n           '--cpu-throttling=true']\n\n  # Worker service - processes messages\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args: ['run', 'deploy', 'worker-service',\n           '--cpu-throttling=false',\n           '--min-instances=1']\n```\n\n### VPC Connector 10-Minute Idle Timeout\n\nSeverity: MEDIUM\n\nSituation: Cloud Run service connecting to VPC resources\n\nSymptoms:\nConnection errors after period of inactivity.\n\"Connection reset\" or \"Connection refused\" errors.\nSporadic failures to VPC resources.\nDatabase connections drop unexpectedly.\n\nWhy this breaks:\nCloud Run's VPC connector has a 10-minute idle timeout on connections.\nIf a connection is idle for 10 minutes, it's silently closed.\n\nAffects:\n- Database connection pools\n- Redis connections\n- Internal API connections\n- Any persistent VPC connection\n\nRecommended fix:\n\n## Configure connection pool with keep-alive\n\n```python\n# SQLAlchemy with connection recycling\nfrom sqlalchemy import create_engine\n\nengine = create_engine(\n    DATABASE_URL,\n    pool_size=5,\n    max_overflow=2,\n    pool_recycle=300,  # Recycle connections every 5 minutes\n    pool_pre_ping=True  # Validate connection before use\n)\n```\n\n## TCP keep-alive for custom connections\n\n```python\nimport socket\n\nsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\nsock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)\nsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60)\nsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 60)\nsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)\n```\n\n## Redis with connection validation\n\n```python\nimport redis\n\npool = redis.ConnectionPool(\n    host=REDIS_HOST,\n    port=6379,\n    socket_keepalive=True,\n    socket_keepalive_options={\n        socket.TCP_KEEPIDLE: 60,\n        socket.TCP_KEEPINTVL: 60,\n        socket.TCP_KEEPCNT: 5\n    },\n    health_check_interval=30\n)\nclient = redis.Redis(connection_pool=pool)\n```\n\n## Use Cloud SQL Proxy sidecar\n\n```yaml\n# Use Cloud SQL connector which handles reconnection\n# requirements.txt\ncloud-sql-python-connector[pg8000]\n```\n\n```python\nfrom google.cloud.sql.connector import Connector\nimport sqlalchemy\n\nconnector = Connector()\n\ndef getconn():\n    return connector.connect(\n        \"project:region:instance\",\n        \"pg8000\",\n        user=\"user\",\n        password=\"password\",\n        db=\"database\"\n    )\n\nengine = sqlalchemy.create_engine(\n    \"postgresql+pg8000://\",\n    creator=getconn\n)\n```\n\n### Container Startup Timeout (4 minutes max)\n\nSeverity: HIGH\n\nSituation: Deploying containers with slow initialization\n\nSymptoms:\nDeployment fails with \"Container failed to start\".\nService never becomes healthy.\n\"Revision failed to become ready\" errors.\nWorks locally but fails on Cloud Run.\n\nWhy this breaks:\nCloud Run expects your container to start listening on PORT within\n4 minutes (240 seconds). If it doesn't, the instance is killed.\n\nCommon causes:\n- Heavy framework initialization (ML models, etc.)\n- Waiting for external dependencies at startup\n- Large dependency loading\n- Database migrations on startup\n\nRecommended fix:\n\n## Enable startup CPU boost\n\n```bash\ngcloud run deploy my-service \\\n  --cpu-boost \\\n  --startup-cpu-boost\n```\n\n## Lazy initialization\n\n```python\nfrom functools import lru_cache\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n# Don't load at import time\nmodel = None\n\n@lru_cache()\ndef get_model():\n    global model\n    if model is None:\n        # Load on first request, not at startup\n        model = load_heavy_model()\n    return model\n\n@app.get(\"/predict\")\nasync def predict(data: dict):\n    model = get_model()  # Loads on first call only\n    return model.predict(data)\n\n# Startup is fast - model loads on first request\n```\n\n## Start listening immediately\n\n```python\nimport asyncio\nfrom fastapi import FastAPI\nimport uvicorn\n\napp = FastAPI()\n\n# Global state for async initialization\ninitialized = asyncio.Event()\n\n@app.on_event(\"startup\")\nasync def startup():\n    # Start background initialization\n    asyncio.create_task(async_init())\n\nasync def async_init():\n    # Heavy initialization happens after server starts\n    await load_models()\n    await warm_up_connections()\n    initialized.set()\n\n@app.get(\"/ready\")\nasync def ready():\n    if not initialized.is_set():\n        raise HTTPException(503, \"Still initializing\")\n    return {\"status\": \"ready\"}\n\n@app.get(\"/health\")\nasync def health():\n    # Always respond - health check passes\n    return {\"status\": \"healthy\"}\n```\n\n## Use multi-stage builds\n\n```dockerfile\n# Build stage - slow\nFROM python:3.11 as builder\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt\n\n# Runtime stage - fast startup\nFROM python:3.11-slim\nWORKDIR /app\nCOPY --from=builder /wheels /wheels\nRUN pip install --no-cache /wheels/* && rm -rf /wheels\nCOPY . .\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8080\"]\n```\n\n## Run migrations separately\n\n```bash\n# Don't migrate on startup - use Cloud Build\nsteps:\n  # Run migrations first\n  - name: 'gcr.io/cloud-builders/gcloud'\n    entrypoint: 'bash'\n    args:\n      - '-c'\n      - |\n        gcloud run jobs execute migrate-job --wait\n\n  # Then deploy\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args: ['run', 'deploy', 'my-service', ...]\n```\n\n### Second Generation Execution Environment Differences\n\nSeverity: MEDIUM\n\nSituation: Migrating to or using Cloud Run second-gen execution environment\n\nSymptoms:\nNetwork behavior changes.\nDifferent syscall support.\nFile system behavior differences.\nContainer behaves differently than in first-gen.\n\nWhy this breaks:\nCloud Run's second-generation execution environment uses a different\nsandbox (gVisor) with different characteristics:\n\n- More Linux syscalls supported\n- Full /proc and /sys access\n- Different network stack\n- No automatic HTTPS redirect\n- Different tmp filesystem behavior\n\nRecommended fix:\n\n## Explicitly set execution environment\n\n```bash\n# First generation (legacy)\ngcloud run deploy my-service \\\n  --execution-environment=gen1\n\n# Second generation (recommended for most)\ngcloud run deploy my-service \\\n  --execution-environment=gen2\n```\n\n## Handle network differences\n\n```python\n# Second-gen doesn't auto-redirect HTTP to HTTPS\nfrom fastapi import FastAPI, Request\nfrom fastapi.responses import RedirectResponse\n\napp = FastAPI()\n\n@app.middleware(\"http\")\nasync def redirect_https(request: Request, call_next):\n    # Check X-Forwarded-Proto header\n    if request.headers.get(\"X-Forwarded-Proto\") == \"http\":\n        url = request.url.replace(scheme=\"https\")\n        return RedirectResponse(url, status_code=301)\n    return await call_next(request)\n```\n\n## GPU access (second-gen only)\n\n```bash\n# GPUs only available in second-gen\ngcloud run deploy ml-service \\\n  --execution-environment=gen2 \\\n  --gpu=1 \\\n  --gpu-type=nvidia-l4\n```\n\n## Check execution environment\n\n```python\nimport os\n\ndef get_execution_environment():\n    # Second-gen has different /proc structure\n    try:\n        with open('/proc/version', 'r') as f:\n            version = f.read()\n            if 'gVisor' in version:\n                return 'gen2'\n    except:\n        pass\n    return 'gen1'\n```\n\n### Request Timeout Configuration Mismatch\n\nSeverity: MEDIUM\n\nSituation: Long-running requests or background processing\n\nSymptoms:\nRequests terminated before completion.\n504 Gateway Timeout errors.\nProcessing stops unexpectedly.\nInconsistent timeout behavior.\n\nWhy this breaks:\nCloud Run has multiple timeout configurations that must align:\n- Request timeout (default 300s, max 3600s for HTTP, 60m for gRPC)\n- Client timeout\n- Downstream service timeouts\n- Load balancer timeout (for external access)\n\nRecommended fix:\n\n## Set consistent timeouts\n\n```bash\n# Increase request timeout (max 3600s for HTTP)\ngcloud run deploy my-service \\\n  --timeout=900  # 15 minutes\n```\n\n## Handle long-running with webhooks\n\n```python\nfrom fastapi import FastAPI, BackgroundTasks\nimport httpx\n\napp = FastAPI()\n\n@app.post(\"/process\")\nasync def process(data: dict, background_tasks: BackgroundTasks):\n    task_id = create_task_id()\n\n    # Start background processing\n    background_tasks.add_task(\n        long_running_process,\n        task_id,\n        data,\n        data.get(\"callback_url\")\n    )\n\n    # Return immediately\n    return {\"task_id\": task_id, \"status\": \"processing\"}\n\nasync def long_running_process(task_id, data, callback_url):\n    result = await heavy_computation(data)\n\n    # Callback when done\n    if callback_url:\n        async with httpx.AsyncClient() as client:\n            await client.post(callback_url, json={\n                \"task_id\": task_id,\n                \"result\": result\n            })\n```\n\n## Use Cloud Tasks for reliable long-running\n\n```python\nfrom google.cloud import tasks_v2\n\ndef create_long_running_task(data):\n    client = tasks_v2.CloudTasksClient()\n    parent = client.queue_path(PROJECT, REGION, \"long-tasks\")\n\n    task = {\n        \"http_request\": {\n            \"http_method\": tasks_v2.HttpMethod.POST,\n            \"url\": \"https://worker.run.app/process\",\n            \"body\": json.dumps(data).encode(),\n            \"headers\": {\"Content-Type\": \"application/json\"}\n        },\n        \"dispatch_deadline\": {\"seconds\": 1800}  # 30 min\n    }\n\n    return client.create_task(parent=parent, task=task)\n```\n\n## Streaming for long responses\n\n```python\nfrom fastapi import FastAPI\nfrom fastapi.responses import StreamingResponse\n\n@app.get(\"/large-report\")\nasync def large_report():\n    async def generate():\n        for chunk in process_large_data():\n            yield chunk\n\n    return StreamingResponse(generate(), media_type=\"text/plain\")\n```\n\n## Validation Checks\n\n### Hardcoded GCP Credentials\n\nSeverity: ERROR\n\nGCP credentials must never be hardcoded in source code\n\nMessage: Hardcoded GCP service account credentials. Use Secret Manager or Workload Identity.\n\n### GCP API Key in Source Code\n\nSeverity: ERROR\n\nAPI keys should use Secret Manager\n\nMessage: Hardcoded GCP API key. Use Secret Manager.\n\n### Credentials JSON File in Repository\n\nSeverity: ERROR\n\nService account JSON files should not be in source control\n\nMessage: Credentials file detected. Add to .gitignore and use Secret Manager.\n\n### Running as Root User\n\nSeverity: WARNING\n\nContainers should not run as root for security\n\nMessage: Dockerfile runs as root. Add USER directive for security.\n\n### Missing Health Check in Dockerfile\n\nSeverity: INFO\n\nCloud Run uses HTTP health checks, Dockerfile HEALTHCHECK is optional\n\nMessage: No HEALTHCHECK in Dockerfile. Cloud Run uses its own health checks.\n\n### Hardcoded Port in Application\n\nSeverity: WARNING\n\nPort should come from PORT environment variable\n\nMessage: Hardcoded port. Use PORT environment variable for Cloud Run.\n\n### Large File Writes to /tmp\n\nSeverity: WARNING\n\n/tmp uses container memory, large writes can cause OOM\n\nMessage: /tmp writes consume memory. Consider Cloud Storage for large files.\n\n### Synchronous File Operations\n\nSeverity: WARNING\n\nSync file ops block the event loop in async apps\n\nMessage: Synchronous file operations. Use async versions for better concurrency.\n\n### Global Mutable State\n\nSeverity: WARNING\n\nGlobal state issues with concurrent requests\n\nMessage: Global mutable state may cause issues with concurrent requests.\n\n### Thread-Unsafe Singleton Pattern\n\nSeverity: WARNING\n\nSingletons need thread safety for concurrency > 1\n\nMessage: Singleton pattern - ensure thread safety if using concurrency > 1.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs AWS serverless -> aws-serverless (Lambda, API Gateway, SAM)\n- user needs Azure containers -> azure-functions (Azure Container Apps, Functions)\n- user needs database design -> postgres-wizard (Cloud SQL design, AlloyDB)\n- user needs authentication -> auth-specialist (Firebase Auth, Identity Platform)\n- user needs AI integration -> llm-architect (Vertex AI, Cloud Run + LLM)\n- user needs workflow orchestration -> workflow-automation (Cloud Workflows, Eventarc)\n\n## When to Use\nUse this skill when the request clearly matches the capabilities and patterns described above.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["gcp","cloud","run","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-gcp-cloud-run","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/gcp-cloud-run","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 37911 github stars · SKILL.md body (32,458 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:51:06.072Z","embedding":null,"createdAt":"2026-04-18T20:37:11.135Z","updatedAt":"2026-05-18T18:51:06.072Z","lastSeenAt":"2026-05-18T18:51:06.072Z","tsv":"'-10':1465 '/$project_id/my-service''':1743 '/$project_id/my-service:$commit_sha''':332,362 '/$project_id/my-service:$commit_sha'',':299 '/$project_id/my-service:$commit_sha'']':312 '/.s.pgsql.5432':1443 '/api/analytics':741 '/api/compute':934 '/api/data':916,993,2083,2127 '/api/items':228 '/api/order':2382 '/api/users':1364 '/app':152,166,682,696,955,2993,3018 '/app/node_modules':174,700 '/bigquery':730 '/cloud-builders/docker''':293,307 '/cloud-builders/gcloud''':1728,2432,2450,3062,3080 '/cloudsql':1350,1439 '/data':2147 '/distroless/nodejs20-debian12':694 '/functions-framework':443,465,501 '/google.com/cloudsdktool/cloud-sdk''':320 '/health':218,2966 '/large-report':3584 '/node_modules':175,701 '/predict':2871 '/proc':3149,3310 '/proc/version':3315 '/process':2358,3434,3547 '/pubsub':1087,1107,1181 '/ready':2949 '/secret-manager':1597 '/secrets':1613 '/secrets/api-key':1555,1581 '/src':178,704 '/sys':3151 '/tmp':80,1620,1631,1669,1674,1694,1707,1720,1738,1754,3764,3767,3777 '/tmp/large_file':1770,1773 '/versions/latest':1615 '/wheels':3006,3022,3023,3030,3033 '0':268 '0.0.0.0':3040 '0f':1897 '1':345,349,394,398,627,660,863,876,878,1003,1901,1911,1942,2043,2054,2277,2464,2611,3288,3846,3856 '10':891,2467,2513,2525 '100':353,402,1381,1956,1959,2025 '1000':2058 '10000':1362 '1024':1895,1896 '15':3415 '1800':1455,3560 '1gi':773,1736 '2':646,775,980,1449,2040,2573 '20':147,163,677,1014 '200':222,1149,1153 '200mb':1704 '20mb':2167 '240':2773 '25':2173 '250':1026 '2gi':893 '3':665 '3.11':952,2989,3015 '30':1452,2662,3561 '300':2576 '30000':1360 '300mb':1710 '300s':3375 '301':3257 '3600s':3377,3404 '4':707,968,978,2038,2721,2771 '400':1121 '5':754,1253,1355,1446,1464,2570,2580,2629,2658 '50':785 '500':247,1163,1168 '503':2959 '504':3350 '512mb':1699,2165 '512mi':343,392 '60':2617,2623,2652,2655 '600':1091 '60m':3380 '6379':2643 '65536':1867 '8':76,1013 '80':355,404,842,861,1020,2021,2104,2151 '8080':189,191,272,3042 '8192':1805 '900':3414 'absolut':2045 'access':1561,1570,1583,3152,3264,3393 'accord':83 'account':1500,3626,3664 'ack':1089 'ack-deadlin':1088 'acknowledg':1151 'activ':2224 'add':90,1291,3677,3703 'add-cloudsql-inst':1290 'adjust':77,843 'affect':2235,2531 'ai':3905,3911 'align':3371 'aliv':2207,2552,2593 'alloc':1681,2257,2260 'allow':340,389,542,2134 'allow-unauthent':339,388,541 'alloydb':3892 'alway':2256,2970 'api':122,225,622,1495,1536,1587,2437,2538,3635,3642,3651,3868 'api-servic':2436 'api.example.com':2146 'api.example.com/data':2145 'apikey':1567,1579 'app':210,853,982,989,1102,2013,2080,2124,2836,2908,3038,3223,3431,3801,3880 'app.get':217,227,740,915,933,1363,2082,2126,2870,2948,2965,3583 'app.listen':275 'app.middleware':3225 'app.on':2917 'app.post':1106,2381,3433 'app.route':992 'app.use':212,1104 'applic':24,120,618,1273,1714,3740 'application/json':2367,3556 'appropri':1469,2005 'architect':3909 'architectur':45,1053 'arg':294,308,323,1435,1729,2433,2451,3065,3081 'ask':3975 'async':230,504,742,913,917,1108,1186,1365,1602,2066,2073,2084,2091,2108,2113,2128,2132,2137,2154,2383,2415,2872,2913,2920,2928,2930,2932,2950,2967,3227,3435,3471,3492,3585,3589,3800,3807 'async/await':907 'asynchron':1045 'asyncio':2121,2901 'asyncio.create':2926 'asyncio.event':2916 'attack':800 'attempt':1252 'attribut':1205 'auth':3897,3900 'auth-specialist':3896 'authent':3895 'auto':1917,3209 'auto-redirect':3208 'auto-sc':1916 'autom':3921 'automat':3157 'avail':1899,3272 'aw':3862,3865 'await':236,521,750,923,1145,1201,1370,1375,1608,2094,2098,2143,2391,2940,2943,3259,3482,3497 'aws-serverless':3864 'azur':3873,3876,3878 'azure-funct':3875 'b':1806,1868 'background':2184,2191,2237,2284,2317,2332,2377,2396,2399,2924,3343,3440,3449 'background_tasks.add':3451 'backgroundtask':3428,3442 'bad':930,1749 'balanc':3389 'base':71,844 'base64':481,1139 'bash':525,632,650,759,838,1059,1220,1278,1505,2007,2258,2292,2810,3046,3064,3170,3269,3399 'becom':2742,2747 'behav':3118 'behavior':3108,3115,3163,3359 'best':1458 'better':3810 'bigqueri':725,733 'bigquerycli':718,723,731,735 'bind':975 'blob':1761,1763,1765,1788,1790,1792,1828,1830,1842,1845,1847,1850 'blob.download':1767 'blob.open':1795 'block':931,940,3795 'bodi':2359,3548 'boost':65,358,407,631,641,784,2289,2293,2307,2809,2819,2823 'bottleneck':1904 'bound':867,1008,2029 'boundari':3983 'break':1659,1938,2208,2211,2505,2759,3127,3362 'bucket':513,593,596,1759,1786,1825,1833,1835 'bucket.blob':1764,1791,1843,1848 'buffer':1697,1747,1750 'buffer.from':479,1137,1196 'build':8,19,141,286,295,2982,2984,3054 'builder':150,173,680,699,2991,3021 'c':3066 'cach':963,1692,2831,2847,3001,3029 'calcul':1717,2156 'call':2883,3233,3260 'callback':3460,3479,3486,3490,3499 'capabl':3937 'catch':241,1156 'caus':1648,1902,2784,3774,3828 'central1':336,387,547,569,600,645,664,779,2345 'chang':3109 'characterist':3143 'check':215,2660,2973,3235,3295,3607,3710,3720,3736 'chunk':1800,1808,1809,1862,1871,3593,3599 'ci':158,688 'clarif':3977 'clean':103 'cleanup':2248 'clear':3934,3950 'client':746,1369,1599,1831,2141,2335,2663,3383,3496,3528 'client.accesssecretversion':1609 'client.bucket':1834 'client.create':2368,3564 'client.get':2144 'client.post':3498 'client.query':751,1376 'client.queue':2338,3531 'client.release':1385 'close':266,2530 'cloud':3,14,28,32,49,106,114,181,315,408,417,428,442,464,492,500,571,610,729,819,1040,1057,1071,1180,1254,1259,1262,1281,1343,1477,1490,1596,1634,1660,1811,2214,2320,2379,2474,2506,2669,2675,2683,2755,2760,3053,3099,3128,3363,3509,3715,3730,3758,3782,3889,3912,3922 'cloud-sql-python-connector':2682 'cloudbuild.yaml':284,371,1723 'cloudev':468,505 'cloudevent.data':508 'cloudevent.data.message':474 'cloudevent.type':511,519 'cloudsql':1292 'cmd':200,705,972,3035 'code':1011,3256,3621,3639 'cold':38,60,601,606,787,792,834,1929,1965,2296 'collabor':3857 'collect':2202 'come':3745 'common':1682,2783 'complet':2200,3349 'complex':128,1274 'comput':3484 'concurr':70,354,403,812,816,837,840,860,875,890,895,905,946,971,1000,1002,1012,1019,1025,1900,1909,1940,1957,2006,2020,2037,2053,2071,2103,2136,2150,2157,2158,2172,3811,3821,3831,3845,3855 'configur':813,1504,2546,3333,3368 'connect':1256,1258,1283,1302,1325,1352,1356,1401,1405,1434,1441,1461,1473,2204,2239,2477,2482,2488,2491,2500,2518,2521,2533,2536,2539,2543,2547,2556,2578,2587,2596,2632,2665,2946 'connectiontimeoutmilli':1361 'connector':86,1345,2466,2510,2677,2686,2692,2695,2696 'connector.connect':2700 'consid':1476,3781 'consist':3397 'console.error':243,1158 'console.log':257,264,277,483,509,512,515,1141,1211 'const':205,209,234,269,273,437,448,459,472,475,495,506,724,745,748,920,937,1097,1101,1130,1133,1175,1182,1190,1194,1199,1326,1330,1368,1373,1566,1574,1578,1591,1598,1606,2075,2079,2092,2096 'consum':1675,3779 'contain':52,92,288,302,667,1637,1649,1651,1679,1700,1921,1945,1960,2166,2247,2718,2728,2736,2764,3117,3690,3769,3874,3879 'container':31,110,134 'content':2365,3554 'content-typ':2364,3553 'control':3672 'copi':153,167,171,176,179,683,697,702,956,967,2994,3019,3034 'cost':1932,1971,2281 'count':1622 'cover':27 'cpu':64,344,357,393,406,630,640,758,763,774,783,862,866,877,1007,2028,2039,2174,2217,2230,2255,2259,2271,2288,2294,2306,2309,2440,2458,2808,2818,2822 'cpu-boost':356,405,639,2305,2817 'cpu-bound':865,1006,2027 'cpu-throttl':2270,2308,2439,2457 'creat':1060,1065,1067,1076,1208,1221,1227,1395,1423,1506,1516,1687,1919,2331,2385,2398,2561,2564,3445,3523 'creator':2716 'credenti':3610,3614,3627,3656,3674 'criteria':3986 'custom':2595 'data':476,486,490,996,1129,1134,1144,1147,1203,1521,2093,2100,2131,2875,2887,3438,3458,3478,3485,3527,3550,3597 'data-fil':1520 'data.get':3459 'databas':1270,1340,1497,2499,2532,2566,2710,2800,3884 'db':1311,1318,1407,1410,1412,1415,1417,1420,1428,1430,1432,2709 'dead':1217,1243 'dead-letter-top':1242 'deadlin':1090,3558 'decod':469,1127 'decoupl':1048 'def':994,1397,1755,1782,1821,1882,2129,2330,2384,2697,2848,2873,2921,2931,2951,2968,3228,3301,3436,3472,3522,3586,3590 'default':839,1021,2213,2312,3374 'defer':806 'deleg':3858 'deliveri':1251 'depend':170,711,2794,2798 'deploy':313,325,373,376,379,526,531,548,553,570,576,635,653,768,856,871,886,1279,1286,1529,1548,1731,2016,2033,2049,2266,2301,2435,2453,2727,2733,2813,3076,3083,3176,3191,3279,3409 'describ':3940,3954 'design':3885,3891 'detect':3676 'develop':1482 'dict':2876,3439 'differ':3091,3110,3116,3119,3138,3142,3153,3160,3201,3309 'dir':964,3002,3005 'direct':374,1838,3705 'directori':1632 'dispatch':3557 'distroless':671,797 'dlq':1222,1230,1234,1248 'dockerfil':136,137,365,669,949,2983,3699,3712,3721,3729 'dockerignor':366 'doesn':2198,2777,3206 'done':3488 'download':1684,1702 'downstream':3385 'driven':37,44,414,1037,1052 'drop':2501 'echo':1508 'edg':1619 'effici':832 'elimin':791 'emiss':2243 'enabl':628,2254,2283,2806 'encod':2362,3551 'endpoint':132,216,1084 'engin':1396,1399,1422,1424,1457,2562,2563,2565,2711,2713 'enrich':2097,2102 'enrichdata':2099 'ensur':2072,3850 'entir':1751 'entrypoint':321,3063 'env':185,187,1299,1309,1316 'environ':1525,1564,3090,3105,3135,3169,3182,3197,3285,3297,3304,3748,3755,3966 'environment-specif':3965 'error':242,244,245,249,252,1157,1161,1474,1641,2483,2493,2749,3353,3612,3641,3662 'etc':2790 'even':2261 'event':36,43,56,413,423,510,585,591,1036,1051,2918,3797 'event-driven':35,42,412,1035,1050 'eventarc':3924 'everi':2579 'exampl':2164 'exceed':1654 'except':3327 'exec':973 'execut':3070,3089,3104,3134,3168,3181,3196,3284,3296,3303 'execution-environ':3180,3195,3283 'exist':1272 'expect':2762 'expert':3971 'explicit':3166 'expos':190 'express':206,208,211,1098,1100,1103,2076,2078,2081 'express.json':213,1105 'extern':2793,3392 'extrem':2194 'f':1425,1438,1776,1798,1889,1893,3318 'f.read':1778,1804,3320 'face':621 'fail':1160,1171,2203,2734,2737,2745,2753 'failur':2495 'fals':2273,2460 'fast':95,2890,3011 'fastapi':2117,2119,2125,2833,2835,2837,2903,2905,2909,3215,3217,3224,3425,3427,3432,3576,3578 'fastapi.responses':3220,3580 'faster':786,802 'fetchfromdatabas':2095 'fetchproduct':926 'fetchus':925 'file':507,516,1522,1544,1573,1629,1646,1671,1685,1690,1705,1752,1758,1785,1815,3113,3658,3666,3675,3761,3786,3788,3793,3804 'file.bucket':514,523 'file.name':517,524 'filenam':1769 'filesystem':81,1621,1667,3162 'filter':586,592 'final':1384 'firebas':3899 'first':810,2859,2882,2894,3058,3123,3171 'first-gen':3122 'fix':1716,2003,2253,2545,2805,3165,3395 'flask':986,988,990 'former':416 'forward':3238,3245 'framework':2114,2155,2786 'fs':1575,1577 'fs.readfilesync':1580 'full':3148 'function':34,53,410,415,418,435,438,458,460,494,496,528,530,550,552,573,575,720,1187,1603,3877,3881 'functions.cloudevent':466,502 'functions.http':444 'functool':2828 'gateway':3351,3869 'gcloud':322,372,375,377,529,551,574,633,651,766,854,869,884,1062,1073,1224,1235,1284,1514,1527,1546,2014,2031,2047,2264,2299,2811,3067,3174,3189,3277,3407 'gcp':2,13,26,3609,3613,3624,3634,3650 'gcp-cloud-run':1 'gcr.io':292,298,306,311,319,331,361,693,1727,1742,2431,2449,3061,3079 'gcr.io/$project_id/my-service''':1741 'gcr.io/$project_id/my-service:$commit_sha''':330,360 'gcr.io/$project_id/my-service:$commit_sha'',':297 'gcr.io/$project_id/my-service:$commit_sha'']':310 'gcr.io/cloud-builders/docker''':291,305 'gcr.io/cloud-builders/gcloud''':1726,2430,2448,3060,3078 'gcr.io/distroless/nodejs20-debian12':692 'gcr.io/google.com/cloudsdktool/cloud-sdk''':318 'gcs':1824,1840 'gen':3103,3124,3205,3267,3276,3307 'gen1':3183,3330 'gen2':535,557,580,3198,3286,3326 'generat':3088,3133,3172,3185,3591,3602 'get':995,1398,2130,2849,2878,3302 'getbigquerycli':721,747 'getconn':2698,2717 'getitem':237 'getsecret':1604 'gitignor':3679 'global':2851,2910,3812,3817,3824 'good':912,1022,1779 'googl':441,463,499,728,1179,1595 'google-cloud':440,462,498,727,1178,1594 'google.cloud':1818,2324,3518 'google.cloud.sql.connector':2690 'google.cloud.storage.object.v1.finalized':520,588 'gpu':3263,3287,3290 'gpu-typ':3289 'gpus':3270 'grace':101,253,262,1475 'grpc':3382 'guidelin':1001 'gunicorn':948,974 'gvisor':3140,3322 'handl':99,829,903,1093,1472,1946,2178,2225,2374,2679,3199,3417 'handler':57,424,1031 'happen':2936 'hardcod':3608,3618,3623,3649,3737,3751 'header':2363,3240,3552 'health':214,2659,2969,2972,3709,3719,3735 'healthcheck':3722,3727 'healthi':2743,2977 'heavi':710,715,807,1992,2419,2785,2866,2934,3483 'heavycpuoper':939 'hello':454,533 'hello-http':532 'hellohttp':445 'high':624,1210,1626,1906,1923,2070,2135,2181,2725 'high-traff':623 'higher':760,1931,1970 'host':1349,2639,2641,3039 'http':431,434,527,534,540,2350,2352,3211,3226,3247,3379,3406,3539,3541,3718 'httpexcept':2958 'https':3158,3213,3230,3251 'httpx':2123,3430 'httpx.asyncclient':2139,3494 'i/o':904,910,914,2088,2109,2133 'i/o-bound':849,1024,2009 'id':229,2390,2402,2404,2407,2409,3444,3447,3457,3466,3468,3477,3503,3505 'ident':3633,3901 'idl':1470,2469,2515,2523 'idletimeoutmilli':1359 'imag':144,289,303,329,359,668,674,798,1740 'immedi':2376,2898,3463 'impact':781 'import':987,1390,1394,1819,1878,1880,2118,2120,2122,2325,2328,2560,2598,2635,2691,2693,2829,2834,2842,2900,2904,2906,3216,3221,3299,3426,3429,3519,3577,3581 'in-memori':1664 'inact':2487 'includ':79,1719,1737 'inconsist':3357 'increas':755,1928,2280,3400 'index.js':368,436 'inet':2603 'info':3714 'init':805,2929,2933 'initi':709,737,2291,2731,2787,2825,2914,2915,2925,2935,2961 'initialized.is':2955 'initialized.set':2947 'input':1827,1841,1844,3980 'input_blob.open':1852 'instal':960,3026 'instanc':68,348,352,397,401,649,659,790,827,1293,1296,1301,1306,1400,1404,1440,1467,1922,1935,1961,1963,1969,2024,2057,2063,2276,2463,2703,2780 'instead':1745 'integr':1033,1485,3906 'intens':882,1017 'intern':250,2537 'interv':2661 'invalid':1123 'isol':1914 'issu':3819,3829 'item':235,240 'iter':1802,1864 'javascript':203,433,456,491,712,896,1092,1174,1321,1560,2068 'job':3069,3073 'json':155,248,685,2329,3501,3657,3665 'json.dumps':2360,3549 'json.parse':478,1136 'json.stringify':1197 'keep':2206,2551,2592 'keep-al':2205,2550,2591 'keepal':2610,2645,2648 'keepcnt':2628,2657 'keepidl':2616,2651 'keepintvl':2622,2654 'key':1496,1501,1537,1569,3636,3643,3652 'kill':1638,2782 'l4':3294 'lambda':1803,1865,3867 'larg':1695,1757,1784,1814,2797,3587,3596,3760,3771,3785 'latenc':91,608,616,1924 'latency-sensit':615 'latest':1541,1559 'lazi':708,713,804,2824 'left':1711 'legaci':3173 'let':717 'letter':1218,1244 'librari':127,716,1691,2001 'lightweight':1030 'limit':1380,1653,2160,3942 'linux':3145 'listen':279,2767,2897 'llm':3908,3914 'llm-architect':3907 'load':714,808,2799,2840,2857,2865,2880,2892,2941,3388 'local':1481,2751 'log':1656,1696,1881,1883 'logging.info':1888 'long':3339,3419,3453,3473,3514,3524,3536,3572 'long-run':3338,3418,3513 'long-task':3535 'loop':3798 'lru':2830,2846 'main':981,2425,3037 'main.py':984 'mainten':2241 'manag':338,1484,1487,1586,3630,3647,3655,3683 'mani':1920,2062 'match':3935,3951 'max':351,400,1250,1354,1447,1463,2023,2056,2571,2723,3376,3403 'max-delivery-attempt':1249 'max-inst':350,399,2022,2055 'maximum':1027 'may':3827 'mb':1898 'mean':1943 'media':3603 'medium':2472,3093,3336 'memori':78,342,391,756,761,772,881,892,1016,1624,1642,1652,1666,1676,1718,1735,1875,1884,1885,1887,1890,1991,2159,2163,3770,3780 'memory-heavi':1990 'memory-intens':880,1015 'memory.available':1894 'memory.percent':1891 'messag':426,471,473,485,488,556,1046,1096,1125,1128,1131,1173,1213,2446,3622,3648,3673,3698,3725,3750,3776,3802,3823,3847 'message.data':477,480,1135,1138 'messagebuff':1195,1204 'messageid':1200,1214,1216 'method':2353,3542 'metric':2201 'metrics/telemetry':2242 'microservic':1049 'migrat':1271,2801,3044,3049,3057,3072,3095 'migrate-job':3071 'min':67,347,396,658,789,2275,2462,3562 'min-inst':346,395,657,2274,2461 'minim':605,673 'minimum':648 'minut':2468,2514,2526,2581,2722,2772,3416 'mismatch':3334 'miss':3708,3988 'ml':2788,3281 'ml-servic':3280 'mode':2234 'model':2789,2844,2850,2852,2854,2864,2867,2869,2877,2879,2891,2942 'model.predict':2886 'monitor':1874 'mount':1523,1542,1562,1571,1590 'move':2316,2418 'multi':139,2980 'multi-stag':138,2979 'multipl':131,3366 'must':3370,3615 'mutabl':3813,3825 'my-bucket':594 'my-project':2340 'my-queu':2346 'my-secret':1517,1538,1556 'my-secret-valu':1510 'my-servic':326,380,636,654,769,857,872,887,1287,1530,1549,1732,2017,2034,2050,2267,2302,2814,3084,3177,3192,3410 'my-service-xxx.run.app':1086 'my-service-xxx.run.app/pubsub':1085 'my-service.run.app':2357 'my-service.run.app/process':2356 'my-top':563 'mydb':1313 'myuser':1320 'n':1509 'name':290,304,317,449,455,991,1303,1312,1342,1353,1402,1406,1418,1421,1433,1442,1605,1610,1614,1725,1760,1762,1766,1787,1789,1793,1826,1836,2429,2447,3059,3077 'near':2220 'near-zero':2219 'necessari':2046 'need':89,123,739,824,1268,3841,3861,3872,3883,3894,3904,3916 'network':3107,3154,3200 'never':2741,3616 'new':732,1184,1332,1600 'next':3234,3261 'no-cach':3027 'no-cache-dir':961,2999 'node':146,162,199,201,676 'node.js':894,897,2064 'nodejs20':537,559,582 'non':195 'non-root':194 'none':2845,2856 'note':2278 'npm':157,687 'null':719 'nvidia':3293 'nvidia-l4':3292 'ok':224,999,1155 'one':1948 'oom':1640,3775 'op':3794 'open':1772,3314 'oper':911,932,1647,2074,2236,2249,3789,3805 'optim':40,58,603,666,780,826 'option':2649,3724 'orchestr':3918 'order':1066,1078,1081,1143,1189,1193,1198,1207,1229,1240,1247,2386,2387,2388,2389,2393,2394,2401,2403,2406,2408 'orders-dlq':1228,1246 'orders-push':1077,1239 'os':1391,3300 'os.environ':1403,1409,1414,1419 'output':1829,1846,1849,3960 'output_blob.open':1857 'outsid':2262 'overflow':1448,2572 'overhead':1739,1967,2170 'packag':154,684 'package.json':180,370 'parent':2337,2370,2371,3530,3566,3567 'pass':1339,1413,1416,1431,2974,3328 'password':1337,1498,2707,2708 'path':2339,3532 'pattern':105,109,411,604,814,1034,1257,3837,3849,3939 'payload':2334,2361 'per':1466,1994,2161,2168 'per-request':1993 'period':2485 'permiss':3981 'persist':2541 'pg':1329 'pg8000':1427,2687,2704,2715 'ping':2584 'pip':959,2997,3025 'plan':82 'platform':337,3902 'pool':1327,1331,1333,1357,1444,1450,1453,1462,2240,2534,2548,2568,2574,2582,2637,2666,2667 'pool.connect':1371 'port':184,188,270,276,281,282,976,2642,2769,3041,3738,3743,3747,3752,3754 'postgr':3887 'postgres-wizard':3886 'postgresql':1426,2714 'practic':1459 'pre':2583 'predict':2874 'prepar':2060 'principl':48 'prioriti':1209 'process':427,487,555,578,1038,1047,1142,1159,1170,1689,1756,1777,1781,1783,1807,1822,1837,1869,1873,1984,1996,2187,2397,2411,2416,2420,2445,3344,3354,3437,3450,3455,3470,3475,3595 'process-messag':554 'process-upload':577 'process.env.api':1568 'process.env.db':1335,1338,1341 'process.env.instance':1351 'process.env.port':271 'process.exit':267 'process.on':255 'processmessag':489 'processord':1146 'processpubsub':467 'processstorageev':503 'processuploadedfil':522 'product':10,21,160,169,690,922,929 'production-readi':9,20 'project':364,1294,1304,1611,2342,2701,3533 'projectid':1612 'promise.all':924 'proper':815,2067 'proto':3239,3246 'proxi':1479,2671 'psutil':1879 'psutil.virtual':1886 'pub/sub':47,425,457,470,549,1032,1041,1094,1116,1124,2413 'publish':1172,1212 'publishord':1188 'pubsub':1063,1074,1176,1183,1185,1225,1236 'pubsub.topic':1192 'pull':803 'push':300,309,1054,1068,1079,1083,1095,1241 'push-endpoint':1082 'python':945,951,983,1386,1387,1748,1816,1877,2111,2115,2322,2553,2597,2634,2685,2688,2826,2899,2988,3014,3202,3298,3423,3516,3574 'queri':1275 'queue':1219,1976,2348,2395 'quick':2428 'r':965,3007,3316 'rais':2957 'rb':1774,1796,1853 'reader':1855 'reader.read':1866 'readi':11,22,2748,2952,2964 'receiv':259,484 'recommend':1715,2002,2252,2544,2804,3164,3186,3394 'reconnect':2680 'recycl':1454,2557,2575,2577 'redi':2535,2630,2636,2640 'redirect':3159,3210,3229 'redirectrespons':3222,3253 'redis.connectionpool':2638 'redis.redis':2664 'reduc':833 'refus':2492 'region':333,384,544,566,597,642,661,776,1295,1305,2702,3534 'relat':1269 'reliabl':3512 'report':3588 'repositori':3660 'req':219,231,446,743,918,935,1109,1366,2085 'req.body.message':1118,1132 'req.body.name':451 'req.params.id':238 'req.query.name':450 'request':811,942,1113,1913,1949,1958,1975,1995,2162,2169,2179,2189,2227,2233,2263,2315,2351,2860,2895,3218,3231,3232,3262,3331,3341,3346,3372,3401,3540,3822,3832,3933 'request.headers.get':3242 'request.url.replace':3249 'requir':207,439,461,497,726,1099,1177,1328,1576,1593,2077,3979 'requirements.txt':957,966,2681,2995,3008 'res':220,232,447,744,919,936,1110,1367,2086 'res.json':239,752,927,943,1382,2101 'res.send':453 'res.status':221,246,1120,1152,1167 'reset':2489 'resourc':2480,2498 'respond':2427,2971 'respons':2142,2251,2375,3573 'response.json':2149 'restart':1650 'result':749,753,938,944,1374,3481,3506,3507 'result.rows':1383 'retri':1166 'return':734,997,1119,1148,1162,1215,1456,1616,2148,2405,2699,2868,2885,2962,2975,3252,3258,3325,3329,3462,3464,3563,3600 'review':3972 'revis':2744 'rf':3032 'rm':3031 'root':196,3686,3695,3702 'rout':226,369 'run':4,15,29,33,50,107,115,156,182,192,316,324,378,409,611,634,652,686,767,820,855,870,885,958,1058,1072,1260,1285,1491,1528,1547,1635,1661,1730,2015,2032,2048,2183,2193,2215,2265,2300,2434,2452,2475,2507,2756,2761,2812,2996,3024,3043,3056,3068,3082,3100,3129,3175,3190,3278,3340,3364,3408,3420,3454,3474,3515,3525,3684,3693,3700,3716,3731,3759,3913 'runtim':125,536,558,581,3009 'safe':2106,2152,2171 'safeti':3843,3852,3982 'sam':3870 'sandbox':3139 'save':2392 'scale':1903,1918,1972 'scenario':1683 'schedul':2196,2244 'scheme':3250 'scope':3953 'second':2774,3087,3102,3132,3184,3204,3266,3275,3306,3559 'second-gen':3101,3203,3265,3274,3305 'second-gener':3131 'secret':1483,1488,1507,1512,1515,1519,1535,1540,1554,1558,1585,3629,3646,3654,3682 'secretmanagerservicecli':1592,1601 'secur':1264,1486,3697,3707 'select':1377 'send':223,1122,1154,1169 'sensit':617,1503 'separ':2422,3045 'server':251,265,274,278,2938 'server.close':263 'serverless':12,23,3863,3866 'servic':30,108,112,129,328,382,626,638,656,771,859,874,889,1289,1499,1532,1551,1734,2019,2036,2052,2269,2304,2423,2426,2438,2444,2456,2476,2740,2816,3086,3179,3194,3282,3386,3412,3625,3663 'set':69,647,817,1298,1308,1315,1468,1908,1939,2004,2956,3167,3396 'set-env-var':1297,1307,1314 'sever':1625,1905,2180,2471,2724,3092,3335,3611,3640,3661,3688,3713,3741,3765,3790,3815,3838 'sharp':1618 'shut':260 'shutdown':104,254 'sidecar':2672 'signal':100 'sigterm':256,258 'silent':2529 'simpl':55,422 'singl':900,1988 'single-thread':899,1987 'singleton':3836,3840,3848 'situat':1627,1907,2182,2473,2726,3094,3337 'size':1358,1445,2569 'skill':6,17,3930,3945 'skill-gcp-cloud-run' 'slim':148,164,678,953,3016 'slow':2730,2986 'slowli':2195 'smaller':143,799 'sock':1437,2600 'sock.setsockopt':2606,2612,2618,2624 'socket':1324,1348,2599,2608,2644,2647 'socket.af':2602 'socket.ipproto':2613,2619,2625 'socket.so':2609 'socket.sock':2604 'socket.socket':2601 'socket.sol':2607 'socket.tcp':2615,2621,2627,2650,2653,2656 'sourc':383,3620,3638,3671 'source-sickn33' 'special':5,16 'specialist':3898 'specif':3967 'spike':796,831,1644,1927,1955 'sporad':2494 'sql':1255,1263,1282,1344,1478,2670,2676,2684,3890 'sqlalchemi':1389,1393,2554,2559,2694 'sqlalchemy.create':2712 'src':177,367,703 'src/index.js':202,204,706 'stack':3155 'stage':140,2981,2985,3010 'start':39,61,74,94,602,607,788,793,835,1930,1966,2297,2739,2766,2896,2923,2939,3448 'startup':63,629,765,782,2287,2719,2796,2803,2807,2821,2863,2888,2919,2922,3012,3051 'startup-cpu-boost':2820 'state':2911,3814,3818,3826 'stateless':98,133 'status':998,2410,2963,2976,3255,3469 'step':285,1724,2424,3055 'still':2960 'stop':3355,3973 'storag':429,493,572,1812,1820,3783 'storage.client':1832 'stream':1744,1780,2605,3570 'streamingrespons':3582,3601 'structur':363,3311 'subscript':1055,1069,1075,1232,1237 'substitut':3963 'success':3985 'support':3112,3147 'surfac':801 'symptom':1636,1915,2190,2481,2732,3106,3345 'sync':3792 'synchron':3787,3803 'syscal':3111,3146 'system':3114 'take':1973 'task':2185,2192,2245,2321,2326,2333,2349,2369,2372,2373,2380,2400,2927,3441,3443,3446,3452,3456,3465,3467,3476,3502,3504,3510,3520,3526,3537,3538,3565,3568,3569,3949 'tasks_v2.cloudtasksclient':2336,3529 'tasks_v2.httpmethod.post':2354,3543 'tcp':2590,2614,2620,2626 'temp':1688 'temporarili':1686 'termin':3347 'test':3969 'text/plain':3605 'thread':901,979,1989,1999,2238,3834,3842,3851 'thread-unsaf':1998,3833 'throttl':2175,2216,2272,2310,2313,2441,2459 'time':1952,1974,2843 'timeout':1451,1471,2470,2516,2720,3332,3352,3358,3367,3373,3384,3387,3390,3398,3402,3413 'tmp':3161 'to/from':1839 'topic':562,565,1061,1064,1080,1191,1223,1226,1245 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'topic.publishmessage':1202 'tostr':482,1140 'traffic':625,795,830,1926,1954 'transact':1277 'transform':1870 'treat':3958 'tri':233,1126,1372,3312 'trigger':430,539,561,584,590,1165,3859 'trigger-event-filt':583,589 'trigger-http':538 'trigger-top':560 'true':2311,2442,2585,2646 'truli':1986 'type':587,1206,2366,3291,3555,3604 'unauthent':341,390,543 'understand':836 'unexpect':1645,2502,3356 'unix':1323,1347,1436 'unsaf':1010,2000,3835 'updat':1231,1238,1534,1553 'update-secret':1533,1552 'upload':579 'url':2355,2567,3248,3254,3461,3480,3491,3500,3544 'us':335,386,546,568,599,644,663,778,2344 'us-central1':334,385,545,567,598,643,662,777,2343 'usag':1643,1721,1876 'use':84,118,183,421,614,670,823,906,1044,1267,1322,1346,1460,1494,1662,1810,1892,1982,1997,2042,2065,2112,2286,2412,2589,2668,2674,2978,3052,3098,3136,3508,3628,3645,3653,3681,3717,3732,3753,3768,3806,3854,3927,3928,3943 'user':197,198,620,921,928,1319,1334,1336,1379,1408,1411,1429,2705,2706,3687,3704,3860,3871,3882,3893,3903,3915 'user-fac':619 'utf8':1582 'util':828 'uvicorn':2907,3036 'v2':2327,3521 'valid':2586,2633,3606,3968 'valu':1513 'var':1300,1310,1317 'variabl':186,1526,1565,3749,3756 'verifi':1111 'version':1607,3319,3324,3808 'version.payload.data.tostring':1617 'vertex':3910 'via':1584,2378 'volum':1545 'vpc':85,2465,2479,2497,2509,2542 'wait':2791,3074 'warm':2944 'warn':3689,3742,3766,3791,3816,3839 'wb':1858 'web':111,119,852,2012 'webhook':432,3422 'wheel':2998,3004 'wheel-dir':3003 'within':2246,2770 'wizard':3888 'work':2197,2285,2318,2750 'workdir':151,165,681,695,954,2992,3017 'worker':969,977,2443,2455 'worker-servic':2454 'worker.run.app':3546 'worker.run.app/process':3545 'workflow':3917,3920,3923 'workflow-autom':3919 'workload':73,135,847,850,868,883,1018,2010,2030,2110,3632 'world':452 'write':1628,3762,3772,3778 'writer':1860 'writer.write':1872 'written':1672 'x':3237,3244 'x-forwarded-proto':3236,3243 'yaml':283,1722,2417,2673 'yield':3598 'zero':2221","prices":[{"id":"cab4e73d-f179-40e3-9bef-b88cea460386","listingId":"5575cecd-6689-4607-a21f-53094518ddf8","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:37:11.135Z"}],"sources":[{"listingId":"5575cecd-6689-4607-a21f-53094518ddf8","source":"github","sourceId":"sickn33/antigravity-awesome-skills/gcp-cloud-run","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/gcp-cloud-run","isPrimary":false,"firstSeenAt":"2026-04-18T21:37:46.819Z","lastSeenAt":"2026-05-18T18:51:06.072Z"},{"listingId":"5575cecd-6689-4607-a21f-53094518ddf8","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/gcp-cloud-run","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/gcp-cloud-run","isPrimary":true,"firstSeenAt":"2026-04-18T20:37:11.135Z","lastSeenAt":"2026-05-07T22:40:39.033Z"}],"details":{"listingId":"5575cecd-6689-4607-a21f-53094518ddf8","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"gcp-cloud-run","github":{"repo":"sickn33/antigravity-awesome-skills","stars":37911,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-05-18T08:24:49Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"0bb0a26e0f224f5673612f1a3e953f0221cf310f","skill_md_path":"skills/gcp-cloud-run/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/gcp-cloud-run"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"gcp-cloud-run","description":"Specialized skill for building production-ready serverless"},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/gcp-cloud-run"},"updatedAt":"2026-05-18T18:51:06.072Z"}}