Fins ara hem treballat sobretot amb conceptes i amb la consola web. En aquesta lliçó canviem de marxa: aprendrem l'eina amb què s'administra Google Cloud de debò en el dia a dia, la CLI de gcloud, i l'entorn que la fa accessible des de qualsevol navegador sense instal·lar res, Cloud Shell.

Dominar gcloud no consisteix a memoritzar comandes, sinó a entendre'n l'estructura, saber demanar-li ajuda i saber extreure exactament la dada que necessites. Amb això, qualsevol operació de qualsevol servei es torna deduïble. Veurem què és Cloud Shell i quins límits té, com instal·lar el CLI en local, l'anatomia d'una comanda i el sistema d'ajuda, els formats de sortida i els filtres, l'autenticació i els seus dos modes, les configuracions anomenades per alternar entre alpinashop-dev i alpinashop-prod, la resta d'eines del SDK, i el scripting bàsic que encadena comandes.

I tancarem el mòdul amb el primer desplegament real del curs: Dani publicarà a internet una pàgina de «pròximament» d'AlpinaShop, d'extrem a extrem, sense sortir del navegador.

Contingut

  1. Què és Cloud Shell
  2. Instal·lació local del Google Cloud CLI
  3. Cloud Shell davant de CLI local
  4. Anatomia d'una comanda gcloud i sistema d'ajuda
  5. Formats de sortida: --format
  6. Filtres: --filter
  7. Autenticació: gcloud init, auth login i application-default
  8. Configuracions anomenades
  9. Altres eines del SDK
  10. Scripting bàsic amb gcloud
  11. Primer desplegament real: la pàgina de «pròximament» d'AlpinaShop

  1. Què és Cloud Shell

Cloud Shell és una màquina virtual Linux gratuïta que s'obre dins del navegador des de la icona >_ de la consola. Està pensada perquè puguis administrar Google Cloud sense instal·lar res i sense configurar credencials.

Què porta ja instal·lat i configurat:

Categoria Contingut
Google Cloud CLI gcloud, gsutil, bq, kubectl
Llenguatges Python, Java, Go, Node.js, .NET, Ruby, PHP
Eines git, docker, terraform, make, vim, nano, jq, curl
Autenticació Ja autenticada amb el teu usuari de la consola
Editor Cloud Shell Editor, basat en la tecnologia de VS Code

Característiques i límits que cal conèixer abans de confiar-hi:

Aspecte Detall
Cost Gratuït
Màquina Instància petita (de l'ordre d'1-2 vCPU i uns pocs GB de RAM)
Disc persistent 5 GB muntats al teu $HOME, que sí que persisteixen entre sessions
Fora de $HOME Tot es perd: paquets instal·lats amb apt, canvis a /etc, etc.
Inactivitat La sessió es tanca després d'aproximadament una hora sense ús
Sessió màxima Al voltant de 12 hores seguides
Esborrat per inactivitat Si no fas servir Cloud Shell durant diversos mesos, el disc es pot eliminar (amb avís previ)
Quota d'ús Existeix un límit d'hores setmanals

La conseqüència pràctica del punt de la persistència és important: si instal·les alguna cosa amb apt install, desapareixerà a la sessió següent. Perquè sobrevisqui, o bé ho instal·les al teu $HOME, o bé ho automatitzes al fitxer ~/.customize_environment, que Cloud Shell executa en arrencar la màquina.

Dues funcions addicionals que farem servir:

  • Cloud Shell Editor: s'obre amb el botó «Obrir editor» i dona un IDE al navegador, amb explorador de fitxers, terminal integrada i ressaltat de sintaxi. Molt còmode per escriure scripts o editar un Dockerfile sense sortir de la consola.
  • Vista prèvia web: la icona amb forma d'ull permet obrir al navegador un servei que estiguis executant a Cloud Shell (per defecte al port 8080) mitjançant una URL temporal i autenticada. És el que permet provar l'aplicació Flask d'AlpinaShop sense desplegar-la.
# Comprovar la màquina en la qual estàs treballant
cat /etc/os-release | head -n2
nproc          # nombre de CPUs disponibles
free -h        # memòria
df -h $HOME    # espai del disc persistent
# Versió del CLI i components instal·lats
gcloud version

  1. Instal·lació local del Google Cloud CLI

Cloud Shell és excel·lent per aprendre i per a tasques puntuals, però per treballar-hi diàriament voldràs el CLI a la teva pròpia màquina, amb el teu editor, els teus fitxers i els teus scripts.

Linux (Debian/Ubuntu), mitjançant el repositori oficial:

# 1. Dependències i clau del repositori de Google
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates gnupg curl

# 2. Afegir la clau de signatura del repositori
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg

# 3. Afegir el repositori a les fonts d'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. Instal·lar
sudo apt-get update && sudo apt-get install -y google-cloud-cli

macOS, amb Homebrew:

brew install --cask google-cloud-sdk

Windows: descarrega l'instal·lador GoogleCloudSDKInstaller.exe des de la documentació oficial i executa'l. En finalitzar ofereix llançar gcloud init. També funciona perfectament instal·lant la versió Linux dins de WSL2, que és l'opció preferida per molts desenvolupadors.

Gestió de components addicionals:

# Veure quins components hi ha instal·lats i quins estan disponibles
gcloud components list
# Instal·lar components que no vénen per defecte
gcloud components install kubectl
gcloud components install beta alpha
# Actualitzar el CLI i tots els seus components
gcloud components update

Un avís: si vas instal·lar el CLI mitjançant apt o Homebrew, gcloud components update pot estar deshabilitat, perquè el gestor de paquets s'encarrega de les actualitzacions. En aquest cas, actualitza amb apt upgrade o brew upgrade. A Cloud Shell, el CLI s'actualitza sol.

  1. Cloud Shell davant de CLI local

Criteri Cloud Shell CLI local
Instal·lació Cap Requereix instal·lar i actualitzar
Autenticació Automàtica amb el teu usuari Requereix gcloud init / auth login
Cost Gratuït Gratuït (però consumeix la teva màquina)
Persistència Només 5 GB a $HOME Tot el teu disc
Potència Màquina petita La del teu equip
Eines preinstal·lades Moltes i actualitzades Les que instal·lis
Accés a fitxers locals Requereix pujar-los Directe
Integració amb el teu editor/IDE Limitada a l'editor web Completa
Sessions llargues o processos pesants Limitat (timeout, quota) Sense límit
Ús des de qualsevol dispositiu Sí, només cal navegador No
Recomanat per a Aprendre, tasques puntuals, emergències, demos Feina diària, desenvolupament, scripts

La recomanació per a aquest curs: fes servir Cloud Shell. Elimina tota la fricció d'instal·lació i garanteix que treballes amb la mateixa versió que es descriu aquí. Instal·la el CLI local quan comencis a desenvolupar de debò.

  1. Anatomia d'una comanda gcloud i sistema d'ajuda

Totes les comandes de gcloud segueixen la mateixa estructura, i entendre-la és el que converteix la CLI en una cosa deduïble en lloc de memoritzable:

gcloud [GRUP] [SUBGRUP...] [ACCIÓ] [ARGUMENTS_POSICIONALS] [--FLAGS]
Part Què és Exemples
Grup El servei o àrea compute, storage, projects, iam, sql, run, billing
Subgrup El tipus de recurs dins del servei instances, disks, firewall-rules, buckets
Acció El verb list, describe, create, delete, update, add-iam-policy-binding
Arguments El nom del recurs alpinashop-dev, web-1
Flags Opcions --zone=europe-west1-b, --format=json

Exemples llegits segons aquesta estructura:

# grup=compute, subgrup=instances, accio=list
gcloud compute instances list

# grup=projects, accio=describe, argument=alpinashop-dev
gcloud projects describe alpinashop-dev

# grup=compute, subgrup=firewall-rules, accio=create, argument=permitir-http
gcloud compute firewall-rules create permitir-http --allow=tcp:80

Els verbs són consistents entre serveis, i aquesta consistència és el que permet deduir comandes que no has vist mai:

Verb Què fa
list Llista recursos del tipus indicat
describe Mostra el detall complet d'UN recurs
create Crea un recurs
delete L'elimina
update Modifica atributs
add-iam-policy-binding Concedeix un rol
get-iam-policy Mostra la política de permisos

Si saps que existeix gcloud compute instances list, pots deduir que existirà gcloud sql instances list i gcloud run services list. I encertes.

Demanar ajuda

# Veure els grups de primer nivell disponibles
gcloud help
# Ajuda d'un grup: quins subgrups i accions ofereix
gcloud compute --help
gcloud compute instances --help
# Ajuda detallada d'una comanda concreta, amb TOTS els seus flags i exemples
gcloud compute instances create --help
# Buscar comandes per paraula clau quan no saps on viu una cosa
gcloud search-help "budget"
gcloud search-help "service account key"

gcloud search-help és una eina infravalorada: cerca a tota l'ajuda del CLI i retorna les comandes rellevants ordenades per pertinença. Quan no sàpigues quina comanda fer servir, comença per aquí.

Versions alpha i beta

Algunes comandes només estan disponibles en fases preliminars i requereixen un prefix:

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

Regla pràctica: si una comanda «no existeix», prova amb beta i amb alpha abans de donar-la per impossible. I no facis servir comandes alpha a producció: la seva interfície pot canviar sense avís previ.

  1. Formats de sortida: --format

Per defecte, gcloud retorna una taula pensada per a humans. El flag --format permet canviar completament aquesta sortida, i és la clau per fer servir gcloud dins d'scripts.

Format Per a què serveix
--format=table(...) Taula llegible amb les columnes que triïs
--format=json JSON complet, ideal per processar amb jq
--format=yaml YAML, còmode de llegir per a objectes complexos
--format=value(...) Només els valors, sense capçaleres: el format per a scripts
--format=csv(...) CSV, per a fulls de càlcul
--format=flattened Tots els camps com a parells clau-valor, un per línia

Exemples aplicats:

# Taula a mida: només els camps que interessen
gcloud projects list \
  --format="table(projectId, name, projectNumber, lifecycleState)"
# JSON complet d'un recurs: útil per descobrir quins camps existeixen
gcloud projects describe alpinashop-dev --format=json
# Nomes un valor, sense capçalera ni adorns: perfecte per desar en una variable
PROJECT_NUMBER=$(gcloud projects describe alpinashop-dev \
  --format="value(projectNumber)")
echo "Numero de projecte: $PROJECT_NUMBER"
# Diversos valors en una linia, separats per tabuladors
gcloud projects list --format="value(projectId, projectNumber)"

Funcions útils dins de --format, que estalvien molt postprocessament:

# basename() extreu l'ultim segment d'una URL de recurs.
# Sense ella, la zona apareix com una URL llarga de l'API.
gcloud compute instances list \
  --format="table(name, zone.basename(), status, machineType.basename())"
# Canviar el nom de les columnes i ordenar la sortida
gcloud projects list \
  --format="table[box](projectId:label=ID, name:label=NOM)" \
  --sort-by=projectId

La regla que convé gravar: table perquè ho llegeixis tu, value perquè ho llegeixi un script, json per processar-ho amb jq.

  1. Filtres: --filter

--filter redueix el conjunt de resultats al costat del servidor o del client segons la comanda, evitant haver de filtrar amb grep, que és fràgil.

Operadors disponibles:

Operador Significat Exemple
= Igual --filter="status=RUNNING"
!= Diferent --filter="status!=TERMINATED"
>, <, >=, <= Comparació numèrica o de dates --filter="creationTimestamp>2026-01-01"
: Conté / té la clau --filter="labels.entorno:*"
~ Coincideix amb expressió regular --filter="name~^web-"
!~ No coincideix amb la regex --filter="name!~^test-"
AND, OR, NOT Combinació lògica --filter="status=RUNNING AND zone:europe-west1"
( ) Agrupació --filter="(a=1 OR b=2) AND c=3"

Exemples aplicats a AlpinaShop:

# Instàncies en execució en qualsevol zona d'europe-west1
gcloud compute instances list \
  --filter="status=RUNNING AND zone:europe-west1" \
  --format="table(name, zone.basename(), status)"
# Projectes etiquetats com a entorno=desarrollo
gcloud projects list \
  --filter="labels.entorno=desarrollo" \
  --format="table(projectId, name)"
# Totes les APIs actives relacionades amb emmagatzematge o base de dades
gcloud services list --enabled \
  --filter="config.name~storage OR config.name~sql" \
  --format="value(config.name)"

Com descobrir per quins camps es pot filtrar: mira primer la sortida en JSON. Els noms de camp del JSON són exactament els que accepta --filter.

# Pas 1: veure l'estructura completa de l'objecte
gcloud compute instances describe web-1 --zone=europe-west1-b --format=json

# Pas 2: filtrar fent servir els noms de camp que has vist
gcloud compute instances list --filter="machineType~e2-micro"

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

Aquest apartat resol una de les confusions més habituals entre qui comença.

gcloud init

És l'assistent de configuració inicial. Fa tres coses en una: t'autentica, et deixa triar projecte per defecte i et deixa triar regió i zona per defecte.

gcloud init

Fes-lo servir la primera vegada que configures el CLI en una màquina, o quan vulguis crear una configuració nova des de zero.

gcloud auth login davant de gcloud auth application-default login

Són dues credencials diferents, per a dos consumidors diferents:

gcloud auth login gcloud auth application-default login
Per a qui Per a la comanda gcloud i altres eines del SDK Per al teu codi: biblioteques client de Python, Java, Go...
Què desa Credencials d'usuari del SDK Un fitxer d'Application Default Credentials (ADC)
On Configuració interna de gcloud ~/.config/gcloud/application_default_credentials.json
Qui ho fa servir gcloud, gsutil, bq El codi que fa servir google-cloud-* al teu equip
Quan el necessites Sempre, per administrar Només si desenvolupes localment contra APIs de Google Cloud
# Autenticar el CLI
gcloud auth login
# Autenticar el CODI que executes a la teva maquina (ADC)
gcloud auth application-default login
# Veure quins comptes estan autenticats i quin està actiu
gcloud auth list

L'escenari clàssic que confon tothom: Dani executa gcloud storage ls i funciona, però el seu script de Python falla amb un error de credencials. La causa és que va fer gcloud auth login però no gcloud auth application-default login: la biblioteca client busca les ADC, no les credencials del CLI.

Comptes de servei

Per a processos automatitzats (un pipeline de CI/CD, una tasca programada) no es fan servir credencials d'usuari, sinó comptes de servei. I dins de Google Cloud, el correcte és no descarregar claus: una VM, un servei de Cloud Run o un pod de GKE obtenen credencials automàticament del compte de servei que tinguin associat.

# Autenticar-se amb un compte de servei a partir d'un fitxer de clau.
# Evita-ho sempre que puguis: les claus descarregades son un risc de seguretat.
gcloud auth activate-service-account \
  --key-file=/ruta/clave.json

Els comptes de servei, els seus rols i les alternatives segures a les claus descarregades (Workload Identity Federation) s'estudien a la lliçó 03-04.

  1. Configuracions anomenades

Una configuració de gcloud és un conjunt de propietats: compte actiu, projecte, regió i zona per defecte. En pots tenir diverses amb nom i saltar entre elles amb una comanda, cosa que resol elegantment el problema d'alternar entre alpinashop-dev i alpinashop-prod.

# Veure les configuracions existents i quina està activa
gcloud config configurations list
# Crear la configuració de desenvolupament
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ó de producció
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
# Canviar d'una a l'altra
gcloud config configurations activate alpinashop-dev
# Veure la configuració activa completa
gcloud config list

Dues tècniques complementàries molt recomanables:

# Executar UNA comanda amb una altra configuració sense canviar l'activa
gcloud compute instances list --configuration=alpinashop-prod
# Sobreescriure el projecte només per a una comanda
gcloud compute instances list --project=alpinashop-prod

I un consell que evita accidents seriosos: afegeix el projecte actiu al teu prompt de bash. Veure a cada línia sobre quin projecte estàs treballant és la millor prevenció contra executar a producció una cosa pensada per a desenvolupament.

# Afegir a ~/.bashrc: mostra el projecte actiu al prompt
export PS1='[$(gcloud config get-value project 2>/dev/null)] \w\$ '

  1. Altres eines del SDK

El Google Cloud CLI inclou diverses eines a més de gcloud:

Eina Per a què Estat
gcloud Administració general de Google Cloud La principal
gcloud storage Operacions amb Cloud Storage Recomanada actualment: més ràpida que gsutil
gsutil Eina clàssica de Cloud Storage Encara funciona; s'està substituint per gcloud storage
bq Consultes i administració de BigQuery Estàndard per a BigQuery
kubectl Administració de Kubernetes / GKE Estàndard de Kubernetes, no específic de Google
# Cloud Storage: llistar buckets (forma actual i forma clàssica)
gcloud storage ls
gsutil ls
# BigQuery: llistar datasets del projecte
bq ls
# GKE: obtenir credencials d'un clúster per poder fer servir kubectl
gcloud container clusters get-credentials alpinashop-cluster \
  --region=europe-west1
kubectl get nodes

Aquestes eines es faran servir a fons als seus mòduls corresponents: Cloud Storage a 02-02, GKE a 02-05 i BigQuery a 04-01. Aquí només deixem constància que existeixen i que s'instal·len juntes.

  1. Scripting bàsic amb gcloud

La combinació de --format=value(...) amb bash converteix gcloud en una eina d'automatització potent. El patró fonamental és sempre el mateix: llistar amb un filtre, extreure un valor net, iterar.

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

echo "Projecte: $PROJECT_ID (numero $PROJECT_NUMBER)"
# Iterar sobre els resultats d'un llistat.
# Aquest bucle recorre totes les instancies aturades i mostra el seu nom i zona.
gcloud compute instances list \
  --filter="status=TERMINATED" \
  --format="value(name, zone.basename())" |
while read -r NOM ZONA; do
  echo "Instancia aturada: $NOM a $ZONA"
  # Aqui podries executar, per exemple:
  # gcloud compute instances delete "$NOM" --zone="$ZONA" --quiet
done
# El flag --quiet respon "si" a totes les confirmacions.
# Imprescindible en scripts desatesos, PERILLOS en teclejar a ma.
gcloud compute instances delete web-pruebas --zone=europe-west1-b --quiet
# Combinar gcloud amb jq per a consultes mes complexes sobre el JSON
gcloud projects list --format=json |
  jq -r '.[] | select(.labels.entorno == "desarrollo") | .projectId'

Bones pràctiques per a scripts de gcloud:

  • Comença sempre amb set -e perquè l'script s'aturi tan bon punt una comanda falli, en lloc de continuar sobre un estat inconsistent.
  • Indica el projecte explícitament amb --project en scripts importants, en lloc de dependre de la configuració activa. Un script que esborra recursos i confia en la configuració activa és un accident esperant a passar.
  • Prova primer sense --quiet, per veure què et preguntarà i sobre quins recursos actuaria.
  • Moltes comandes accepten --dry-run o tenen equivalents de només lectura: fes-los servir abans d'executar operacions destructives.

  1. Primer desplegament real: la pàgina de «pròximament» d'AlpinaShop

Arriba el moment de posar alguna cosa a internet. Dani publicarà una pàgina estàtica de «pròximament» mentre l'equip prepara la migració, fent servir Cloud Storage per allotjar-la. És un avançament deliberat del servei que s'estudia a fons a la lliçó 02-02: aquí el fem servir com a exercici integrador de tot l'après al mòdul, sense entrar en classes d'emmagatzematge, cicles de vida ni versionat.

Pas 1. Preparar l'entorn. Obre Cloud Shell i confirma on ets:

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

Pas 2. Crear la pàgina. Fes servir l'editor o directament el terminal:

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

cat > index.html <<'HTML'
<h1>AlpinaShop</h1>
<p>Material de muntanya. Estem preparant la nostra nova botiga en linia.</p>
<p>Molt aviat, aqui.</p>
HTML

cat > 404.html <<'HTML'
<h1>Pagina no trobada</h1>
<p>Torna a la <a href="/">portada d'AlpinaShop</a>.</p>
HTML

El bloc cat > fitxer <<'HTML' ... HTML és un here-document: escriu al fitxer tot el que hi ha entre les dues marques. Posar la marca entre cometes simples evita que bash intenti interpretar $ o cometes dins del contingut.

Pas 3. Crear el bucket. Els noms de bucket són únics a tot Google Cloud, igual que els projectId, així que hi afegim un sufix per evitar col·lisions:

# Genera un nom unic afegint un sufix aleatori
export BUCKET="alpinashop-proximamente-$RANDOM"
echo "Bucket: $BUCKET"

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

Desglossament de la comanda:

  • gs:// és l'esquema d'URI de Cloud Storage.
  • --location=europe-west1 fixa la regió. Recorda de la lliçó 01-05: la ubicació d'un bucket és immutable.
  • --uniform-bucket-level-access desactiva les llistes de control d'accés per objecte i fa que tots els permisos es gestionin només amb IAM. És l'opció recomanada perquè simplifica enormement el raonament sobre qui pot veure què.

Pas 4. Pujar els fitxers:

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

Pas 5. Fer públic el contingut. Aquest pas concedeix lectura a qualsevol a internet. És exactament el que volem per a una pàgina pública, i exactament el que mai has de fer amb un bucket que contingui dades internes:

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

allUsers és un identificador especial d'IAM que significa «qualsevol, autenticat o no». El rol roles/storage.objectViewer concedeix només lectura d'objectes: no permet llistar la configuració del bucket ni escriure res.

Pas 6. Configurar el bucket com a lloc web i comprovar el resultat:

gcloud storage buckets update "gs://$BUCKET" \
  --web-main-page-index=index.html \
  --web-error-page=404.html
# Comprovar des del propi terminal que la pagina se serveix
curl -s "https://storage.googleapis.com/$BUCKET/index.html"
# Mostrar la URL per obrir-la al navegador
echo "https://storage.googleapis.com/$BUCKET/index.html"

Si curl retorna l'HTML que vas escriure, acabes de publicar el teu primer contingut a Google Cloud: has creat un recurs a la regió correcta, n'has configurat els permisos i ho has verificat, tot des del navegador i sense instal·lar res.

Pas 7. Netejar. Fonamental: no deixis recursos encesos que no faràs servir.

# Esborra el bucket i tot el seu contingut
gcloud storage rm --recursive "gs://$BUCKET"

El que no hem fet aquí, i es veurà més endavant: servir la pàgina sota el domini alpinashop.example amb certificat TLS (requereix un balancejador de càrrega, lliçó 03-07), accelerar-la amb Cloud CDN (03-03), triar classe d'emmagatzematge i regles de cicle de vida (02-02) i automatitzar el desplegament amb Cloud Build (06-01).

Errors Habituals i Consells

  • Confondre gcloud auth login amb gcloud auth application-default login. El primer autentica el CLI; el segon, el teu codi. Si el teu script de Python falla amb error de credencials i gcloud funciona, és això.
  • Instal·lar paquets a Cloud Shell i perdre'ls. Només $HOME persisteix. Fes servir ~/.customize_environment per al que necessitis a cada arrencada.
  • Executar una comanda al projecte equivocat. Fes servir configuracions anomenades, posa el projecte al prompt i afegeix --project explícit als scripts perillosos.
  • Filtrar amb grep en lloc de --filter. grep depèn del format de sortida, que pot canviar; --filter opera sobre els camps reals de l'objecte.
  • Fer servir --quiet en teclejar a mà. Està pensat per a scripts desatesos. Interactivament, aquestes confirmacions són la teva última línia de defensa.
  • Suposar que una comanda no existeix. Prova gcloud search-help, i prova els prefixos beta i alpha.
  • Treballar amb un CLI desactualitzat. Molts errors estranys es resolen amb gcloud components update.
  • Consell: aprèn --format=json per explorar. És la manera de descobrir quins camps té un recurs i, per tant, per quins camps pots filtrar i què pots extreure.
  • Consell: desa les teves comandes en scripts des del principi. El que avui teclejes a mà, demà ho repetiràs; i al mòdul 6 ho convertiràs en un pipeline.
  • Consell: fes servir l'enllaç «Línia de comandes equivalent» de la consola. Continua sent la manera més ràpida d'aprendre comandes noves.

Exercicis

Exercici 1: dominar --format i --filter

Escriu les comandes gcloud que resolguin el següent. Executa-les al teu projecte per comprovar-les:

  1. Mostrar tots els teus projectes en una taula amb només l'ID i el número de projecte.
  2. Desar en una variable de bash anomenada NUM el número del projecte alpinashop-dev, sense capçaleres ni text addicional.
  3. Llistar les APIs habilitades el nom de les quals contingui storage o sql, mostrant únicament el nom.
  4. Llistar les zones de la regió europe-west1 mostrant nom i estat en format de taula.
  5. Esbrinar, sense sortir del terminal, quina comanda de gcloud serveix per gestionar pressupostos de facturació.

Exercici 2: configuracions i autenticació

Marta necessita treballar sobre dos projectes i vol evitar accidents.

  1. Crea dues configuracions anomenades, alpinashop-dev i alpinashop-prod, cadascuna amb el seu projecte, la regió europe-west1 i la zona europe-west1-b.
  2. Escriu la comanda per llistar les instàncies de producció sense canviar la configuració activa (dues maneres diferents d'aconseguir-ho).
  3. Dani executa correctament gcloud storage ls però el seu script de Python falla amb DefaultCredentialsError. Explica'n la causa i dona la comanda que ho soluciona.
  4. Proposa una mesura addicional que redueixi el risc d'executar per error una comanda destructiva a producció.

Exercici 3: desplegament complet i neteja

Reprodueix el desplegament de l'apartat 11 amb una variant: en lloc d'una pàgina fixa, la portada ha de mostrar la data en què es va generar i la regió on està allotjat el bucket.

  1. Genera l'index.html incloent-hi la data actual i el nom de la regió.
  2. Crea el bucket amb un nom únic, puja-hi el fitxer, fes-lo públic i configura'l com a lloc web.
  3. Verifica amb curl que el contingut servit inclou la data.
  4. Escriu un petit script que comprovi que el bucket existeix i mostri quants objectes conté.
  5. Elimina tots els recursos creats.

Solucions

Solució 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 punt 5 retornarà, entre altres resultats, gcloud billing budgets, amb les seves accions create, list, describe, update i delete. És la manera correcta de descobrir comandes sense sortir del terminal.

Solució 2

# 1. Configuracio de desenvolupament
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

# Configuracio de produccio
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

# Tornar a desenvolupament com a configuracio activa
gcloud config configurations activate alpinashop-dev
# 2. Dues maneres de consultar produccio sense canviar la configuracio activa
gcloud compute instances list --configuration=alpinashop-prod
gcloud compute instances list --project=alpinashop-prod

La primera fa servir la configuració completa de producció (compte, projecte, regió); la segona només sobreescriu el projecte i conserva la resta de la configuració activa. Per a operacions de només lectura totes dues serveixen; si les configuracions fessin servir comptes diferents, la primera seria la correcta.

  1. La causa és que gcloud auth login autentica el CLI, però les biblioteques client de Python busquen les Application Default Credentials, que són un fitxer diferent. La solució:
gcloud auth application-default login
  1. Diverses mesures vàlides, i l'ideal és combinar-les: mostrar el projecte actiu al prompt de bash (export PS1='[$(gcloud config get-value project)] \w\$ '); fer servir sempre --project explícit als scripts que esborren o modifiquen recursos; no concedir al compte de treball diari permisos d'esborrat a producció, aplicant el principi de mínim privilegi (lliçó 03-04); i fer servir navegadors o perfils diferents per a consola de desenvolupament i de producció.

Solució 3

#!/bin/bash
set -e

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

# 1. Generar la pagina amb data i regio
mkdir -p ~/alpinashop-proximamente && cd ~/alpinashop-proximamente

cat > index.html <<HTML
<h1>AlpinaShop</h1>
<p>Material de muntanya. Nova botiga en linia en cami.</p>
<p>Generat el $(date '+%d/%m/%Y %H:%M') | Allotjat a la regio $REGION</p>
HTML

Fixa't en una diferència respecte a l'exemple de l'apartat 11: aquí la marca del here-document no va entre cometes simples (<<HTML en lloc de <<'HTML'), precisament perquè volem que bash substitueixi $(date ...) i $REGION abans d'escriure el fitxer.

# 2. Crear el bucket, pujar, publicar i configurar com a lloc 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 contingut servit
curl -s "https://storage.googleapis.com/$BUCKET/index.html" | grep "Generat el"
# 4. Comprovar existencia i comptar objectes
if gcloud storage buckets describe "gs://$BUCKET" \
     --format="value(name)" > /dev/null 2>&1; then
  OBJECTES=$(gcloud storage ls "gs://$BUCKET/**" | wc -l)
  echo "El bucket $BUCKET existeix i conte $OBJECTES objecte(s)."
else
  echo "El bucket $BUCKET no existeix."
  exit 1
fi

La comprovació fa servir describe redirigint la sortida a /dev/null i avaluant només el seu codi de sortida: si el bucket no existeix, la comanda falla i entra a la branca else. El patró gs://$BUCKET/** llista tots els objectes de manera recursiva, i wc -l els compta.

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

Conclusió

Amb aquesta lliçó tanquem el mòdul 1, i ho fem amb alguna cosa funcionant a internet. Hem après què és Cloud Shell, què porta preinstal·lat i quins són els seus límits reals —especialment que només persisteixen els 5 GB del teu $HOME—, a més del seu editor web i la vista prèvia. Hem vist com instal·lar el CLI a Linux, macOS i Windows, i quan compensa cada opció. Hem desmuntat l'anatomia d'una comanda gcloud en grup, subgrup, acció i flags, cosa que converteix la CLI en una cosa deduïble, i hem après a demanar-li ajuda amb --help i gcloud search-help. Hem dominat --format (amb table per llegir, value per a scripts i json per explorar) i --filter amb tots els seus operadors. Hem aclarit la diferència entre gcloud auth login i gcloud auth application-default login, i hem muntat configuracions anomenades per alternar amb seguretat entre alpinashop-dev i alpinashop-prod. Hem conegut gcloud storage, bq i kubectl, que ens acompanyaran en mòduls posteriors, i hem escrit els nostres primers scripts encadenant gcloud amb bash. I, sobretot, Dani ha publicat la pàgina de «pròximament» d'AlpinaShop des del navegador, ha comprovat que se serveix i ha netejat els recursos després.

Repassant el mòdul sencer: vam entendre què és el núvol i per què AlpinaShop el necessita, vam obrir el compte amb pressupostos de seguretat des del primer dia, vam aprendre a moure'ns per la consola, vam dissenyar la jerarquia de projectes i la facturació, vam triar europe-west1 com a regió i vam comprendre quina part de la seguretat és nostra, i ara sabem manejar les eines. Tenim el terreny preparat i sabem fer servir la maquinària.

Al mòdul 2, Serveis principals de GCP, comencem a construir de debò: crearem màquines virtuals amb Compute Engine, mourem els 60 GB d'imatges de producte al bucket alpinashop-catalogo de Cloud Storage, migrarem la base de dades tienda a la instància Cloud SQL alpinashop-pedidos, coneixerem App Engine i el clúster alpinashop-cluster a Google Kubernetes Engine, explorarem les bases de dades NoSQL i acabarem amb el criteri per triar el servei de còmput adequat en cada cas. La migració d'AlpinaShop deixa de ser un pla i comença a ser codi.

Curs de Google Cloud Platform (GCP)

Mòdul 1: Introducció a Google Cloud Platform

Mòdul 2: Serveis principals de GCP

Mòdul 3: Xarxes i seguretat

Mòdul 4: Dades i anàlisi

Mòdul 5: Aprenentatge automàtic i IA

Mòdul 6: DevOps i monitoratge

Mòdul 7: Temes avançats de GCP

Mòdul 8: Projecte final

© Copyright 2026. Tots els drets reservats