Hasta ahora hemos trabajado sobre todo con conceptos y con la consola web. En esta lección cambiamos de marcha: aprenderemos la herramienta con la que se administra Google Cloud de verdad en el día a día, la CLI de gcloud, y el entorno que la hace accesible desde cualquier navegador sin instalar nada, Cloud Shell.

Dominar gcloud no consiste en memorizar comandos, sino en entender su estructura, saber pedirle ayuda y saber extraer exactamente el dato que necesitas. Con eso, cualquier operación de cualquier servicio se vuelve deducible. Veremos qué es Cloud Shell y qué límites tiene, cómo instalar el CLI en local, la anatomía de un comando y el sistema de ayuda, los formatos de salida y los filtros, la autenticación y sus dos modos, las configuraciones nombradas para alternar entre alpinashop-dev y alpinashop-prod, las demás herramientas del SDK, y el scripting básico que encadena comandos.

Y cerraremos el módulo con el primer despliegue real del curso: Dani va a publicar en internet una página de "próximamente" de AlpinaShop, de extremo a extremo, sin salir del navegador.

Contenido

  1. Qué es Cloud Shell
  2. Instalación local del Google Cloud CLI
  3. Cloud Shell frente a CLI local
  4. Anatomía de un comando gcloud y sistema de ayuda
  5. Formatos de salida: --format
  6. Filtros: --filter
  7. Autenticación: gcloud init, auth login y application-default
  8. Configuraciones nombradas
  9. Otras herramientas del SDK
  10. Scripting básico con gcloud
  11. Primer despliegue real: la página de "próximamente" de AlpinaShop

  1. Qué es Cloud Shell

Cloud Shell es una máquina virtual Linux gratuita que se abre dentro del navegador desde el icono >_ de la consola. Está pensada para que puedas administrar Google Cloud sin instalar nada y sin configurar credenciales.

Qué trae ya instalado y configurado:

Categoría Contenido
Google Cloud CLI gcloud, gsutil, bq, kubectl
Lenguajes Python, Java, Go, Node.js, .NET, Ruby, PHP
Herramientas git, docker, terraform, make, vim, nano, jq, curl
Autenticación Ya autenticada con tu usuario de la consola
Editor Cloud Shell Editor, basado en la tecnología de VS Code

Características y límites que hay que conocer antes de confiar en ella:

Aspecto Detalle
Coste Gratuito
Máquina Instancia pequeña (del orden de 1-2 vCPU y unos pocos GB de RAM)
Disco persistente 5 GB montados en tu $HOME, que sí persisten entre sesiones
Fuera de $HOME Todo se pierde: paquetes instalados con apt, cambios en /etc, etc.
Inactividad La sesión se cierra tras aproximadamente una hora sin uso
Sesión máxima En torno a 12 horas seguidas
Borrado por inactividad Si no usas Cloud Shell durante varios meses, el disco puede eliminarse (con aviso previo)
Cuota de uso Existe un límite de horas semanales

La consecuencia práctica del punto de la persistencia es importante: si instalas algo con apt install, desaparecerá en la siguiente sesión. Para que sobreviva, o lo instalas en tu $HOME, o lo automatizas en el fichero ~/.customize_environment, que Cloud Shell ejecuta al arrancar la máquina.

Dos funciones adicionales que usaremos:

  • Cloud Shell Editor: se abre con el botón "Abrir editor" y da un IDE en el navegador, con explorador de ficheros, terminal integrada y resaltado de sintaxis. Muy cómodo para escribir scripts o editar un Dockerfile sin salir de la consola.
  • Vista previa web: el icono con forma de ojo permite abrir en el navegador un servicio que estés ejecutando en Cloud Shell (por defecto en el puerto 8080) mediante una URL temporal y autenticada. Es lo que permite probar la aplicación Flask de AlpinaShop sin desplegarla.
# Comprobar la máquina en la que estás trabajando
cat /etc/os-release | head -n2
nproc          # número de CPUs disponibles
free -h        # memoria
df -h $HOME    # espacio del disco persistente
# Versión del CLI y componentes instalados
gcloud version

  1. Instalación local del Google Cloud CLI

Cloud Shell es excelente para aprender y para tareas puntuales, pero para trabajar a diario querrás el CLI en tu propia máquina, con tu editor, tus ficheros y tus scripts.

Linux (Debian/Ubuntu), mediante el repositorio oficial:

# 1. Dependencias y clave del repositorio de Google
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates gnupg curl

# 2. Añadir la clave de firma del repositorio
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg

# 3. Añadir el repositorio a las fuentes de apt
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] \
https://packages.cloud.google.com/apt cloud-sdk main" \
  | sudo tee /etc/apt/sources.list.d/google-cloud-sdk.list

# 4. Instalar
sudo apt-get update && sudo apt-get install -y google-cloud-cli

macOS, con Homebrew:

brew install --cask google-cloud-sdk

Windows: descarga el instalador GoogleCloudSDKInstaller.exe desde la documentación oficial y ejecútalo. Al finalizar ofrece lanzar gcloud init. También funciona perfectamente instalando la versión Linux dentro de WSL2, que es la opción preferida por muchos desarrolladores.

Gestión de componentes adicionales:

# Ver qué componentes hay instalados y cuáles están disponibles
gcloud components list
# Instalar componentes que no vienen por defecto
gcloud components install kubectl
gcloud components install beta alpha
# Actualizar el CLI y todos sus componentes
gcloud components update

Un aviso: si instalaste el CLI mediante apt o Homebrew, gcloud components update puede estar deshabilitado, porque el gestor de paquetes se encarga de las actualizaciones. En ese caso, actualiza con apt upgrade o brew upgrade. En Cloud Shell, el CLI se actualiza solo.

  1. Cloud Shell frente a CLI local

Criterio Cloud Shell CLI local
Instalación Ninguna Requiere instalar y actualizar
Autenticación Automática con tu usuario Requiere gcloud init / auth login
Coste Gratuito Gratuito (pero consume tu máquina)
Persistencia Solo 5 GB en $HOME Todo tu disco
Potencia Máquina pequeña La de tu equipo
Herramientas preinstaladas Muchas y actualizadas Las que instales
Acceso a ficheros locales Requiere subirlos Directo
Integración con tu editor/IDE Limitada al editor web Completa
Sesiones largas o procesos pesados Limitado (timeout, cuota) Sin límite
Uso desde cualquier dispositivo Sí, solo hace falta navegador No
Recomendado para Aprender, tareas puntuales, emergencias, demos Trabajo diario, desarrollo, scripts

La recomendación para este curso: usa Cloud Shell. Elimina toda la fricción de instalación y garantiza que trabajas con la misma versión que se describe aquí. Instala el CLI local cuando empieces a desarrollar de verdad.

  1. Anatomía de un comando gcloud y sistema de ayuda

Todos los comandos de gcloud siguen la misma estructura, y entenderla es lo que convierte la CLI en algo deducible en lugar de memorizable:

gcloud [GRUPO] [SUBGRUPO...] [ACCIÓN] [ARGUMENTOS_POSICIONALES] [--FLAGS]
Parte Qué es Ejemplos
Grupo El servicio o área compute, storage, projects, iam, sql, run, billing
Subgrupo El tipo de recurso dentro del servicio instances, disks, firewall-rules, buckets
Acción El verbo list, describe, create, delete, update, add-iam-policy-binding
Argumentos El nombre del recurso alpinashop-dev, web-1
Flags Opciones --zone=europe-west1-b, --format=json

Ejemplos leídos según esta estructura:

# grupo=compute, subgrupo=instances, accion=list
gcloud compute instances list

# grupo=projects, accion=describe, argumento=alpinashop-dev
gcloud projects describe alpinashop-dev

# grupo=compute, subgrupo=firewall-rules, accion=create, argumento=permitir-http
gcloud compute firewall-rules create permitir-http --allow=tcp:80

Los verbos son consistentes entre servicios, y esa consistencia es lo que permite deducir comandos que nunca has visto:

Verbo Qué hace
list Lista recursos del tipo indicado
describe Muestra el detalle completo de UN recurso
create Crea un recurso
delete Lo elimina
update Modifica atributos
add-iam-policy-binding Concede un rol
get-iam-policy Muestra la política de permisos

Si sabes que existe gcloud compute instances list, puedes deducir que existirá gcloud sql instances list y gcloud run services list. Y aciertas.

Pedir ayuda

# Ver los grupos de primer nivel disponibles
gcloud help
# Ayuda de un grupo: qué subgrupos y acciones ofrece
gcloud compute --help
gcloud compute instances --help
# Ayuda detallada de un comando concreto, con TODOS sus flags y ejemplos
gcloud compute instances create --help
# Buscar comandos por palabra clave cuando no sabes dónde vive algo
gcloud search-help "budget"
gcloud search-help "service account key"

gcloud search-help es una herramienta infravalorada: busca en toda la ayuda del CLI y devuelve los comandos relevantes ordenados por pertinencia. Cuando no sepas qué comando usar, empieza por ahí.

Versiones alpha y beta

Algunos comandos solo están disponibles en fases preliminares y requieren un prefijo:

gcloud beta run deploy ...
gcloud alpha billing budgets list ...

Regla práctica: si un comando "no existe", prueba con beta y con alpha antes de darlo por imposible. Y no uses comandos alpha en producción: su interfaz puede cambiar sin previo aviso.

  1. Formatos de salida: --format

Por defecto, gcloud devuelve una tabla pensada para humanos. El flag --format permite cambiar completamente esa salida, y es la clave para usar gcloud dentro de scripts.

Formato Para qué sirve
--format=table(...) Tabla legible con las columnas que elijas
--format=json JSON completo, ideal para procesar con jq
--format=yaml YAML, cómodo de leer para objetos complejos
--format=value(...) Solo los valores, sin cabeceras: el formato para scripts
--format=csv(...) CSV, para hojas de cálculo
--format=flattened Todos los campos como pares clave-valor, uno por línea

Ejemplos aplicados:

# Tabla a medida: solo los campos que interesan
gcloud projects list \
  --format="table(projectId, name, projectNumber, lifecycleState)"
# JSON completo de un recurso: útil para descubrir qué campos existen
gcloud projects describe alpinashop-dev --format=json
# Solo un valor, sin cabecera ni adornos: perfecto para guardar en variable
PROJECT_NUMBER=$(gcloud projects describe alpinashop-dev \
  --format="value(projectNumber)")
echo "Numero de proyecto: $PROJECT_NUMBER"
# Varios valores en una linea, separados por tabuladores
gcloud projects list --format="value(projectId, projectNumber)"

Funciones útiles dentro de --format, que ahorran mucho postprocesado:

# basename() extrae el ultimo segmento de una URL de recurso.
# Sin ella, la zona aparece como una URL larga de la API.
gcloud compute instances list \
  --format="table(name, zone.basename(), status, machineType.basename())"
# Cambiar el nombre de las columnas y ordenar la salida
gcloud projects list \
  --format="table[box](projectId:label=ID, name:label=NOMBRE)" \
  --sort-by=projectId

La regla que conviene grabar: table para leer tú, value para que lo lea un script, json para procesarlo con jq.

  1. Filtros: --filter

--filter reduce el conjunto de resultados en el lado del servidor o del cliente según el comando, evitando tener que filtrar con grep, que es frágil.

Operadores disponibles:

Operador Significado Ejemplo
= Igual --filter="status=RUNNING"
!= Distinto --filter="status!=TERMINATED"
>, <, >=, <= Comparación numérica o de fechas --filter="creationTimestamp>2026-01-01"
: Contiene / tiene la clave --filter="labels.entorno:*"
~ Coincide con expresión regular --filter="name~^web-"
!~ No coincide con la regex --filter="name!~^test-"
AND, OR, NOT Combinación lógica --filter="status=RUNNING AND zone:europe-west1"
( ) Agrupación --filter="(a=1 OR b=2) AND c=3"

Ejemplos aplicados a AlpinaShop:

# Instancias en ejecución en cualquier zona de europe-west1
gcloud compute instances list \
  --filter="status=RUNNING AND zone:europe-west1" \
  --format="table(name, zone.basename(), status)"
# Proyectos etiquetados como entorno=desarrollo
gcloud projects list \
  --filter="labels.entorno=desarrollo" \
  --format="table(projectId, name)"
# Todas las APIs activas relacionadas con almacenamiento o base de datos
gcloud services list --enabled \
  --filter="config.name~storage OR config.name~sql" \
  --format="value(config.name)"

Cómo descubrir por qué campos se puede filtrar: mira primero la salida en JSON. Los nombres de campo del JSON son exactamente los que acepta --filter.

# Paso 1: ver la estructura completa del objeto
gcloud compute instances describe web-1 --zone=europe-west1-b --format=json

# Paso 2: filtrar usando los nombres de campo que has visto
gcloud compute instances list --filter="machineType~e2-micro"

  1. Autenticación: gcloud init, auth login y application-default

Este apartado resuelve una de las confusiones más habituales entre quienes empiezan.

gcloud init

Es el asistente de configuración inicial. Hace tres cosas en una: te autentica, te deja elegir proyecto por defecto y te deja elegir región y zona por defecto.

gcloud init

Úsalo la primera vez que configuras el CLI en una máquina, o cuando quieras crear una configuración nueva desde cero.

gcloud auth login frente a gcloud auth application-default login

Son dos credenciales distintas, para dos consumidores distintos:

gcloud auth login gcloud auth application-default login
Para quién Para el comando gcloud y otras herramientas del SDK Para tu código: bibliotecas cliente de Python, Java, Go...
Qué guarda Credenciales de usuario del SDK Un fichero de Application Default Credentials (ADC)
Dónde Configuración interna de gcloud ~/.config/gcloud/application_default_credentials.json
Lo usa gcloud, gsutil, bq El código que usa google-cloud-* en tu equipo
Cuándo lo necesitas Siempre, para administrar Solo si desarrollas localmente contra APIs de Google Cloud
# Autenticar el CLI
gcloud auth login
# Autenticar el CODIGO que ejecutas en tu maquina (ADC)
gcloud auth application-default login
# Ver qué cuentas están autenticadas y cuál está activa
gcloud auth list

El escenario clásico que confunde a todo el mundo: Dani ejecuta gcloud storage ls y funciona, pero su script de Python falla con un error de credenciales. La causa es que hizo gcloud auth login pero no gcloud auth application-default login: la biblioteca cliente busca las ADC, no las credenciales del CLI.

Cuentas de servicio

Para procesos automatizados (un pipeline de CI/CD, una tarea programada) no se usan credenciales de usuario, sino cuentas de servicio. Y dentro de Google Cloud, lo correcto es no descargar claves: una VM, un servicio de Cloud Run o un pod de GKE obtienen credenciales automáticamente de la cuenta de servicio que tengan asociada.

# Autenticarse con una cuenta de servicio a partir de un fichero de clave.
# Evitalo siempre que puedas: las claves descargadas son un riesgo de seguridad.
gcloud auth activate-service-account \
  --key-file=/ruta/clave.json

Las cuentas de servicio, sus roles y las alternativas seguras a las claves descargadas (Workload Identity Federation) se estudian en la lección 03-04.

  1. Configuraciones nombradas

Una configuración de gcloud es un conjunto de propiedades: cuenta activa, proyecto, región y zona por defecto. Puedes tener varias con nombre y saltar entre ellas con un comando, lo que resuelve elegantemente el problema de alternar entre alpinashop-dev y alpinashop-prod.

# Ver las configuraciones existentes y cuál está activa
gcloud config configurations list
# Crear la configuración de desarrollo
gcloud config configurations create alpinashop-dev
gcloud config set account [email protected]
gcloud config set project alpinashop-dev
gcloud config set compute/region europe-west1
gcloud config set compute/zone europe-west1-b
# Crear la configuración de producción
gcloud config configurations create alpinashop-prod
gcloud config set account [email protected]
gcloud config set project alpinashop-prod
gcloud config set compute/region europe-west1
gcloud config set compute/zone europe-west1-b
# Cambiar de una a otra
gcloud config configurations activate alpinashop-dev
# Ver la configuración activa completa
gcloud config list

Dos técnicas complementarias muy recomendables:

# Ejecutar UN comando con otra configuración sin cambiar la activa
gcloud compute instances list --configuration=alpinashop-prod
# Sobrescribir el proyecto solo para un comando
gcloud compute instances list --project=alpinashop-prod

Y un consejo que evita accidentes serios: añade el proyecto activo a tu prompt de bash. Ver en cada línea sobre qué proyecto estás trabajando es la mejor prevención contra ejecutar en producción algo pensado para desarrollo.

# Añadir a ~/.bashrc: muestra el proyecto activo en el prompt
export PS1='[$(gcloud config get-value project 2>/dev/null)] \w\$ '

  1. Otras herramientas del SDK

El Google Cloud CLI incluye varias herramientas además de gcloud:

Herramienta Para qué Estado
gcloud Administración general de Google Cloud La principal
gcloud storage Operaciones con Cloud Storage Recomendada actualmente: más rápida que gsutil
gsutil Herramienta clásica de Cloud Storage Todavía funciona; se está sustituyendo por gcloud storage
bq Consultas y administración de BigQuery Estándar para BigQuery
kubectl Administración de Kubernetes / GKE Estándar de Kubernetes, no específico de Google
# Cloud Storage: listar buckets (forma actual y forma clásica)
gcloud storage ls
gsutil ls
# BigQuery: listar datasets del proyecto
bq ls
# GKE: obtener credenciales de un clúster para poder usar kubectl
gcloud container clusters get-credentials alpinashop-cluster \
  --region=europe-west1
kubectl get nodes

Estas herramientas se usarán a fondo en sus módulos correspondientes: Cloud Storage en 02-02, GKE en 02-05 y BigQuery en 04-01. Aquí solo dejamos constancia de que existen y de que se instalan juntas.

  1. Scripting básico con gcloud

La combinación de --format=value(...) con bash convierte gcloud en una herramienta de automatización potente. El patrón fundamental es siempre el mismo: listar con un filtro, extraer un valor limpio, iterar.

# Guardar un valor en una variable
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" \
  --format="value(projectNumber)")

echo "Proyecto: $PROJECT_ID (numero $PROJECT_NUMBER)"
# Iterar sobre los resultados de un listado.
# Este bucle recorre todas las instancias detenidas y muestra su nombre y zona.
gcloud compute instances list \
  --filter="status=TERMINATED" \
  --format="value(name, zone.basename())" |
while read -r NOMBRE ZONA; do
  echo "Instancia detenida: $NOMBRE en $ZONA"
  # Aqui podrias ejecutar, por ejemplo:
  # gcloud compute instances delete "$NOMBRE" --zone="$ZONA" --quiet
done
# El flag --quiet responde "si" a todas las confirmaciones.
# Imprescindible en scripts desatendidos, PELIGROSO al teclear a mano.
gcloud compute instances delete web-pruebas --zone=europe-west1-b --quiet
# Combinar gcloud con jq para consultas mas complejas sobre el JSON
gcloud projects list --format=json |
  jq -r '.[] | select(.labels.entorno == "desarrollo") | .projectId'

Buenas prácticas para scripts de gcloud:

  • Empieza siempre con set -e para que el script se detenga en cuanto un comando falle, en lugar de seguir sobre un estado inconsistente.
  • Indica el proyecto explícitamente con --project en scripts importantes, en lugar de depender de la configuración activa. Un script que borra recursos y confía en la configuración activa es un accidente esperando a ocurrir.
  • Prueba primero sin --quiet, para ver qué te va a preguntar y sobre qué recursos actuaría.
  • Muchos comandos aceptan --dry-run o tienen equivalentes de solo lectura: úsalos antes de ejecutar operaciones destructivas.

  1. Primer despliegue real: la página de "próximamente" de AlpinaShop

Llega el momento de poner algo en internet. Dani va a publicar una página estática de "próximamente" mientras el equipo prepara la migración, usando Cloud Storage para alojarla. Es un anticipo deliberado del servicio que se estudia a fondo en la lección 02-02: aquí lo usamos como ejercicio integrador de todo lo aprendido en el módulo, sin entrar en clases de almacenamiento, ciclos de vida ni versionado.

Paso 1. Preparar el entorno. Abre Cloud Shell y confirma dónde estás:

gcloud config set project alpinashop-dev
gcloud config set compute/region europe-west1
gcloud config list

Paso 2. Crear la página. Usa el editor o directamente el terminal:

mkdir -p ~/alpinashop-proximamente && cd ~/alpinashop-proximamente

cat > index.html <<'HTML'
<h1>AlpinaShop</h1>
<p>Material de montana. Estamos preparando nuestra nueva tienda online.</p>
<p>Muy pronto, aqui.</p>
HTML

cat > 404.html <<'HTML'
<h1>Pagina no encontrada</h1>
<p>Vuelve a la <a href="/">portada de AlpinaShop</a>.</p>
HTML

El bloque cat > fichero <<'HTML' ... HTML es un here-document: escribe en el fichero todo lo que hay entre las dos marcas. Poner la marca entre comillas simples evita que bash intente interpretar $ o comillas dentro del contenido.

Paso 3. Crear el bucket. Los nombres de bucket son únicos en todo Google Cloud, igual que los projectId, así que añadimos un sufijo para evitar colisiones:

# Genera un nombre unico anadiendo un sufijo aleatorio
export BUCKET="alpinashop-proximamente-$RANDOM"
echo "Bucket: $BUCKET"

gcloud storage buckets create "gs://$BUCKET" \
  --location=europe-west1 \
  --uniform-bucket-level-access

Desglose del comando:

  • gs:// es el esquema de URI de Cloud Storage.
  • --location=europe-west1 fija la región. Recuerda de la lección 01-05: la ubicación de un bucket es inmutable.
  • --uniform-bucket-level-access desactiva las listas de control de acceso por objeto y hace que todos los permisos se gestionen solo con IAM. Es la opción recomendada porque simplifica enormemente el razonamiento sobre quién puede ver qué.

Paso 4. Subir los ficheros:

gcloud storage cp index.html 404.html "gs://$BUCKET/"
gcloud storage ls "gs://$BUCKET/"

Paso 5. Hacer público el contenido. Este paso concede lectura a cualquiera en internet. Es exactamente lo que queremos para una página pública, y exactamente lo que nunca debes hacer con un bucket que contenga datos internos:

gcloud storage buckets add-iam-policy-binding "gs://$BUCKET" \
  --member=allUsers \
  --role=roles/storage.objectViewer

allUsers es un identificador especial de IAM que significa "cualquiera, autenticado o no". El rol roles/storage.objectViewer concede solo lectura de objetos: no permite listar la configuración del bucket ni escribir nada.

Paso 6. Configurar el bucket como sitio web y comprobar el resultado:

gcloud storage buckets update "gs://$BUCKET" \
  --web-main-page-index=index.html \
  --web-error-page=404.html
# Comprobar desde el propio terminal que la pagina se sirve
curl -s "https://storage.googleapis.com/$BUCKET/index.html"
# Mostrar la URL para abrirla en el navegador
echo "https://storage.googleapis.com/$BUCKET/index.html"

Si curl devuelve el HTML que escribiste, acabas de publicar tu primer contenido en Google Cloud: has creado un recurso en la región correcta, has configurado sus permisos y lo has verificado, todo desde el navegador y sin instalar nada.

Paso 7. Limpiar. Fundamental: no dejes recursos encendidos que no vas a usar.

# Borra el bucket y todo su contenido
gcloud storage rm --recursive "gs://$BUCKET"

Lo que no hemos hecho aquí, y se verá más adelante: servir la página bajo el dominio alpinashop.example con certificado TLS (requiere un balanceador de carga, lección 03-07), acelerarla con Cloud CDN (03-03), elegir clase de almacenamiento y reglas de ciclo de vida (02-02) y automatizar el despliegue con Cloud Build (06-01).

Errores Comunes y Consejos

  • Confundir gcloud auth login con gcloud auth application-default login. El primero autentica el CLI; el segundo, tu código. Si tu script de Python falla con error de credenciales y gcloud funciona, es esto.
  • Instalar paquetes en Cloud Shell y perderlos. Solo $HOME persiste. Usa ~/.customize_environment para lo que necesites en cada arranque.
  • Ejecutar un comando en el proyecto equivocado. Usa configuraciones nombradas, pon el proyecto en el prompt y añade --project explícito en los scripts peligrosos.
  • Filtrar con grep en lugar de --filter. grep depende del formato de salida, que puede cambiar; --filter opera sobre los campos reales del objeto.
  • Usar --quiet al teclear a mano. Está pensado para scripts desatendidos. Interactivamente, esas confirmaciones son tu última línea de defensa.
  • Suponer que un comando no existe. Prueba gcloud search-help, y prueba los prefijos beta y alpha.
  • Trabajar con un CLI desactualizado. Muchos errores extraños se resuelven con gcloud components update.
  • Consejo: aprende --format=json para explorar. Es la forma de descubrir qué campos tiene un recurso y, por tanto, por qué campos puedes filtrar y qué puedes extraer.
  • Consejo: guarda tus comandos en scripts desde el principio. Lo que hoy tecleas a mano, mañana lo repetirás; y en el módulo 6 lo convertirás en un pipeline.
  • Consejo: usa el enlace "Línea de comandos equivalente" de la consola. Sigue siendo la forma más rápida de aprender comandos nuevos.

Ejercicios

Ejercicio 1: dominar --format y --filter

Escribe los comandos gcloud que resuelvan lo siguiente. Ejecútalos en tu proyecto para comprobarlos:

  1. Mostrar todos tus proyectos en una tabla con solo el ID y el número de proyecto.
  2. Guardar en una variable de bash llamada NUM el número del proyecto alpinashop-dev, sin cabeceras ni texto adicional.
  3. Listar las APIs habilitadas cuyo nombre contenga storage o sql, mostrando únicamente el nombre.
  4. Listar las zonas de la región europe-west1 mostrando nombre y estado en formato tabla.
  5. Averiguar, sin salir del terminal, qué comando de gcloud sirve para gestionar presupuestos de facturación.

Ejercicio 2: configuraciones y autenticación

Marta necesita trabajar sobre dos proyectos y quiere evitar accidentes.

  1. Crea dos configuraciones nombradas, alpinashop-dev y alpinashop-prod, cada una con su proyecto, la región europe-west1 y la zona europe-west1-b.
  2. Escribe el comando para listar las instancias de producción sin cambiar la configuración activa (dos formas distintas de conseguirlo).
  3. Dani ejecuta correctamente gcloud storage ls pero su script de Python falla con DefaultCredentialsError. Explica la causa y da el comando que lo soluciona.
  4. Propón una medida adicional que reduzca el riesgo de ejecutar por error un comando destructivo en producción.

Ejercicio 3: despliegue completo y limpieza

Reproduce el despliegue del apartado 11 con una variante: en lugar de una página fija, la portada debe mostrar la fecha en que se generó y la región donde está alojado el bucket.

  1. Genera el index.html incluyendo la fecha actual y el nombre de la región.
  2. Crea el bucket con un nombre único, súbelo, hazlo público y configúralo como sitio web.
  3. Verifica con curl que el contenido servido incluye la fecha.
  4. Escribe un pequeño script que compruebe que el bucket existe y muestre cuántos objetos contiene.
  5. Elimina todos los recursos creados.

Soluciones

Solución 1

# 1
gcloud projects list --format="table(projectId, projectNumber)"

# 2
NUM=$(gcloud projects describe alpinashop-dev --format="value(projectNumber)")
echo "$NUM"

# 3
gcloud services list --enabled \
  --filter="config.name~storage OR config.name~sql" \
  --format="value(config.name)"

# 4
gcloud compute zones list \
  --filter="region:europe-west1" \
  --format="table(name, status)"

# 5
gcloud search-help "budget"

El punto 5 devolverá, entre otros resultados, gcloud billing budgets, con sus acciones create, list, describe, update y delete. Es la forma correcta de descubrir comandos sin salir del terminal.

Solución 2

# 1. Configuracion de desarrollo
gcloud config configurations create alpinashop-dev
gcloud config set project alpinashop-dev
gcloud config set compute/region europe-west1
gcloud config set compute/zone europe-west1-b

# Configuracion de produccion
gcloud config configurations create alpinashop-prod
gcloud config set project alpinashop-prod
gcloud config set compute/region europe-west1
gcloud config set compute/zone europe-west1-b

# Volver a desarrollo como configuracion activa
gcloud config configurations activate alpinashop-dev
# 2. Dos formas de consultar produccion sin cambiar la configuracion activa
gcloud compute instances list --configuration=alpinashop-prod
gcloud compute instances list --project=alpinashop-prod

La primera usa la configuración completa de producción (cuenta, proyecto, región); la segunda solo sobrescribe el proyecto y conserva el resto de la configuración activa. Para operaciones de solo lectura ambas sirven; si las configuraciones usaran cuentas distintas, la primera sería la correcta.

  1. La causa es que gcloud auth login autentica el CLI, pero las bibliotecas cliente de Python buscan las Application Default Credentials, que son un fichero distinto. La solución:
gcloud auth application-default login
  1. Varias medidas válidas, y lo ideal es combinarlas: mostrar el proyecto activo en el prompt de bash (export PS1='[$(gcloud config get-value project)] \w\$ '); usar siempre --project explícito en los scripts que borran o modifican recursos; no conceder a la cuenta de trabajo diario permisos de borrado en producción, aplicando el principio de mínimo privilegio (lección 03-04); y usar navegadores o perfiles distintos para consola de desarrollo y de producción.

Solución 3

#!/bin/bash
set -e

REGION="europe-west1"
BUCKET="alpinashop-proximamente-$RANDOM"

# 1. Generar la pagina con fecha y region
mkdir -p ~/alpinashop-proximamente && cd ~/alpinashop-proximamente

cat > index.html <<HTML
<h1>AlpinaShop</h1>
<p>Material de montana. Nueva tienda online en camino.</p>
<p>Generado el $(date '+%d/%m/%Y %H:%M') | Alojado en la region $REGION</p>
HTML

Fíjate en una diferencia respecto al ejemplo del apartado 11: aquí la marca del here-document no va entre comillas simples (<<HTML en lugar de <<'HTML'), precisamente porque queremos que bash sustituya $(date ...) y $REGION antes de escribir el fichero.

# 2. Crear el bucket, subir, publicar y configurar como sitio web
gcloud storage buckets create "gs://$BUCKET" \
  --location="$REGION" \
  --uniform-bucket-level-access

gcloud storage cp index.html "gs://$BUCKET/"

gcloud storage buckets add-iam-policy-binding "gs://$BUCKET" \
  --member=allUsers \
  --role=roles/storage.objectViewer

gcloud storage buckets update "gs://$BUCKET" \
  --web-main-page-index=index.html
# 3. Verificar el contenido servido
curl -s "https://storage.googleapis.com/$BUCKET/index.html" | grep "Generado el"
# 4. Comprobar existencia y contar objetos
if gcloud storage buckets describe "gs://$BUCKET" \
     --format="value(name)" > /dev/null 2>&1; then
  OBJETOS=$(gcloud storage ls "gs://$BUCKET/**" | wc -l)
  echo "El bucket $BUCKET existe y contiene $OBJETOS objeto(s)."
else
  echo "El bucket $BUCKET no existe."
  exit 1
fi

La comprobación usa describe redirigiendo la salida a /dev/null y evaluando solo su código de salida: si el bucket no existe, el comando falla y entra en la rama else. El patrón gs://$BUCKET/** lista todos los objetos de forma recursiva, y wc -l los cuenta.

# 5. Limpieza completa
gcloud storage rm --recursive "gs://$BUCKET"

Conclusión

Con esta lección cerramos el módulo 1, y lo hacemos con algo funcionando en internet. Hemos aprendido qué es Cloud Shell, qué trae preinstalado y cuáles son sus límites reales —especialmente que solo persisten los 5 GB de tu $HOME—, además de su editor web y la vista previa. Hemos visto cómo instalar el CLI en Linux, macOS y Windows, y cuándo compensa cada opción. Hemos desmontado la anatomía de un comando gcloud en grupo, subgrupo, acción y flags, lo que convierte la CLI en algo deducible, y hemos aprendido a pedirle ayuda con --help y gcloud search-help. Hemos dominado --format (con table para leer, value para scripts y json para explorar) y --filter con todos sus operadores. Hemos aclarado la diferencia entre gcloud auth login y gcloud auth application-default login, y hemos montado configuraciones nombradas para alternar con seguridad entre alpinashop-dev y alpinashop-prod. Hemos conocido gcloud storage, bq y kubectl, que nos acompañarán en módulos posteriores, y hemos escrito nuestros primeros scripts encadenando gcloud con bash. Y, sobre todo, Dani ha publicado la página de "próximamente" de AlpinaShop desde el navegador, ha comprobado que se sirve y ha limpiado los recursos después.

Repasando el módulo entero: entendimos qué es la nube y por qué AlpinaShop la necesita, abrimos la cuenta con presupuestos de seguridad desde el primer día, aprendimos a movernos por la consola, diseñamos la jerarquía de proyectos y la facturación, elegimos europe-west1 como región y comprendimos qué parte de la seguridad es nuestra, y ahora sabemos manejar las herramientas. Tenemos el terreno preparado y sabemos usar la maquinaria.

En el módulo 2, Servicios principales de GCP, empezamos a construir de verdad: crearemos máquinas virtuales con Compute Engine, moveremos los 60 GB de imágenes de producto al bucket alpinashop-catalogo de Cloud Storage, migraremos la base de datos tienda a la instancia Cloud SQL alpinashop-pedidos, conoceremos App Engine y el clúster alpinashop-cluster en Google Kubernetes Engine, exploraremos las bases de datos NoSQL y terminaremos con el criterio para elegir el servicio de cómputo adecuado en cada caso. La migración de AlpinaShop deja de ser un plan y empieza a ser código.

Curso de Google Cloud Platform (GCP)

Módulo 1: Introducción a Google Cloud Platform

Módulo 2: Servicios principales de GCP

Módulo 3: Redes y seguridad

Módulo 4: Datos y análisis

Módulo 5: Aprendizaje automático e IA

Módulo 6: DevOps y monitoreo

Módulo 7: Temas avanzados de GCP

Módulo 8: Proyecto final

© Copyright 2026. Todos los derechos reservados