Todo recurso que crees en Google Cloud vive dentro de un proyecto, y todo proyecto ocupa un lugar en una jerarquía. Esa estructura no es burocracia administrativa: determina quién puede hacer qué, quién paga qué, qué cuotas se aplican, qué políticas se heredan y qué recursos pueden verse entre sí. Diseñarla bien al principio cuesta una tarde; rediseñarla dos años después cuesta un trimestre.
En esta lección construimos la estructura de AlpinaShop en Google Cloud. Veremos la jerarquía completa Organización → Carpetas → Proyectos → Recursos, qué es exactamente un proyecto y por qué el projectId es inmutable y global, en qué sentido el proyecto es una frontera de facturación, cuotas, permisos y red, cómo funcionan las cuentas de facturación y quién puede vincularlas, cómo se reparte el gasto con etiquetas, cómo se exporta la facturación a BigQuery y cómo se leen los informes y se configuran presupuestos. Terminaremos con las buenas prácticas de estructura y un ejemplo práctico completo con gcloud.
Contenido
- La jerarquía de recursos de Google Cloud
- La jerarquía de AlpinaShop
- Qué es exactamente un proyecto: ID, número y nombre
- El proyecto como frontera
- Cuentas de facturación
- Etiquetas para repartir el gasto
- Informes, exportación a BigQuery y presupuestos
- Herencia de políticas en la jerarquía
- Buenas prácticas de estructura de proyectos
- Ejemplo práctico completo con
gcloud
- La jerarquía de recursos de Google Cloud
Google Cloud organiza todo en un árbol de cuatro niveles:
| Nivel | Qué es | Cuántos puede haber | Se puede mover |
|---|---|---|---|
| Organización | La raíz, ligada a un dominio de Cloud Identity o Workspace | Una por dominio | No |
| Carpeta | Agrupación lógica de proyectos y otras carpetas | Varias, anidables (hasta ~10 niveles) | Sí |
| Proyecto | Contenedor de recursos y frontera de facturación | Muchos | Sí, entre carpetas |
| Recurso | VM, bucket, base de datos, topic... | Muchos | Depende del tipo, normalmente no |
Cada nivel puede llevar políticas de IAM y políticas de organización, y esas políticas se heredan hacia abajo. Ese es el motivo real de que exista la jerarquía: aplicar una regla una vez y que cubra todo lo que hay debajo.
Algunas precisiones que evitan confusiones:
- Sin organización no hay carpetas. Si te registraste con una cuenta personal (lección 01-02), tus proyectos están sueltos y no puedes crear carpetas. Esa es una de las razones principales para usar Cloud Identity en una empresa.
- La organización se crea sola. No la creas tú: aparece automáticamente la primera vez que un usuario del dominio verificado crea un proyecto.
- Los recursos no cuelgan de las carpetas, solo los proyectos. Una VM está siempre dentro de un proyecto, nunca directamente en una carpeta.
- La jerarquía de AlpinaShop
Marta diseña esta estructura para AlpinaShop, deliberadamente sencilla: para una empresa de 40 personas, una jerarquía de tres carpetas y cuatro proyectos es más que suficiente. Las estructuras complejas son para organizaciones con decenas de equipos.
graph TD
O[Organizacion alpinashop.example]
O --> F1[Carpeta produccion]
O --> F2[Carpeta desarrollo]
O --> F3[Carpeta compartido]
F1 --> P1[Proyecto alpinashop-prod]
F2 --> P2[Proyecto alpinashop-dev]
F3 --> P3[Proyecto alpinashop-datos]
F3 --> P4[Proyecto alpinashop-cicd]
P1 --> R1[Cloud Run alpinashop-web]
P1 --> R2[Cloud SQL alpinashop-pedidos]
P1 --> R3[Bucket alpinashop-catalogo]
P1 --> R4[GKE alpinashop-cluster]
P3 --> R5[Dataset alpinashop_analitica]
P3 --> R6[Topic pedidos-nuevos]
Por qué esta estructura y no otra:
produccionydesarrolloseparadas permiten aplicar políticas distintas a cada mundo. En producción se prohibirán las IP públicas y se exigirán logs de auditoría; en desarrollo se permitirá más libertad y se pondrán presupuestos bajos.compartidoalberga lo que sirve a ambos entornos: el pipeline de CI/CD y el almacén analítico. Separar la analítica en su propio proyecto evita que las consultas de Lucía consuman cuotas de producción y facilita darle permisos amplios ahí sin dárselos en la tienda.- Un proyecto por entorno, no un proyecto con recursos "de dev" y "de prod" mezclados. Es la regla más importante de todas.
En este módulo trabajaremos solo con alpinashop-dev. Los demás proyectos se irán creando cuando los módulos correspondientes los necesiten.
- Qué es exactamente un proyecto: ID, número y nombre
Un proyecto tiene tres identificadores distintos y confundirlos genera errores difíciles de diagnosticar.
| Identificador | Ejemplo | Quién lo elige | ¿Mutable? | ¿Único? | Dónde se usa |
|---|---|---|---|---|---|
| Nombre para mostrar | AlpinaShop Desarrollo |
Tú | Sí | No | Solo interfaz humana |
ID de proyecto (projectId) |
alpinashop-dev |
Tú (o autogenerado) | No, nunca | Sí, globalmente | CLI, APIs, URLs, casi todo |
Número de proyecto (projectNumber) |
482913057261 |
No | Sí, globalmente | Cuentas de servicio, algunos formatos internos, logs |
Detalles del projectId que hay que interiorizar:
- Es único en todo Google Cloud, no solo en tu organización. Si otro cliente en el mundo ya usa
tienda, tú no puedes. Por eso los IDs corporativos suelen llevar prefijo de empresa. - No se puede cambiar jamás. Ni renombrando, ni por soporte. La única salida es crear otro proyecto y migrar los recursos, que en muchos casos significa recrearlos.
- Reglas de formato: entre 6 y 30 caracteres, minúsculas, números y guiones, debe empezar por letra y no puede acabar en guion.
- Cuando borras un proyecto, su ID no se libera inmediatamente (y en la práctica es mejor asumir que no se libera nunca para uso propio).
Del projectNumber conviene saber que aparece en las cuentas de servicio predeterminadas, con formas como [email protected] o [email protected]. Cuando veas un número largo en un correo de cuenta de servicio, es el número de tu proyecto.
# Ver los tres identificadores de un proyecto de una sola vez.
gcloud projects describe alpinashop-dev \
--format="table(name, projectId, projectNumber, lifecycleState, createTime)"# Listar todos los proyectos a los que tienes acceso, ordenados por fecha de creacion.
gcloud projects list --sort-by=createTime \
--format="table(projectId, name, projectNumber)"El flag --format="table(...)" selecciona qué campos mostrar y los presenta en columnas. Sin él, gcloud devolvería una tabla por defecto con menos información. En la lección 01-06 veremos a fondo --format y --filter.
- El proyecto como frontera
Esta es la idea central de la lección: el proyecto es simultáneamente cuatro fronteras distintas, y por eso decidir qué va en qué proyecto es una decisión de arquitectura.
| Frontera | Qué significa | Consecuencia práctica |
|---|---|---|
| Facturación | Cada proyecto se factura a una cuenta de facturación | Separar proyectos es la forma más limpia de saber cuánto cuesta cada entorno |
| Cuotas | La mayoría de cuotas se aplican por proyecto (y por región) | Un proceso descontrolado en dev no puede agotar las cuotas de prod |
| Permisos (IAM) | Las políticas se aplican al proyecto y a lo que contiene | Dani puede ser administrador en dev y solo lector en prod |
| Red | Las redes VPC pertenecen a un proyecto | Por defecto, los recursos de proyectos distintos no se ven en red privada |
De estas cuatro, la de red es la que más sorprende a quien viene de un entorno tradicional. Dos VMs en proyectos distintos no comparten red privada salvo que lo configures explícitamente mediante VPC compartida o peering, temas de las lecciones 03-01 y 07-03. Esto es una ventaja de aislamiento, no un obstáculo.
Y una consecuencia útil que se aprovecha continuamente: borrar un proyecto borra todo lo que contiene. Es la forma más fiable de limpiar un entorno de pruebas y de garantizar que no queda nada generando gasto.
# Borrar un proyecto entero. Cuidado: elimina TODOS sus recursos.
# El proyecto queda 30 dias en estado DELETE_REQUESTED antes de desaparecer,
# y durante ese plazo se puede recuperar con "gcloud projects undelete".
gcloud projects delete alpinashop-pruebasEse margen de 30 días es una red de seguridad importante: un borrado accidental es recuperable, siempre que se detecte a tiempo.
- Cuentas de facturación
Una cuenta de facturación define quién paga, con qué método de pago y a qué datos fiscales se emite la factura. Es un objeto que vive fuera de la jerarquía de proyectos: no cuelga de una carpeta ni de un proyecto, sino que se asocia a ellos.
La relación es N a 1: muchos proyectos pueden apuntar a una misma cuenta de facturación, pero cada proyecto tiene como máximo una.
| Concepto | Descripción |
|---|---|
| Cuenta de facturación | El objeto que paga. Tiene un ID con formato XXXXXX-XXXXXX-XXXXXX |
| Tipo autoservicio | Pago con tarjeta, factura mensual automática. Lo habitual en pymes |
| Tipo facturado (invoiced) | Pago por transferencia con condiciones negociadas. Requiere volumen y aprobación |
| Subcuenta | Cuenta hija que agrupa gasto de forma separada dentro de una cuenta padre. Pensada sobre todo para resellers y para repartir gasto entre filiales |
| Proyecto sin facturación | Solo puede usar servicios gratuitos; la mayoría de APIs fallan |
Quién puede vincular proyectos y cuentas
Vincular un proyecto a una cuenta de facturación exige permisos en los dos lados, y esto es una separación de responsabilidades deliberada:
| Rol | Permite |
|---|---|
roles/billing.admin |
Gestionar la cuenta de facturación completa: métodos de pago, presupuestos, vinculación de proyectos |
roles/billing.user |
Vincular proyectos a la cuenta de facturación (pero no gestionar el pago) |
roles/billing.viewer |
Ver el gasto sin poder modificar nada |
roles/billing.projectManager |
Desvincular un proyecto de su cuenta de facturación |
roles/resourcemanager.projectCreator |
Crear proyectos |
En AlpinaShop, Marta tiene billing.admin, el responsable financiero tiene billing.viewer para consultar el gasto sin poder tocar nada, y Dani tiene billing.user sobre la cuenta para poder vincular proyectos de pruebas él mismo. El detalle de cómo funcionan los roles de IAM se estudia en la lección 03-04.
# Ver a qué cuenta está vinculado un proyecto y si la facturación está activa
gcloud billing projects describe alpinashop-dev# Vincular un proyecto a una cuenta de facturacion
gcloud billing projects link alpinashop-dev \
--billing-account=0X0X0X-0X0X0X-0X0X0X# Desvincular (el proyecto deja de poder usar servicios de pago inmediatamente)
gcloud billing projects unlink alpinashop-devunlink es una herramienta contundente y muy útil: es el "corte de emergencia" cuando un proyecto se dispara en coste. Detiene el consumo de servicios facturables casi de inmediato, aunque también puede provocar la pérdida de datos en servicios que no toleran quedarse sin facturación. Úsalo con conocimiento de causa.
- Etiquetas para repartir el gasto
Las etiquetas (labels) son pares clave-valor que se pueden aplicar a proyectos y a la mayoría de recursos. Su superpoder es que aparecen en los informes de facturación y en la exportación a BigQuery, lo que permite responder preguntas como "¿cuánto nos costó el entorno de desarrollo el mes pasado?" o "¿qué gasta el equipo de datos?".
Reglas de formato:
- Clave y valor en minúsculas, con números, guiones y guiones bajos.
- Máximo 63 caracteres cada uno; hasta 64 etiquetas por recurso.
- La clave no puede estar vacía; el valor sí.
Un esquema de etiquetado razonable para AlpinaShop:
| Clave | Valores posibles | Para qué sirve |
|---|---|---|
entorno |
produccion, desarrollo, pruebas |
Separar gasto por entorno |
equipo |
infraestructura, backend, datos |
Repartir coste por área |
centro-coste |
cc-100, cc-200 |
Imputación contable |
aplicacion |
tienda, analitica, cicd |
Coste por producto |
responsable |
marta, dani, lucia |
Saber a quién preguntar |
# Etiquetar el proyecto de desarrollo
gcloud projects update alpinashop-dev \
--update-labels=entorno=desarrollo,equipo=infraestructura,centro-coste=cc-100# Consultar las etiquetas actuales de un proyecto
gcloud projects describe alpinashop-dev --format="value(labels)"Consejos sobre etiquetado, aprendidos por la vía dolorosa en muchos equipos:
- Define el esquema antes de empezar a crear recursos. Etiquetar 300 recursos a posteriori es un proyecto en sí mismo.
- Sé estricto con los valores.
dev,desarrolloyDesarrolloson tres etiquetas distintas y romperán tus informes. - No pongas información sensible en las etiquetas. Son visibles para cualquiera con permisos de lectura sobre el recurso.
- No confundas
labelscontags. Google Cloud tiene además unas tags (etiquetas con gobernanza) que sirven para aplicar políticas condicionalmente, no para facturación. Se ven en la lección 07-07.
- Informes, exportación a BigQuery y presupuestos
Informes de facturación
En la consola, Facturación → Informes ofrece una vista interactiva del gasto con filtros por proyecto, servicio, SKU, región, etiquetas y periodo, y agrupación configurable. Es donde se responden la mayoría de preguntas cotidianas.
Conceptos que aparecen en esos informes y conviene distinguir:
| Concepto | Significado |
|---|---|
| SKU | La unidad mínima facturable. No pagas "por Compute Engine", pagas por SKUs como "N2 Instance Core running in EMEA" |
| Coste bruto | Antes de aplicar descuentos y créditos |
| Créditos | Descuentos por uso sostenido, compromisos, crédito de prueba, promociones |
| Coste neto | Lo que realmente pagas |
| Coste previsto | Estimación de fin de mes basada en la tendencia |
Un consejo muy concreto: cuando el gasto no cuadre, agrupa por SKU, no por servicio. "Compute Engine: 210 €" no dice nada; "Storage PD Capacity: 140 €" te dice que tienes discos huérfanos.
Exportación a BigQuery
Los informes de la consola son cómodos pero limitados. Para análisis serio, Google permite exportar los datos de facturación a un dataset de BigQuery, donde llegan con detalle diario por SKU, proyecto, etiqueta y región, y donde se pueden consultar con SQL.
Se activa en Facturación → Exportación de facturación, eligiendo el proyecto y el dataset de destino. AlpinaShop la enviará al dataset alpinashop_analitica del proyecto alpinashop-datos, para que Lucía pueda cruzar el gasto con datos de negocio.
Dos advertencias:
- La exportación no es retroactiva: solo trae datos desde el momento en que la activas. Es otro motivo para configurarla pronto aunque todavía no la vayas a usar.
- Los datos tardan varias horas en aparecer y se corrigen durante el mes, así que no sirven para alertas en tiempo real.
El análisis con SQL de esos datos corresponde a la lección 04-01 (BigQuery) y su uso para optimizar costes a la 07-05. Aquí basta con activarla.
Presupuestos y alertas
Ya creamos un presupuesto básico en la lección 01-02. Ahora podemos aprovechar la jerarquía y las etiquetas para afinarlo:
# Presupuesto que vigila TODO el gasto etiquetado como entorno=desarrollo,
# avisando cuando la PREVISION de fin de mes supere el 100% del importe.
gcloud billing budgets create \
--billing-account=0X0X0X-0X0X0X-0X0X0X \
--display-name="Presupuesto entorno desarrollo" \
--budget-amount=80EUR \
--threshold-rule=percent=0.5 \
--threshold-rule=percent=0.9,basis=forecasted-spend \
--threshold-rule=percent=1.0 \
--filter-labels=entorno=desarrolloPuntos a destacar del comando:
--filter-labelslimita el presupuesto al gasto de los recursos con esa etiqueta, en lugar de a un proyecto concreto. Es más flexible: si mañana hay tres proyectos de desarrollo, el presupuesto los cubre todos sin tocar nada.basis=forecasted-spendcambia la naturaleza del aviso: en lugar de avisarte cuando ya has gastado el 90 %, te avisa cuando la proyección de fin de mes alcanza ese porcentaje. Da días de margen en lugar de horas.- Recuerda de la lección 01-02: los presupuestos avisan, no bloquean.
Según la versión del SDK, este grupo de comandos puede requerir el prefijo
alpha(gcloud alpha billing budgets ...). Comprueba congcloud billing budgets --help.
- Herencia de políticas en la jerarquía
La jerarquía existe, sobre todo, para que las políticas se apliquen una vez y cubran todo lo que hay debajo. Hay dos tipos de política y ambas se heredan:
| Tipo | Qué controla | Ejemplo aplicado a AlpinaShop |
|---|---|---|
| Políticas de IAM | Quién puede hacer qué | Dar a [email protected] el rol de administrador de red en toda la carpeta produccion |
| Políticas de organización | Qué está permitido hacer, con independencia de los permisos | Prohibir la creación de VMs con IP pública en la carpeta produccion |
Reglas de herencia que hay que entender bien:
- Los permisos de IAM se acumulan hacia abajo y no se pueden restar. Si concedes a alguien el rol de editor a nivel de organización, lo será en todos los proyectos, y no puedes quitárselo en uno concreto mediante IAM. Por eso conceder roles amplios en niveles altos es peligroso.
- Las políticas de organización sí restringen. Son la herramienta correcta para prohibir cosas, y por defecto una política definida en un nodo sustituye o se combina con la heredada según su configuración.
- La regla práctica: concede permisos en el nivel más bajo posible y restricciones en el más alto posible.
Ambos temas se estudian a fondo más adelante: IAM en la lección 03-04 y las políticas de organización y el gobierno a escala en la 07-07. Lo que necesitas retener ahora es que el sitio donde colocas un proyecto en la jerarquía determina qué hereda, y por eso mover un proyecto entre carpetas cambia sus políticas efectivas.
- Buenas prácticas de estructura de proyectos
| Práctica | Por qué |
|---|---|
| Un proyecto por entorno (dev, pre, prod) | Aísla fallos, cuotas y accesos; el gasto por entorno sale gratis |
| No mezclar cargas muy distintas en un proyecto | Facilita aplicar políticas específicas y entender el coste |
| Convención de nombres explícita y estable | empresa-carga-entorno; se lee de un vistazo y se automatiza bien |
| Proyecto separado para datos y analítica | Permisos amplios para el equipo de datos sin tocar la tienda |
| Proyecto separado para CI/CD | El pipeline necesita permisos peculiares que no deben vivir en producción |
| Etiquetar todo desde el principio | Sin etiquetas, el reparto de costes es imposible |
| Crear proyectos con scripts o Terraform | La creación manual acaba en estructuras incoherentes |
| Presupuesto en todos los proyectos | Incluidos los de pruebas: son precisamente los que se olvidan |
| Evitar demasiados proyectos | Cada proyecto tiene coste de gestión: permisos, redes, presupuestos |
Sobre el último punto: existe una escuela que defiende un proyecto por microservicio y entorno. Para una organización grande con equipos autónomos puede tener sentido; para AlpinaShop sería una carga de mantenimiento desproporcionada. La estructura debe ser proporcional al tamaño del equipo. Cuatro proyectos para 40 personas es razonable; cuarenta no lo sería.
- Ejemplo práctico completo con
gcloud
gcloudMarta va a montar la estructura de AlpinaShop desde Cloud Shell. Este bloque reúne todo lo visto.
# Paso 0: variables para no repetir valores y evitar erratas.
export ORG_ID=$(gcloud organizations list --format="value(ID)" | head -n1)
export BILLING_ACCOUNT="0X0X0X-0X0X0X-0X0X0X"
echo "Organizacion: $ORG_ID"gcloud organizations list devuelve las organizaciones sobre las que tienes permisos. Con --format="value(ID)" extraemos solo el identificador numérico, sin cabeceras, para poder guardarlo en una variable. Si la salida está vacía, no tienes organización (cuenta personal) y deberás saltarte los pasos de carpetas.
# Paso 1: crear las carpetas de primer nivel bajo la organizacion.
gcloud resource-manager folders create \
--display-name="produccion" --organization=$ORG_ID
gcloud resource-manager folders create \
--display-name="desarrollo" --organization=$ORG_ID# Paso 2: recuperar el ID numerico de la carpeta de desarrollo.
export FOLDER_DEV=$(gcloud resource-manager folders list \
--organization=$ORG_ID \
--filter="displayName=desarrollo" \
--format="value(name)")
echo "Carpeta desarrollo: $FOLDER_DEV"Aquí aparecen por primera vez juntos --filter y --format. --filter="displayName=desarrollo" reduce la lista a la carpeta que nos interesa, y --format="value(name)" extrae únicamente su identificador. Es el patrón de scripting que usaremos durante todo el curso.
# Paso 3: crear el proyecto de desarrollo dentro de esa carpeta.
gcloud projects create alpinashop-dev \
--name="AlpinaShop Desarrollo" \
--folder=$FOLDER_DEV \
--labels=entorno=desarrollo,equipo=infraestructuraSi el proyecto ya existía de la lección 01-02 sin carpeta, se puede mover en lugar de recrearlo:
# Alternativa: mover un proyecto existente a una carpeta.
gcloud beta projects move alpinashop-dev --folder=$FOLDER_DEV# Paso 4: vincular el proyecto a la cuenta de facturacion.
gcloud billing projects link alpinashop-dev \
--billing-account=$BILLING_ACCOUNT# Paso 5: comprobar que todo ha quedado como esperabamos.
gcloud projects describe alpinashop-dev \
--format="table(projectId, projectNumber, parent.type, parent.id, labels)"
gcloud billing projects describe alpinashop-dev \
--format="table(projectId, billingAccountName, billingEnabled)"El campo parent.type debe mostrar folder y parent.id el identificador de la carpeta de desarrollo. billingEnabled debe ser True: si es False, la vinculación no se completó y prácticamente ninguna API funcionará.
# Paso 6: presupuesto de seguridad para la carpeta de desarrollo.
gcloud billing budgets create \
--billing-account=$BILLING_ACCOUNT \
--display-name="Presupuesto desarrollo AlpinaShop" \
--budget-amount=50EUR \
--threshold-rule=percent=0.5 \
--threshold-rule=percent=0.9,basis=forecasted-spend \
--threshold-rule=percent=1.0 \
--filter-projects="projects/alpinashop-dev"Con esto, AlpinaShop tiene una jerarquía real, un proyecto correctamente ubicado y etiquetado, facturación vinculada y una alarma económica activa.
Errores Comunes y Consejos
- Elegir mal el
projectId. Es inmutable y global. Adopta la convenciónempresa-carga-entornoy aplícala sin excepciones. - Confundir
projectIdconprojectNumber. Cuando una API o un mensaje de error pida uno concreto, dale ese: no son intercambiables en todos los contextos. - Mezclar desarrollo y producción en un proyecto. El día que alguien borre por error la base de datos equivocada entenderás por qué. Además impide separar cuotas, permisos y coste.
- Conceder roles amplios a nivel de organización o carpeta. Los permisos de IAM se heredan hacia abajo y no se pueden restar en un nivel inferior.
- Etiquetar tarde o de forma inconsistente. Un esquema definido desde el principio y respetado vale más que uno sofisticado y aplicado a medias.
- Activar la exportación de facturación a BigQuery cuando ya la necesitas. No es retroactiva: los meses anteriores están perdidos.
- Suponer que el presupuesto corta el gasto. No lo hace. Sigue siendo un detector de humos.
- Consejo: usa
gcloud projects deletepara limpiar entornos de prueba. Es la única forma fiable de asegurarte de que no queda nada facturando, y tienes 30 días de margen para arrepentirte. - Consejo: no crees más proyectos de los que puedas gobernar. Cada uno arrastra permisos, red, cuotas y presupuesto.
Ejercicios
Ejercicio 1: diseñar la jerarquía
AlpinaShop crece y abre una filial en Portugal que operará una tienda propia (alpinashop.pt) con su propia base de datos, pero compartirá el pipeline de CI/CD y el almacén analítico con la matriz. Además, dirección exige poder ver de un vistazo cuánto cuesta cada país por separado.
Diseña la jerarquía resultante (carpetas y proyectos), indica qué etiquetas añadirías y explica en qué nivel colocarías la política que prohíbe crear VMs con IP pública en producción y por qué.
Ejercicio 2: identificadores y facturación
Responde razonadamente:
- Marta se ha equivocado y ha creado el proyecto con el ID
alpinshop-dev(falta unaa). ¿Puede corregirlo? ¿Qué opciones tiene? - Dani ve en un log el correo
[email protected]. ¿Qué es ese número y cómo comprobaría a qué proyecto pertenece? - Marta quiere que el gasto del proyecto
alpinashop-devdeje de producirse de forma inmediata porque un proceso se ha descontrolado. ¿Qué comando ejecuta y qué riesgo asume?
Ejercicio 3: script de creación
Escribe un script de bash que cree un proyecto llamado alpinashop-pruebas con estas características, comprobando en cada paso que la operación ha tenido éxito:
- Ubicado en la carpeta
desarrollo. - Etiquetado con
entorno=pruebas,equipo=infraestructurayresponsable=marta. - Vinculado a la cuenta de facturación.
- Con un presupuesto de 10 EUR y avisos al 50 %, 90 % (sobre previsión) y 100 %.
Y añade al final el comando que usarías para eliminar por completo ese entorno cuando termines las pruebas.
Soluciones
Solución 1
Una estructura razonable:
graph TD
O[Organizacion alpinashop.example]
O --> F1[Carpeta produccion]
O --> F2[Carpeta desarrollo]
O --> F3[Carpeta compartido]
F1 --> F1A[Carpeta es]
F1 --> F1B[Carpeta pt]
F1A --> P1[alpinashop-prod]
F1B --> P2[alpinashop-pt-prod]
F2 --> P3[alpinashop-dev]
F2 --> P4[alpinashop-pt-dev]
F3 --> P5[alpinashop-datos]
F3 --> P6[alpinashop-cicd]
Etiquetas: a las ya existentes (entorno, equipo, centro-coste) se añade pais con valores es y pt. Con esa etiqueta, dirección obtiene el desglose por país en los informes de facturación sin necesidad de mirar la jerarquía, y se pueden crear presupuestos por país con --filter-labels=pais=pt.
La política que prohíbe IP públicas se coloca en la carpeta produccion, no en cada proyecto. Motivos: se define una sola vez, se hereda automáticamente por es y pt y por cualquier país que se añada en el futuro, y no afecta a desarrollo, donde esa restricción entorpecería el trabajo. Colocarla en la organización sería excesivo (rompería desarrollo) y colocarla en cada proyecto sería frágil (el próximo proyecto se crearía sin ella).
Solución 2
- No puede corregirlo. El
projectIdes inmutable. Sus opciones son: (a) crear un proyecto nuevo con el ID correcto y recrear o migrar los recursos, algo barato si el proyecto está recién creado y prácticamente vacío; o (b) quedarse con el ID erróneo y corregir solo el nombre para mostrar, que sí es editable congcloud projects update alpinashop-dev --name="...". Dado que el proyecto es joven, lo sensato es recrearlo y borrar el erróneo. - Es el
projectNumber, el identificador numérico del proyecto, y esa dirección corresponde a la cuenta de servicio predeterminada de Compute Engine de ese proyecto. Para saber a qué proyecto pertenece:gcloud projects list --filter="projectNumber=482913057261" \\ --format="value(projectId)" - Ejecuta
gcloud billing projects unlink alpinashop-dev. Al desvincular la facturación, los servicios de pago dejan de funcionar casi inmediatamente y el gasto se detiene. El riesgo es que algunos servicios no toleran quedarse sin facturación y pueden perder datos o recursos: instancias detenidas, tareas canceladas, y en ciertos casos eliminación de recursos si la situación se prolonga. Es una medida de emergencia, no una forma de "pausar" un proyecto. Una alternativa menos agresiva es identificar y detener el recurso concreto que se ha descontrolado.
Solución 3
#!/bin/bash
set -e # Detiene el script en cuanto un comando falle
BILLING_ACCOUNT="0X0X0X-0X0X0X-0X0X0X"
PROJECT_ID="alpinashop-pruebas"
# 1. Localizar la organizacion y la carpeta de desarrollo
ORG_ID=$(gcloud organizations list --format="value(ID)" | head -n1)
FOLDER_DEV=$(gcloud resource-manager folders list \
--organization="$ORG_ID" \
--filter="displayName=desarrollo" \
--format="value(name)")
if [ -z "$FOLDER_DEV" ]; then
echo "ERROR: no se ha encontrado la carpeta 'desarrollo'"
exit 1
fi
# 2. Crear el proyecto con sus etiquetas
gcloud projects create "$PROJECT_ID" \
--name="AlpinaShop Pruebas" \
--folder="$FOLDER_DEV" \
--labels=entorno=pruebas,equipo=infraestructura,responsable=marta
# 3. Vincular la facturacion
gcloud billing projects link "$PROJECT_ID" \
--billing-account="$BILLING_ACCOUNT"
# 4. Verificar que la facturacion ha quedado activa
BILLING_OK=$(gcloud billing projects describe "$PROJECT_ID" \
--format="value(billingEnabled)")
if [ "$BILLING_OK" != "True" ]; then
echo "ERROR: la facturacion no se ha activado correctamente"
exit 1
fi
# 5. Crear el presupuesto de seguridad
gcloud billing budgets create \
--billing-account="$BILLING_ACCOUNT" \
--display-name="Presupuesto pruebas AlpinaShop" \
--budget-amount=10EUR \
--threshold-rule=percent=0.5 \
--threshold-rule=percent=0.9,basis=forecasted-spend \
--threshold-rule=percent=1.0 \
--filter-projects="projects/$PROJECT_ID"
echo "Proyecto $PROJECT_ID creado y protegido correctamente."Para eliminar por completo el entorno al terminar:
Este único comando elimina el proyecto y todos sus recursos, garantizando que no queda nada generando gasto. El proyecto permanece 30 días en estado DELETE_REQUESTED y puede recuperarse en ese plazo con gcloud projects undelete alpinashop-pruebas.
Conclusión
Esta lección ha establecido el esqueleto sobre el que se apoyará todo lo demás. Hemos recorrido la jerarquía Organización → Carpetas → Proyectos → Recursos y la hemos aplicado a AlpinaShop con las carpetas produccion, desarrollo y compartido; hemos distinguido los tres identificadores de un proyecto y grabado que el projectId es inmutable y único en todo Google Cloud; hemos visto que el proyecto es simultáneamente frontera de facturación, cuotas, permisos y red, y que borrarlo es la forma más fiable de limpiar un entorno; hemos entendido las cuentas de facturación, su relación N a 1 con los proyectos, quién puede vincularlas y qué significa unlink como corte de emergencia; hemos definido un esquema de etiquetas para repartir el gasto por entorno, equipo y centro de coste; hemos activado la exportación a BigQuery hacia alpinashop_analitica y afinado los presupuestos con avisos sobre previsión; y hemos repasado cómo se hereda cada tipo de política y qué estructura de proyectos es proporcional a una empresa de 40 personas.
Sabemos ya quién es dueño de qué y quién paga. Falta la otra coordenada: dónde viven los recursos. En la próxima lección, Regiones, zonas y modelo de responsabilidad compartida, veremos la geografía de Google Cloud —multirregión, región y zona—, qué significa que un servicio sea zonal, regional o global, cómo funciona la red troncal privada de Google, qué criterios llevan a AlpinaShop a decidir entre europe-west1 y europe-southwest1 (latencia, precio, servicios disponibles y residencia del dato bajo el RGPD), qué protege realmente desplegar en varias zonas, y cómo se reparte la responsabilidad de seguridad entre Google y tú según el tipo de servicio.
Curso de Google Cloud Platform (GCP)
Módulo 1: Introducción a Google Cloud Platform
- ¿Qué es Google Cloud Platform?
- Configuración de tu cuenta de GCP
- Descripción general de la consola de GCP
- Proyectos, jerarquía de recursos y facturación
- Regiones, zonas y modelo de responsabilidad compartida
- Cloud Shell y la CLI de gcloud
Módulo 2: Servicios principales de GCP
- Compute Engine: máquinas virtuales en Google Cloud
- Cloud Storage: almacenamiento de objetos
- Cloud SQL: bases de datos relacionales gestionadas
- App Engine: plataforma como servicio
- Google Kubernetes Engine (GKE)
- Bases de datos NoSQL: Firestore, Bigtable y Spanner
- Cómo elegir el servicio de cómputo adecuado
Módulo 3: Redes y seguridad
- Redes VPC
- Balanceo de carga en la nube
- Cloud CDN
- Gestión de identidad y acceso (IAM)
- Cloud Armor
- Secretos y cifrado: Secret Manager y Cloud KMS
- Cloud DNS, certificados TLS y publicación segura de servicios
Módulo 4: Datos y análisis
- BigQuery: el almacén de datos analítico
- Cloud Dataflow: procesamiento de datos por lotes y en streaming
- Cloud Dataproc: Spark y Hadoop gestionados
- Cloud Pub/Sub: mensajería asíncrona
- Cloud Data Fusion: integración de datos sin código
- Orquestación de pipelines con Cloud Composer y Workflows
- Gobierno del dato y cuadros de mando con Dataplex y Looker Studio
Módulo 5: Aprendizaje automático e IA
- Vertex AI: la plataforma de machine learning de GCP
- AutoML: modelos a medida sin escribir código
- TensorFlow en GCP: entrenamiento y servicio de modelos
- API de lenguaje natural
- API de visión
- IA generativa en Vertex AI: modelos Gemini y embeddings
- MLOps: del modelo al producto con Vertex AI Pipelines
Módulo 6: DevOps y monitoreo
- Cloud Build: integración continua en GCP
- Cloud Source Repositories y gestión del código fuente
- Cloud Functions: funciones sin servidor
- Cloud Monitoring (antes Stackdriver): métricas, paneles y alertas
- Cloud Deployment Manager e infraestructura como código nativa
- Cloud Logging y Cloud Trace: logs, trazas y diagnóstico
- Terraform en GCP: infraestructura como código en la práctica
Módulo 7: Temas avanzados de GCP
- Híbrido y multinube con Anthos
- Computación sin servidor con Cloud Run
- Redes avanzadas: VPC compartida, peering y conectividad híbrida
- Mejores prácticas de seguridad
- Gestión y optimización de costos
- Fiabilidad: SLO, alta disponibilidad y recuperación ante desastres
- Gobierno a escala: organización, políticas y auditoría
