GCP Cloud Run & Ops
Guía rápida de operación en Google Cloud: logs de contenedor en Cloud Run, build y push de imágenes a Artifact Registry, despliegues, acceso a Cloud SQL y gestión de secretos.
Comandos del día a día para desplegar y operar aplicaciones contenerizadas en Google Cloud Platform: consultar logs de los contenedores, inspeccionar la base de datos, publicar imágenes y desplegar servicios.
Sustituye los placeholders
PROJECT_ID,REGION(p. ej.europe-southwest1),mi-api,mi-dbymi-repopor los valores de tu proyecto.
1. Configuración inicial de gcloud
# Autenticarse e indicar proyecto y región por defecto
gcloud auth login
gcloud config set project PROJECT_ID
gcloud config set compute/region REGION
# Autenticar Docker contra Artifact Registry (una sola vez)
gcloud auth configure-docker REGION-docker.pkg.dev
# Credenciales para herramientas locales (ADC: proxy de Cloud SQL, etc.)
gcloud auth application-default login
2. Logs del contenedor (Cloud Run)
El primer reflejo ante un fallo en producción: leer los logs del servicio.
Desde la CLI
# Últimas 50 líneas de logs de un servicio
gcloud run services logs read mi-api --region REGION --limit 50
# Seguir los logs en tiempo real (tail)
gcloud beta run services logs tail mi-api --region REGION
# Estado y revisión activa de todos los servicios
gcloud run services list --region REGION
# Describir un servicio (env vars, secretos, escalado, revisión)
gcloud run services describe mi-api --region REGION
Logs Explorer (filtros de consulta)
En Cloud Run → Logs, o vía gcloud logging read, se filtra con el lenguaje de consultas:
# Solo errores y warnings de un servicio concreto
resource.type="cloud_run_revision"
resource.labels.service_name="mi-api"
severity>=WARNING
# Buscar una subcadena en los logs estructurados (ej. un interceptor HTTP)
resource.type="cloud_run_revision"
resource.labels.service_name="mi-api"
textPayload:"[HTTP]" AND severity>=ERROR
# La misma consulta desde la terminal
gcloud logging read \
'resource.type="cloud_run_revision" AND resource.labels.service_name="mi-api" AND severity>=ERROR' \
--limit 30 --format json
3. Build y push de imágenes (Artifact Registry)
Ejecutar siempre desde la raíz del proyecto/monorepo.
# Versionar por git SHA además de :latest (trazabilidad a un commit)
VERSION=$(git rev-parse --short HEAD)
PREFIX=REGION-docker.pkg.dev/PROJECT_ID/mi-repo
# Build multi-stage de la imagen
docker build -f apps/api/Dockerfile -t mi-api:$VERSION .
# Etiquetar para el registro (versión + latest)
docker tag mi-api:$VERSION $PREFIX/api:$VERSION
docker tag mi-api:$VERSION $PREFIX/api:latest
# Subir ambas etiquetas
docker push $PREFIX/api:$VERSION
docker push $PREFIX/api:latest
# Listar imágenes y etiquetas en el repositorio
gcloud artifacts docker images list $PREFIX/api --include-tags
En apps frontend (Next.js, Vite…) las variables
NEXT_PUBLIC_*/VITE_*se hornean en build: pásalas con--build-argaldocker build, no en el deploy.
4. Despliegue en Cloud Run
# Desplegar la API (con Cloud SQL por socket, secretos y env vars)
gcloud run deploy mi-api \
--image=REGION-docker.pkg.dev/PROJECT_ID/mi-repo/api:latest \
--region=REGION \
--allow-unauthenticated \
--port=4000 \
--min-instances=0 \
--max-instances=10 \
--memory=512Mi \
--cpu=1 \
--add-cloudsql-instances=PROJECT_ID:REGION:mi-db \
--set-secrets="DATABASE_URL=DATABASE_URL:latest,REDIS_URL=REDIS_URL:latest" \
--set-env-vars="NODE_ENV=production,PORT=4000"
# Acceso a Redis privado (Memorystore) desde Cloud Run: Direct VPC egress
gcloud run deploy mi-api \
--image=... \
--network=default --subnet=default \
--vpc-egress=private-ranges-only
# Cambiar el escalado sin redeploy de la imagen
gcloud run services update mi-api --min-instances=1 --region REGION
# Revertir a una revisión anterior (redirigir el 100% del tráfico)
gcloud run services update-traffic mi-api --to-revisions=mi-api-00012-abc=100 --region REGION
5. Base de datos (Cloud SQL)
Cloud SQL suele estar sin IP pública. Para inspeccionarla desde tu equipo se levanta el Cloud SQL Auth Proxy (túnel TLS autenticado con tus credenciales de Google).
# Levantar el proxy (deja esta terminal abierta mientras consultas)
cloud-sql-proxy PROJECT_ID:REGION:mi-db --port=5432
# Conectar con psql al túnel local
psql "host=127.0.0.1 port=5432 dbname=mi_db user=admin"
# Atajo: conectar directamente (gcloud gestiona el túnel)
gcloud sql connect mi-db --user=admin --database=mi_db
# Info de la instancia y backups
gcloud sql instances describe mi-db
gcloud sql backups list --instance=mi-db
Consultas SQL útiles para inspeccionar la base:
-- Tamaño de la base de datos
SELECT pg_size_pretty(pg_database_size(current_database()));
-- Tablas más grandes
SELECT relname AS tabla, pg_size_pretty(pg_total_relation_size(relid)) AS tamano
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
-- Conexiones activas
SELECT pid, usename, state, query
FROM pg_stat_activity
WHERE state <> 'idle';
6. Secret Manager
# Crear un secreto y añadirle un valor
gcloud secrets create DATABASE_URL --replication-policy=automatic
echo -n "postgresql://..." | gcloud secrets versions add DATABASE_URL --data-file=-
# Leer el valor de la última versión
gcloud secrets versions access latest --secret=DATABASE_URL
# Listar secretos y versiones
gcloud secrets list
gcloud secrets versions list DATABASE_URL
# Dar acceso al service account de Cloud Run
PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
Rotar un secreto = publicar una nueva versión (
versions add) y redesplegar (oupdate) el servicio. Como las referencias usan:latest, no hay que tocar el código.
7. Verificación post-deploy
# Health check de la API
curl https://api.mi-dominio.com/health
# Estado de los servicios y su última revisión
gcloud run services list --region REGION
# Ver registros DNS pendientes de un dominio mapeado
gcloud run domain-mappings describe --domain=api.mi-dominio.com --region REGION