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
- Qué es Cloud Shell
- Instalación local del Google Cloud CLI
- Cloud Shell frente a CLI local
- Anatomía de un comando
gcloudy sistema de ayuda - Formatos de salida:
--format - Filtros:
--filter - Autenticación:
gcloud init,auth loginyapplication-default - Configuraciones nombradas
- Otras herramientas del SDK
- Scripting básico con
gcloud - Primer despliegue real: la página de "próximamente" de AlpinaShop
- 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
Dockerfilesin 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
- 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-climacOS, con Homebrew:
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:
# Instalar componentes que no vienen por defecto
gcloud components install kubectl
gcloud components install beta alphaUn 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.
- 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.
- Anatomía de un comando
gcloud y sistema de ayuda
gcloud y sistema de ayudaTodos los comandos de gcloud siguen la misma estructura, y entenderla es lo que convierte la CLI en algo deducible en lugar de memorizable:
| 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:80Los 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
# 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:
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.
- Formatos de salida:
--format
--formatPor 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=projectIdLa regla que conviene grabar: table para leer tú, value para que lo lea un script, json para procesarlo con jq.
- Filtros:
--filter
--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"
- Autenticación:
gcloud init, auth login y application-default
gcloud init, auth login y application-defaultEste 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.
Ú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 |
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.jsonLas cuentas de servicio, sus roles y las alternativas seguras a las claves descargadas (Workload Identity Federation) se estudian en la lección 03-04.
- 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.
# 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-bDos 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-prodY 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\$ '
- 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 |
# GKE: obtener credenciales de un clúster para poder usar kubectl
gcloud container clusters get-credentials alpinashop-cluster \
--region=europe-west1
kubectl get nodesEstas 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.
- Scripting básico con
gcloud
gcloudLa 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 -epara que el script se detenga en cuanto un comando falle, en lugar de seguir sobre un estado inconsistente. - Indica el proyecto explícitamente con
--projecten 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-runo tienen equivalentes de solo lectura: úsalos antes de ejecutar operaciones destructivas.
- 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 listPaso 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>
HTMLEl 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-accessDesglose del comando:
gs://es el esquema de URI de Cloud Storage.--location=europe-west1fija la región. Recuerda de la lección 01-05: la ubicación de un bucket es inmutable.--uniform-bucket-level-accessdesactiva 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:
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.objectViewerallUsers 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.
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 logincongcloud auth application-default login. El primero autentica el CLI; el segundo, tu código. Si tu script de Python falla con error de credenciales ygcloudfunciona, es esto. - Instalar paquetes en Cloud Shell y perderlos. Solo
$HOMEpersiste. Usa~/.customize_environmentpara 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
--projectexplícito en los scripts peligrosos. - Filtrar con
grepen lugar de--filter.grepdepende del formato de salida, que puede cambiar;--filteropera sobre los campos reales del objeto. - Usar
--quietal 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 prefijosbetayalpha. - Trabajar con un CLI desactualizado. Muchos errores extraños se resuelven con
gcloud components update. - Consejo: aprende
--format=jsonpara 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:
- Mostrar todos tus proyectos en una tabla con solo el ID y el número de proyecto.
- Guardar en una variable de bash llamada
NUMel número del proyectoalpinashop-dev, sin cabeceras ni texto adicional. - Listar las APIs habilitadas cuyo nombre contenga
storageosql, mostrando únicamente el nombre. - Listar las zonas de la región
europe-west1mostrando nombre y estado en formato tabla. - Averiguar, sin salir del terminal, qué comando de
gcloudsirve para gestionar presupuestos de facturación.
Ejercicio 2: configuraciones y autenticación
Marta necesita trabajar sobre dos proyectos y quiere evitar accidentes.
- Crea dos configuraciones nombradas,
alpinashop-devyalpinashop-prod, cada una con su proyecto, la regióneurope-west1y la zonaeurope-west1-b. - Escribe el comando para listar las instancias de producción sin cambiar la configuración activa (dos formas distintas de conseguirlo).
- Dani ejecuta correctamente
gcloud storage lspero su script de Python falla conDefaultCredentialsError. Explica la causa y da el comando que lo soluciona. - 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.
- Genera el
index.htmlincluyendo la fecha actual y el nombre de la región. - Crea el bucket con un nombre único, súbelo, hazlo público y configúralo como sitio web.
- Verifica con
curlque el contenido servido incluye la fecha. - Escribe un pequeño script que compruebe que el bucket existe y muestre cuántos objetos contiene.
- 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-prodLa 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.
- La causa es que
gcloud auth loginautentica el CLI, pero las bibliotecas cliente de Python buscan las Application Default Credentials, que son un fichero distinto. La solución:
- 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--projectexplí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>
HTMLFí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
fiLa 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.
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
- ¿Qué es Google Cloud Platform?
- Configuración de tu cuenta de GCP
- Descripción general de la consola de GCP
- Proyectos, jerarquía de recursos y facturación
- Regiones, zonas y modelo de responsabilidad compartida
- Cloud Shell y la CLI de gcloud
Módulo 2: Servicios principales de GCP
- Compute Engine: máquinas virtuales en Google Cloud
- Cloud Storage: almacenamiento de objetos
- Cloud SQL: bases de datos relacionales gestionadas
- App Engine: plataforma como servicio
- Google Kubernetes Engine (GKE)
- Bases de datos NoSQL: Firestore, Bigtable y Spanner
- Cómo elegir el servicio de cómputo adecuado
Módulo 3: Redes y seguridad
- Redes VPC
- Balanceo de carga en la nube
- Cloud CDN
- Gestión de identidad y acceso (IAM)
- Cloud Armor
- Secretos y cifrado: Secret Manager y Cloud KMS
- Cloud DNS, certificados TLS y publicación segura de servicios
Módulo 4: Datos y análisis
- BigQuery: el almacén de datos analítico
- Cloud Dataflow: procesamiento de datos por lotes y en streaming
- Cloud Dataproc: Spark y Hadoop gestionados
- Cloud Pub/Sub: mensajería asíncrona
- Cloud Data Fusion: integración de datos sin código
- Orquestación de pipelines con Cloud Composer y Workflows
- Gobierno del dato y cuadros de mando con Dataplex y Looker Studio
Módulo 5: Aprendizaje automático e IA
- Vertex AI: la plataforma de machine learning de GCP
- AutoML: modelos a medida sin escribir código
- TensorFlow en GCP: entrenamiento y servicio de modelos
- API de lenguaje natural
- API de visión
- IA generativa en Vertex AI: modelos Gemini y embeddings
- MLOps: del modelo al producto con Vertex AI Pipelines
Módulo 6: DevOps y monitoreo
- Cloud Build: integración continua en GCP
- Cloud Source Repositories y gestión del código fuente
- Cloud Functions: funciones sin servidor
- Cloud Monitoring (antes Stackdriver): métricas, paneles y alertas
- Cloud Deployment Manager e infraestructura como código nativa
- Cloud Logging y Cloud Trace: logs, trazas y diagnóstico
- Terraform en GCP: infraestructura como código en la práctica
Módulo 7: Temas avanzados de GCP
- Híbrido y multinube con Anthos
- Computación sin servidor con Cloud Run
- Redes avanzadas: VPC compartida, peering y conectividad híbrida
- Mejores prácticas de seguridad
- Gestión y optimización de costos
- Fiabilidad: SLO, alta disponibilidad y recuperación ante desastres
- Gobierno a escala: organización, políticas y auditoría
