# Laboratorio: Google Cloud Storage ## Objetivos del Laboratorio Al finalizar este laboratorio, los estudiantes serán capaces de: - Comprender las características fundamentales de Google Cloud Storage - Diferenciar GCS de otros sistemas de almacenamiento - Crear y gestionar buckets mediante Console, CLI y Terraform - Implementar políticas de lifecycle y control de acceso - Aplicar mejores prácticas de seguridad y costos ## 1. Introducción Conceptual a Google Cloud Storage ### 1.1 ¿Qué es Google Cloud Storage? Google Cloud Storage (GCS) es un servicio de almacenamiento de objetos completamente gestionado que permite almacenar y recuperar cualquier cantidad de datos en cualquier momento. A diferencia de los sistemas de archivos tradicionales, GCS está diseñado como un sistema de almacenamiento de objetos que ofrece escalabilidad masiva, alta disponibilidad y durabilidad. ### 1.2 Características Fundamentales #### Almacenamiento de Objetos vs Sistema de Archivos **GCS (Object Storage):** - **Inmutabilidad**: Los objetos no pueden modificarse parcialmente - **Acceso completo**: Solo se puede leer o reemplazar el objeto completo - **Streaming**: Permite la transferencia y procesamiento de datos en tiempo real, donde los datos se leen o escriben de forma continua en pequeños fragmentos, sin necesidad de descargar el archivo completo - **Metadatos**: Cada objeto tiene metadatos extensos - **Versionado**: Soporte nativo para versiones de objetos **Sistema de Archivos Tradicional:** - **Modificación parcial**: Permite editar partes específicas de un archivo - **Acceso aleatorio**: Lectura/escritura en posiciones específicas - **Jerarquía**: Estructura de directorios y subdirectorios - **Metadatos limitados**: Información básica del sistema de archivos #### Implicaciones de la Inmutabilidad La característica de inmutabilidad de GCS tiene implicaciones importantes: 1. **Diseño de Aplicaciones**: Las aplicaciones deben diseñarse para trabajar con objetos completos 2. **Estrategias de Actualización**: Para modificar datos, se debe crear una nueva versión del objeto 3. **Streaming Eficiente**: Ideal para procesamiento de grandes volúmenes de datos 4. **Consistencia**: Garantiza consistencia de datos sin necesidad de bloqueos ### 1.3 Casos de Uso Principales #### Almacenamiento de Datos - **Backup y recuperación**: Copias de seguridad automatizadas - **Archivo de datos**: Almacenamiento a largo plazo con diferentes clases de almacenamiento - **Data lakes**: Repositorios centralizados para big data #### Distribución de Contenido - **CDN**: Distribución global de contenido estático - **Hosting de sitios web**: Sitios web estáticos con alta disponibilidad - **Streaming de medios**: Distribución de video y audio #### Integración con Servicios Cloud - **CI/CD**: Almacenamiento de artefactos de construcción - **Machine Learning**: Datasets para entrenamiento de modelos - **Data Analytics**: Almacenamiento de datos para análisis ### 1.4 Modelos de Consistencia GCS ofrece diferentes niveles de consistencia según el tipo de operación: - **Consistencia fuerte**: Para operaciones de lectura después de escritura - **Consistencia eventual**: Para operaciones de listado y metadatos - **Consistencia de sesión**: Para operaciones secuenciales del mismo cliente ### 1.5 Características de Disponibilidad - **Durabilidad**: 99.999999999% (11 9's) de durabilidad anual - **Disponibilidad**: 99.9% - 99.95% según la clase de almacenamiento - **Redundancia**: Múltiples copias automáticas en diferentes ubicaciones - **Tolerancia a fallos**: Recuperación automática de fallos de hardware ### 1.6 Comparación con Otros Sistemas | Característica | GCS | NAS | SAN | Local Storage | |----------------|-----|-----|-----|---------------| | Escalabilidad | Ilimitada | Limitada | Limitada | Muy limitada | | Acceso | HTTP/HTTPS | NFS/SMB | iSCSI/FC | Sistema de archivos | | Modificación | No (inmutable) | Sí (parcial) | Sí (parcial) | Sí (parcial) | | Streaming | Excelente | Bueno | Bueno | Limitado | | Costo | Variable por uso | Fijo | Fijo | Fijo | | Mantenimiento | Gestionado | Manual | Manual | Manual | ### 1.7 Ventajas y Desventajas #### Ventajas - **Escalabilidad automática**: Sin límites prácticos de almacenamiento - **Alta disponibilidad**: Diseñado para 99.9%+ de uptime - **Costo eficiente**: Pago solo por lo que se usa - **Integración nativa**: Con otros servicios de Google Cloud - **Seguridad**: Encriptación y control de acceso granulares #### Desventajas - **Latencia**: Mayor latencia que almacenamiento local - **Inmutabilidad**: No permite modificaciones parciales - **Dependencia de red**: Requiere conectividad a internet - **Costo de transferencia**: Costos adicionales por transferencia de datos ### 1.8 Consideraciones de Diseño Al diseñar aplicaciones que usen GCS, es importante considerar: 1. **Tamaño de objetos**: Optimizar el tamaño para minimizar costos de operaciones 2. **Patrones de acceso**: Diseñar para acceso secuencial y streaming 3. **Versionado**: Implementar estrategias de versionado para datos que cambian 4. **Caché**: Considerar estrategias de caché para datos frecuentemente accedidos 5. **Compresión**: Aplicar compresión para reducir costos de almacenamiento --- **Próximo paso**: Una vez comprendidos estos conceptos fundamentales, procederemos con la demostración práctica de creación y gestión de buckets mediante la consola de Google Cloud. ## 2. Conceptos Fundamentales de Google Cloud Storage ### 2.1 Buckets: Contenedores Lógicos Los buckets constituyen el contenedor fundamental en Google Cloud Storage, funcionando como directorios de nivel superior que organizan y agrupan objetos relacionados. Esta sección examina los aspectos esenciales de los buckets, desde su creación y configuración hasta las mejores prácticas de nomenclatura y ubicación geográfica. #### Definición y Propósito Un bucket es un contenedor lógico que almacena objetos en Google Cloud Storage. Cada bucket tiene un nombre único globalmente que lo identifica dentro del ecosistema de Google Cloud. Los buckets proporcionan el primer nivel de organización para los datos, permitiendo agrupar objetos relacionados bajo una misma estructura lógica. #### Convenciones de Nomenclatura La nomenclatura de buckets sigue reglas estrictas que garantizan la unicidad global y la compatibilidad con diferentes protocolos de acceso: - **Caracteres permitidos**: Solo letras minúsculas, números, guiones (-) y guiones bajos (_) - **Longitud**: Entre 3 y 63 caracteres - **Restricciones**: No puede comenzar ni terminar con guión, no puede contener puntos consecutivos - **Unicidad global**: El nombre debe ser único en todo el sistema de Google Cloud Storage - **Compatibilidad DNS**: Debe ser compatible con nombres de dominio para acceso web #### Ubicación Geográfica y Regiones La ubicación geográfica de un bucket determina aspectos críticos como latencia, disponibilidad y cumplimiento regulatorio: - **Regiones**: Ubicaciones geográficas específicas (us-central1, europe-west1, asia-southeast1) - **Multi-regiones**: Distribución automática en múltiples regiones (US, EU, ASIA) - **Zonas**: Ubicaciones más específicas dentro de una región - **Consideraciones de latencia**: Proximidad a usuarios finales y aplicaciones - **Cumplimiento regulatorio**: Restricciones geográficas para datos sensibles #### Configuración de Buckets Los buckets admiten múltiples configuraciones que afectan su comportamiento y costos: - **Versionado**: Mantenimiento automático de versiones históricas de objetos - **Lifecycle management**: Transición automática entre clases de almacenamiento - **Logging**: Registro de acceso y operaciones en el bucket - **CORS**: Configuración para acceso desde aplicaciones web - **Retention policies**: Políticas de retención obligatoria para cumplimiento ### 2.2 Objects: Archivos y Metadatos Los objetos representan la unidad fundamental de almacenamiento en Google Cloud Storage, encapsulando tanto los datos como los metadatos asociados. Esta sección explora la estructura de los objetos, sus características de inmutabilidad y las implicaciones para el diseño de aplicaciones. #### Estructura de Objetos Cada objeto en GCS contiene dos componentes principales: los datos del archivo y los metadatos asociados. Los metadatos incluyen información del sistema (fecha de creación, tamaño, checksum) y metadatos personalizados definidos por el usuario. #### Características de Inmutabilidad La inmutabilidad de los objetos en GCS tiene implicaciones fundamentales para el diseño de aplicaciones: - **Modificación completa**: Solo se puede reemplazar el objeto completo, no modificarlo parcialmente - **Versionado**: Cada modificación crea una nueva versión del objeto - **Consistencia**: Garantiza integridad de datos sin necesidad de bloqueos - **Streaming**: Permite procesamiento eficiente de archivos grandes #### Metadatos del Sistema Google Cloud Storage asigna automáticamente metadatos del sistema a cada objeto: - **Content-Type**: Tipo MIME del contenido - **Content-Length**: Tamaño del objeto en bytes - **ETag**: Identificador único para verificación de integridad - **Last-Modified**: Timestamp de la última modificación - **Generation**: Número de versión del objeto - **MD5 Hash**: Checksum para verificación de integridad #### Metadatos Personalizados Los usuarios pueden definir metadatos personalizados para enriquecer la información de los objetos: - **Prefijo personalizado**: Debe comenzar con "x-goog-meta-" - **Formato clave-valor**: Estructura simple de pares clave-valor - **Codificación**: Valores deben ser strings válidos - **Límites**: Máximo 2KB de metadatos personalizados por objeto ### 2.3 Storage Classes: Optimización de Costos Las clases de almacenamiento en Google Cloud Storage permiten optimizar costos según los patrones de acceso y los requisitos de disponibilidad. Esta sección examina las diferentes clases disponibles, sus características y los criterios para seleccionar la más adecuada. #### Standard Storage La clase Standard está diseñada para datos que se acceden frecuentemente y requieren alta disponibilidad: - **Disponibilidad**: 99.9% de disponibilidad anual - **Latencia**: Acceso de baja latencia - **Costo**: Mayor costo por GB almacenado - **Casos de uso**: Aplicaciones activas, contenido web, datos de análisis frecuente - **Operaciones**: Costo estándar por operaciones de lectura y escritura #### Nearline Storage Nearline Storage optimiza costos para datos accedidos mensualmente: - **Disponibilidad**: 99.9% de disponibilidad anual - **Latencia**: Acceso de baja latencia - **Costo**: Reducción del 23% en almacenamiento vs Standard - **Penalización**: Costo adicional por acceso temprano (menos de 30 días) - **Casos de uso**: Backup, archivo de datos, contenido accedido mensualmente #### Coldline Storage Coldline Storage está optimizado para datos accedidos anualmente: - **Disponibilidad**: 99.9% de disponibilidad anual - **Latencia**: Acceso de baja latencia - **Costo**: Reducción del 68% en almacenamiento vs Standard - **Penalización**: Costo adicional por acceso temprano (menos de 90 días) - **Casos de uso**: Archivo a largo plazo, cumplimiento regulatorio, backup de desastre #### Archive Storage Archive Storage proporciona la opción más económica para datos raramente accedidos: - **Disponibilidad**: 99.9% de disponibilidad anual - **Latencia**: Acceso de baja latencia - **Costo**: Reducción del 77% en almacenamiento vs Standard - **Penalización**: Costo adicional por acceso temprano (menos de 365 días) - **Casos de uso**: Archivo a muy largo plazo, cumplimiento legal, datos históricos ### 2.4 Access Control: Seguridad y Permisos El control de acceso en Google Cloud Storage se implementa mediante múltiples capas de seguridad que permiten un control granular sobre quién puede acceder a qué recursos. Esta sección examina los mecanismos de autenticación, autorización y las mejores prácticas de seguridad. #### Identity and Access Management (IAM) IAM proporciona control de acceso basado en roles y políticas: - **Roles predefinidos**: Storage Admin, Storage Object Admin, Storage Object Viewer - **Roles personalizados**: Definición de permisos específicos según necesidades - **Principales**: Usuarios, grupos, cuentas de servicio, dominios - **Políticas**: Asociación de roles con principales para recursos específicos - **Herencia**: Políticas a nivel de proyecto, bucket y objeto #### Access Control Lists (ACLs) Las ACLs proporcionan control de acceso granular a nivel de bucket y objeto: - **Permisos**: READ, WRITE, FULL_CONTROL - **Alcance**: Bucket, objeto individual - **Principales**: Usuarios específicos, grupos, todos los usuarios autenticados - **Compatibilidad**: Soporte para aplicaciones que usan ACLs tradicionales - **Limitaciones**: Menos flexible que IAM para casos complejos #### Signed URLs Las URLs firmadas permiten acceso temporal y controlado a objetos sin autenticación: - **Tiempo de expiración**: Control preciso del tiempo de validez - **Permisos**: READ, WRITE, DELETE según necesidades - **Seguridad**: Firma criptográfica que previene manipulación - **Casos de uso**: Compartir archivos temporalmente, uploads directos desde aplicaciones - **Rotación**: Necesidad de regenerar URLs para seguridad a largo plazo ### 2.5 Modelo de Precios: Optimización de Costos El modelo de precios de Google Cloud Storage está diseñado para ser transparente y predecible, con costos que varían según el uso real. Esta sección examina los componentes de costos y las estrategias para optimizar el gasto en almacenamiento. #### Componentes de Costos Los costos en GCS se calculan basándose en múltiples factores: - **Almacenamiento**: Costo por GB almacenado según la clase de almacenamiento - **Operaciones**: Costo por operaciones de lectura, escritura y eliminación - **Transferencia de red**: Costo por datos transferidos fuera de Google Cloud - **Clase de almacenamiento**: Multiplicadores de costo según la clase seleccionada - **Ubicación**: Variaciones de precio según la región geográfica #### Estrategias de Optimización Diversas estrategias permiten optimizar los costos de almacenamiento: - **Lifecycle policies**: Transición automática entre clases de almacenamiento - **Compresión**: Reducción del tamaño de objetos para menor costo de almacenamiento - **Deduplicación**: Eliminación de objetos duplicados - **Monitoreo**: Uso de herramientas para identificar patrones de acceso y optimizar - **Planificación**: Estimación de costos basada en patrones de uso históricos #### Herramientas de Monitoreo Google Cloud proporciona herramientas para monitorear y optimizar costos: - **Cloud Console**: Visualización de uso y costos en tiempo real - **Billing API**: Acceso programático a información de facturación - **Cost alerts**: Notificaciones automáticas cuando se superan umbrales - **Cost reports**: Análisis detallado de costos por servicio y recurso - **Recommendations**: Sugerencias automáticas para optimización de costos --- **Próximo paso**: Una vez comprendidos estos conceptos fundamentales, procederemos con la demostración práctica de creación y gestión de buckets mediante la consola de Google Cloud. ## 3. Demostración Práctica - Console y CLI Esta sección proporciona una guía paso a paso para la creación y gestión de buckets y objetos en Google Cloud Storage utilizando tanto la consola web como la línea de comandos. La demostración cubre las operaciones fundamentales que los estudiantes necesitarán dominar para trabajar efectivamente con GCS. ### 3.1 Configuración del Entorno Antes de comenzar con las operaciones de GCS, es necesario configurar el entorno de trabajo y verificar los permisos necesarios. #### Verificación de Permisos Los estudiantes deben verificar que tienen los permisos necesarios para trabajar con Google Cloud Storage: - **Storage Admin**: Permisos completos para gestionar buckets y objetos - **Storage Object Admin**: Gestión de objetos dentro de buckets existentes - **Storage Object Viewer**: Solo lectura de objetos - **Verificación**: Acceso a la consola de Google Cloud y capacidad de crear recursos #### Configuración de gsutil CLI La herramienta gsutil proporciona acceso completo a GCS desde la línea de comandos: ```bash # Verificar instalación de gsutil gsutil version # Configurar autenticación gcloud auth login # Verificar configuración gsutil config -l ``` #### Configuración del Proyecto Establecer el proyecto de Google Cloud como contexto de trabajo: ```bash # Listar proyectos disponibles gcloud projects list # Configurar proyecto por defecto gcloud config set project PROJECT_ID # Verificar configuración gcloud config list ``` ### 3.2 Creación de Buckets La creación de buckets es el primer paso para organizar el almacenamiento en GCS. Esta sección demuestra tanto la creación mediante consola como mediante CLI. #### Creación mediante Google Cloud Console La consola web proporciona una interfaz intuitiva para la creación y configuración de buckets: 1. **Navegación**: Acceder a Cloud Storage > Buckets en la consola 2. **Crear bucket**: Hacer clic en "Create bucket" 3. **Configuración básica**: - **Nombre**: Seguir convenciones de nomenclatura (minúsculas, guiones) - **Ubicación**: Seleccionar región o multi-región según necesidades - **Clase de almacenamiento**: Standard, Nearline, Coldline, o Archive - **Control de acceso**: Uniform o Fine-grained #### Creación mediante gsutil CLI La línea de comandos permite automatización y scripting de operaciones: ```bash # Crear bucket básico gsutil mb gs://aso-git-mi-bucket-demo # Crear bucket con configuración específica gsutil mb -c STANDARD -l us-central1 gs://aso-git-mi-bucket-demo-2 # Crear bucket con versionado habilitado gsutil mb -c STANDARD -l us-central1 gs://aso-git-mi-bucket-demo-versionado gsutil versioning set on gs://aso-git-mi-bucket-demo-versionado ``` #### Verificación de Creación Confirmar que los buckets se han creado correctamente: ```bash # Listar buckets del proyecto gsutil ls # Listar buckets con detalles gsutil ls -L # Verificar configuración específica gsutil versioning get gs://aso-git-mi-bucket-demo-versionado ``` #### Ejemplo Práctico de Versionado El versionado permite mantener múltiples versiones de un mismo objeto, lo cual es especialmente útil para backup y recuperación. Este ejemplo demuestra el flujo completo de trabajo con versiones: ```bash # 1. Crear un archivo inicial echo "Versión 1 del archivo" > documento.txt gsutil cp documento.txt gs://aso-git-mi-bucket-demo-versionado/ # 2. Verificar que se creó la primera versión gsutil ls -a gs://aso-git-mi-bucket-demo-versionado/documento.txt # 3. Modificar el archivo y subir nueva versión echo "Versión 2 del archivo - actualizada" > documento.txt gsutil cp documento.txt gs://aso-git-mi-bucket-demo-versionado/ # 4. Verificar que existen dos versiones gsutil ls -a gs://aso-git-mi-bucket-demo-versionado/documento.txt # 5. Descargar la versión más reciente (por defecto) gsutil cp gs://aso-git-mi-bucket-demo-versionado/documento.txt ./documento-actual.txt # 6. Descargar una versión específica (usar el número de generación) gsutil cp gs://aso-git-mi-bucket-demo-versionado/documento.txt#GENERATION_NUMBER ./documento-version-anterior.txt # 7. Listar todas las versiones con detalles gsutil ls -l -a gs://aso-git-mi-bucket-demo-versionado/documento.txt # 8. Eliminar solo la versión más reciente (no elimina versiones anteriores) gsutil rm gs://aso-git-mi-bucket-demo-versionado/documento.txt # 9. Eliminar una versión específica gsutil rm gs://aso-git-mi-bucket-demo-versionado/documento.txt#GENERATION_NUMBER # 10. Eliminar todas las versiones de un objeto gsutil rm -a gs://aso-git-mi-bucket-demo-versionado/documento.txt ``` **Nota**: Reemplaza `GENERATION_NUMBER` con el número de generación real que aparece en el listado de versiones. ### 3.3 Gestión de Objetos La gestión de objetos incluye operaciones de upload, download, listado y eliminación. Esta sección demuestra las operaciones fundamentales. #### Upload de Archivos Subir archivos individuales y en lote a buckets: ```bash # Upload de archivo individual gsutil cp archivo.txt gs://aso-git-mi-bucket-demo/ # Upload con metadatos personalizados gsutil -h "Content-Type:text/plain" -h "Cache-Control:no-cache" -h "x-goog-meta-tipo:documento" cp archivo.txt gs://aso-git-mi-bucket-demo/ # Upload recursivo de directorio gsutil -m cp -r directorio/ gs://aso-git-mi-bucket-demo/directorio/ # Upload con compresión automática gsutil cp -z gz archivo.txt gs://aso-git-mi-bucket-demo/ ``` #### Download de Archivos Descargar objetos desde buckets: ```bash # Download de archivo individual gsutil cp gs://aso-git-mi-bucket-demo/archivo.txt ./ # Download recursivo gsutil -m cp -r gs://aso-git-mi-bucket-demo/directorio/ ./ # Download con verificación de integridad gsutil cp -c gs://aso-git-mi-bucket-demo/archivo.txt ./ ``` #### Listado y Exploración Explorar el contenido de buckets: ```bash # Listar objetos en bucket gsutil ls gs://aso-git-mi-bucket-demo/ # Listar con detalles gsutil ls -l gs://aso-git-mi-bucket-demo/ # Listar recursivamente gsutil ls -r gs://aso-git-mi-bucket-demo/ # Buscar objetos por patrón gsutil ls gs://aso-git-mi-bucket-demo/*.txt ``` ### 3.4 Configuración de Lifecycle Policies Las políticas de lifecycle permiten automatizar la transición entre clases de almacenamiento y la eliminación de objetos obsoletos. #### Creación de Política de Lifecycle Definir reglas para la gestión automática del ciclo de vida de los objetos: ```json { "lifecycle": { "rule": [ { "action": { "type": "SetStorageClass", "storageClass": "NEARLINE" }, "condition": { "age": 30 } }, { "action": { "type": "SetStorageClass", "storageClass": "COLDLINE" }, "condition": { "age": 90 } }, { "action": { "type": "Delete" }, "condition": { "age": 365 } } ] } } ``` #### Aplicación de Política Aplicar la política de lifecycle al bucket: ```bash # Crear archivo de política echo '{"lifecycle": {"rule": [{"action": {"type": "SetStorageClass", "storageClass": "NEARLINE"}, "condition": {"age": 30}}]}}' > lifecycle.json # Aplicar política gsutil lifecycle set lifecycle.json gs://aso-git-mi-bucket-demo # Verificar política aplicada gsutil lifecycle get gs://aso-git-mi-bucket-demo ``` ### 3.5 Configuración de CORS La configuración de CORS (Cross-Origin Resource Sharing) permite el acceso a objetos desde aplicaciones web. #### Configuración de CORS Definir políticas CORS para permitir acceso desde dominios específicos: ```json [ { "origin": ["https://mi-dominio.com"], "method": ["GET", "POST"], "responseHeader": ["Content-Type"], "maxAgeSeconds": 3600 } ] ``` #### Aplicación de Configuración CORS ```bash # Crear archivo de configuración CORS echo '[{"origin": ["https://mi-dominio.com"], "method": ["GET", "POST"], "responseHeader": ["Content-Type"], "maxAgeSeconds": 3600}]' > cors.json # Aplicar configuración CORS gsutil cors set cors.json gs://aso-git-mi-bucket-demo # Verificar configuración gsutil cors get gs://aso-git-mi-bucket-demo ``` ### 3.6 Generación de Signed URLs Las URLs firmadas permiten acceso temporal y controlado a objetos sin autenticación. Para generar URLs firmadas, es necesario configurar una cuenta de servicio con los permisos apropiados. #### Configuración de Cuenta de Servicio para URLs Firmadas Antes de generar URLs firmadas, es necesario crear y configurar una cuenta de servicio: ```bash # 1. Crear una cuenta de servicio gcloud iam service-accounts create gcs-signer --display-name="GCS URL Signer" # 2. Crear y descargar la clave # Obtener el ID del proyecto actual PROJECT_ID=$(gcloud config get-value project) gcloud iam service-accounts keys create key.json --iam-account=gcs-signer@${PROJECT_ID}.iam.gserviceaccount.com # 3. Dar permisos a la cuenta de servicio gcloud projects add-iam-policy-binding ${PROJECT_ID} --member="serviceAccount:gcs-signer@${PROJECT_ID}.iam.gserviceaccount.com" --role="roles/storage.objectViewer" # 4. Verificar que la cuenta de servicio tiene los permisos necesarios gcloud projects get-iam-policy ${PROJECT_ID} --flatten="bindings[].members" --format="table(bindings.role)" --filter="bindings.members:gcs-signer@${PROJECT_ID}.iam.gserviceaccount.com" ``` #### Generación de URLs Firmadas Una vez configurada la cuenta de servicio, crear URLs temporales para acceso a objetos: ```bash # Generar URL firmada para lectura (válida por 1 hora) gsutil signurl -d 1h key.json gs://aso-git-mi-bucket-demo/archivo.txt # Generar URL firmada para escritura gsutil signurl -m PUT -d 1h key.json gs://aso-git-mi-bucket-demo/archivo-nuevo.txt # Generar URL firmada con metadatos específicos gsutil signurl -c "text/plain" -d 1h key.json gs://aso-git-mi-bucket-demo/archivo.txt ``` #### Verificación de URLs Firmadas Probar el acceso mediante las URLs generadas: ```bash # Probar acceso a URL firmada curl "URL_FIRMADA_GENERADA" # Verificar headers de respuesta curl -I "URL_FIRMADA_GENERADA" ``` #### Ejemplo Práctico: Upload de Archivos con URL Firmada Las URLs firmadas son especialmente útiles para permitir que aplicaciones web suban archivos directamente a GCS sin exponer credenciales. Este ejemplo demuestra el flujo completo: ```bash # 1. Generar URL firmada para upload (válida por 2 horas) UPLOAD_URL=$(gsutil signurl -m PUT -d 2h key.json gs://aso-git-mi-bucket-demo/archivo-upload.txt) echo "URL de upload: $UPLOAD_URL" # 2. Crear un archivo de prueba echo "Contenido del archivo subido via URL firmada" > archivo-prueba.txt # 3. Subir archivo usando la URL firmada (simulando upload desde aplicación web) curl -X PUT -H "Content-Type: text/plain" --data-binary @archivo-prueba.txt "$UPLOAD_URL" # 4. Verificar que el archivo se subió correctamente gsutil ls gs://aso-git-mi-bucket-demo/archivo-upload.txt # 5. Descargar el archivo para verificar el contenido gsutil cp gs://aso-git-mi-bucket-demo/archivo-upload.txt ./archivo-descargado.txt cat archivo-descargado.txt # 6. Limpiar archivos de prueba rm archivo-prueba.txt archivo-descargado.txt ``` **Casos de Uso Reales:** - **Aplicaciones web**: Permitir a usuarios subir archivos sin exponer credenciales - **Mobile apps**: Upload directo desde dispositivos móviles - **Integraciones**: APIs que necesitan acceso temporal a GCS - **Backup automatizado**: Scripts que suben archivos con URLs temporales ### 3.7 Operaciones Avanzadas Las operaciones avanzadas incluyen sincronización, transferencia paralela y gestión de versiones. #### Sincronización de Directorios Sincronizar directorios locales con buckets: ```bash # Sincronizar directorio local con bucket gsutil -m rsync -r directorio-local/ gs://aso-git-mi-bucket-demo/ # Sincronización bidireccional gsutil -m rsync -r gs://aso-git-mi-bucket-demo/ directorio-local/ # Sincronización con exclusión de archivos gsutil -m rsync -r -x ".*\.tmp$" directorio-local/ gs://aso-git-mi-bucket-demo/ ``` #### Transferencia Paralela Optimizar transferencias mediante paralelización: ```bash # Configurar número de threads paralelos gsutil -m -o GSUtil:parallel_thread_count=4 cp -r directorio/ gs://aso-git-mi-bucket-demo/ # Configurar tamaño de chunk gsutil -m -o GSUtil:parallel_composite_upload_threshold=150M cp archivo-grande.zip gs://aso-git-mi-bucket-demo/ ``` #### Gestión de Versiones Trabajar con versiones de objetos: ```bash # Habilitar versionado en bucket gsutil versioning set on gs://aso-git-mi-bucket-demo # Listar versiones de objeto gsutil ls -a gs://aso-git-mi-bucket-demo/archivo.txt # Descargar versión específica gsutil cp gs://aso-git-mi-bucket-demo/archivo.txt#1234567890 ./ # Eliminar versión específica gsutil rm gs://aso-git-mi-bucket-demo/archivo.txt#1234567890 ``` ### 3.8 Monitoreo y Troubleshooting El monitoreo efectivo permite identificar problemas y optimizar el rendimiento. #### Comandos de Diagnóstico ```bash # Verificar conectividad gsutil ls # Verificar permisos gsutil iam get gs://aso-git-mi-bucket-demo # Verificar configuración de bucket gsutil ls -L -b gs://aso-git-mi-bucket-demo # Verificar transferencias en progreso gsutil -m cp -r directorio/ gs://aso-git-mi-bucket-demo/ & gsutil -m cp -r directorio/ gs://aso-git-mi-bucket-demo/ & ``` #### Logging y Debugging ```bash # Habilitar logging detallado gsutil -D cp archivo.txt gs://aso-git-mi-bucket-demo/ # Verificar logs de operaciones gsutil logging get gs://aso-git-mi-bucket-demo # Configurar logging de acceso gsutil logging set on gs://aso-git-mi-bucket-demo ``` --- **Próximo paso**: Una vez completada la demostración práctica, procederemos con la implementación de infraestructura como código utilizando Terraform para la gestión automatizada de recursos GCS. ## 4. Infraestructura como Código con Terraform Esta sección demuestra cómo gestionar recursos de Google Cloud Storage utilizando Terraform, permitiendo la automatización, versionado y gestión declarativa de la infraestructura. Terraform proporciona ventajas significativas sobre la gestión manual, incluyendo reproducibilidad, control de versiones y automatización de despliegues. ### 4.1 Configuración del Entorno Terraform Antes de comenzar con la gestión de recursos GCS mediante Terraform, es necesario configurar el entorno y verificar los requisitos previos. #### Creación del Bucket Backend para Terraform Terraform necesita un bucket de Google Cloud Storage para almacenar su estado de forma remota. Este bucket debe crearse antes de ejecutar cualquier configuración de Terraform: ```bash # 1. Crear bucket para el estado de Terraform gsutil mb gs://aso-git-terraform-state-$(date +%s) # 2. Verificar que el bucket se creó correctamente gsutil ls gs://aso-git-terraform-state-* # 3. Configurar versionado en el bucket de estado (recomendado) gsutil versioning set on $(gsutil ls | grep terraform-state | head -1 | cut -d'/' -f3) # 4. Verificar configuración del bucket gsutil versioning get $(gsutil ls | grep terraform-state | head -1 | cut -d'/' -f3) ``` **Nota**: El comando `$(date +%s)` añade un timestamp para garantizar la unicidad del nombre del bucket. Anota el nombre exacto del bucket creado, ya que lo necesitarás para la configuración de Terraform. #### Verificación de Requisitos Los estudiantes deben verificar que tienen los componentes necesarios instalados: ```bash # Verificar instalación de Terraform terraform version # Verificar instalación de gcloud CLI gcloud version # Verificar autenticación en Google Cloud gcloud auth list # Verificar proyecto configurado gcloud config get-value project ``` #### Configuración de Autenticación Terraform necesita credenciales para acceder a Google Cloud: ```bash # Configurar Application Default Credentials gcloud auth application-default login # Verificar que las credenciales están configuradas gcloud auth application-default print-access-token ``` ### 4.2 Estructura de Archivos Terraform La organización de archivos Terraform sigue mejores prácticas para mantener el código organizado y reutilizable: ``` terraform/ ├── main.tf # Provider y configuración básica ├── variables.tf # Variables para buckets ├── terraform.tfvars # Valores de las variables ├── outputs.tf # Outputs de buckets creados ├── api.tf # Habilitación de APIs necesarias ├── storage.tf # Recursos de GCS └── iam.tf # Configuración de IAM #### main.tf - Configuración del Provider ```hcl # Configuración del provider de Google Cloud terraform { required_version = ">= 1.0" required_providers { google = { source = "hashicorp/google" version = "~> 5.0" } } } # Configuración del provider provider "google" { project = var.project_id region = var.region } # Configuración de backend (opcional) # IMPORTANTE: Reemplaza "BUCKET_NAME" con el nombre real del bucket creado anteriormente terraform { backend "gcs" { bucket = "aso-git-terraform-state-TIMESTAMP" # Reemplazar con el nombre real prefix = "gcs-lab" } } ``` #### variables.tf - Variables de Configuración ```hcl # Variables para configuración del proyecto variable "project_id" { description = "ID del proyecto de Google Cloud" type = string } variable "region" { description = "Región para los recursos" type = string default = "us-central1" } # Usar la misma región para todos los recursos locals { kms_location = var.region # Usar la región definida en variables } # Generar sufijo aleatorio para evitar colisiones resource "random_string" "bucket_suffix" { length = 3 upper = false lower = true numeric = false special = false } # Variables para buckets variable "bucket_location" { description = "Ubicación para todos los buckets" type = string default = "US" } variable "bucket_configs" { description = "Configuración de buckets" type = map(object({ storage_class = string })) default = { "demo" = { storage_class = "STANDARD" } "backup" = { storage_class = "NEARLINE" } "archive" = { storage_class = "COLDLINE" } } } ``` ### 4.3 Habilitación de APIs Necesarias Antes de crear los recursos de Google Cloud Storage y KMS, es necesario habilitar las APIs correspondientes. Terraform puede hacer esto automáticamente utilizando el recurso `google_project_service`. #### api.tf - Habilitación de APIs ```hcl # Habilitar APIs necesarias para Google Cloud Storage resource "google_project_service" "storage_api" { service = "storage.googleapis.com" disable_on_destroy = false } # API de KMS no requerida para este laboratorio simplificado # Habilitar APIs necesarias para IAM resource "google_project_service" "iam_api" { service = "iam.googleapis.com" disable_on_destroy = false depends_on = [google_project_service.storage_api] } # Habilitar APIs necesarias para Cloud Resource Manager resource "google_project_service" "resource_manager_api" { service = "cloudresourcemanager.googleapis.com" disable_on_destroy = false depends_on = [google_project_service.storage_api] } # Esperar a que las APIs se propaguen completamente resource "time_sleep" "wait_for_apis" { depends_on = [ google_project_service.storage_api, google_project_service.iam_api, google_project_service.resource_manager_api ] create_duration = "30s" } ``` **Explicación de las APIs habilitadas:** - **storage.googleapis.com**: API principal para Google Cloud Storage - **iam.googleapis.com**: API para Identity and Access Management - **cloudresourcemanager.googleapis.com**: API para gestión de recursos del proyecto **Características importantes:** - `disable_on_destroy = false`: Las APIs permanecen habilitadas incluso si se destruye la infraestructura - `depends_on`: Asegura que las APIs se habiliten en el orden correcto - **Tiempo de habilitación**: Las APIs pueden tardar unos segundos en habilitarse completamente ### 4.4 Creación de Recursos GCS Los recursos de Google Cloud Storage se definen utilizando el recurso `google_storage_bucket` con todas sus opciones de configuración. #### storage.tf - Recursos de GCS ```hcl # Crear buckets con configuración básica resource "google_storage_bucket" "buckets" { for_each = var.bucket_configs name = "aso-git-${random_string.bucket_suffix.result}-${each.key}-bucket" location = var.bucket_location storage_class = each.value.storage_class # Configuración de versionado versioning { enabled = each.key == "demo" ? true : false } # Configuración de lifecycle lifecycle_rule { condition { age = 30 } action { type = "SetStorageClass" storage_class = "NEARLINE" } } lifecycle_rule { condition { age = 90 } action { type = "SetStorageClass" storage_class = "COLDLINE" } } lifecycle_rule { condition { age = 365 } action { type = "Delete" } } # Configuración de retención - Previene el borrado/modificación de objetos # La política de retención establece un período mínimo durante el cual los objetos # deben conservarse y no pueden ser eliminados o modificados. Esto es útil para # cumplimiento normativo y requisitos legales de conservación de datos. retention_policy { # Período de retención en segundos: # - 2592000 = 30 días (30 * 24 * 60 * 60) # Los objetos no podrán ser modificados o eliminados durante este período # incluso si tienen permisos de administrador retention_period = 2592000 # 30 días en segundos } # Encriptación por defecto de GCS (AES-256) # No se requiere configuración adicional de encriptación # Etiquetas para organización labels = { environment = "demo" project = "gcs-lab" managed_by = "terraform" } } ``` ### 4.4 Configuración de IAM Para este laboratorio, utilizaremos la cuenta de usuario autenticada directamente, simplificando la configuración y permitiendo que los estudiantes se centren en los conceptos principales de Google Cloud Storage. #### Configuración de Permisos IAM ```hcl # Los buckets se crean con permisos por defecto para el usuario autenticado # No se requiere configuración adicional de IAM para el laboratorio básico ``` ### 4.5 Encriptación por Defecto de GCS Google Cloud Storage proporciona encriptación automática de todos los datos almacenados utilizando encriptación AES-256. Esta encriptación está habilitada por defecto y no requiere configuración adicional para el laboratorio básico. #### Características de la Encriptación por Defecto - **Algoritmo**: AES-256 (Advanced Encryption Standard) - **Gestión de claves**: Automática por Google Cloud - **Rotación**: Automática y transparente - **Cumplimiento**: Compatible con estándares de seguridad empresarial - **Rendimiento**: Sin impacto en el rendimiento de las operaciones #### Ventajas para el Laboratorio 1. **Simplicidad**: No requiere configuración adicional 2. **Seguridad**: Encriptación de nivel empresarial 3. **Confiabilidad**: Gestionada automáticamente por Google 4. **Cumplimiento**: Satisface la mayoría de requisitos de seguridad ### 4.6 Outputs y Verificación Los outputs permiten exponer información importante sobre los recursos creados. #### outputs.tf - Outputs de Recursos ```hcl # Outputs de buckets output "bucket_names" { description = "Nombres de los buckets creados" value = { for k, v in google_storage_bucket.buckets : k => v.name } } output "bucket_urls" { description = "URLs de los buckets creados" value = { for k, v in google_storage_bucket.buckets : k => v.url } } output "bucket_locations" { description = "Ubicaciones de los buckets" value = { for k, v in google_storage_bucket.buckets : k => v.location } } # Outputs de encriptación output "encryption_info" { description = "Información sobre la encriptación de los buckets" value = "Encriptación AES-256 habilitada por defecto en todos los buckets" } ``` ### 4.7 Archivo de Variables `terraform.tfvars` Para facilitar la configuración y personalización de los recursos, se crea un archivo `terraform.tfvars` con los valores específicos del proyecto: ```hcl # Archivo terraform.tfvars - Variables para Google Cloud Storage # Copia este archivo y ajusta los valores según tu proyecto # Configuración básica del proyecto project_id = "tu-proyecto-gcp" region = "europe-west1" # Región que soporta KMS # Ubicación para todos los buckets bucket_location = "US" # Configuración de buckets con sus clases de almacenamiento bucket_configs = { "demo" = { storage_class = "STANDARD" } "backup" = { storage_class = "NEARLINE" } "archive" = { storage_class = "COLDLINE" } } ``` ### 4.8 Despliegue y Verificación El proceso de despliegue incluye inicialización, planificación y aplicación de cambios. #### Comandos de Despliegue ```bash # 1. Inicializar Terraform terraform init # 2. Verificar configuración terraform validate # 3. Crear plan de ejecución terraform plan # 4. Aplicar cambios terraform apply # 5. Verificar recursos creados terraform output # 6. Verificar buckets en Google Cloud gsutil ls ``` #### Verificación de Recursos ```bash # Verificar buckets creados gsutil ls -L # Obtener nombres de buckets desde Terraform BUCKET_NAMES=$(terraform output -json bucket_names) # Verificar configuración de un bucket específico gsutil ls -L -b gs://$(echo $BUCKET_NAMES | jq -r '.["demo"]') # Verificar políticas de lifecycle gsutil lifecycle get gs://$(echo $BUCKET_NAMES | jq -r '.["demo"]') # Verificar permisos de acceso (usando cuenta de usuario autenticada) gsutil ls gs://$(echo $BUCKET_NAMES | jq -r '.["demo"]') ``` ### 4.8 Gestión de Cambios y Destrucción Terraform permite gestionar cambios de manera controlada y limpiar recursos cuando ya no son necesarios. #### Gestión de Cambios ```bash # Ver cambios pendientes terraform plan # Aplicar cambios específicos terraform apply -target=google_storage_bucket.buckets # Importar recursos existentes terraform import google_storage_bucket.existing_bucket gs://bucket-name ``` #### Limpieza de Recursos ```bash # Destruir todos los recursos terraform destroy # Destruir recursos específicos terraform destroy -target=google_storage_bucket.buckets # Verificar que los recursos se eliminaron gsutil ls ``` ### 4.9 Mejores Prácticas de Terraform La implementación de mejores prácticas asegura la mantenibilidad y escalabilidad del código de infraestructura. #### Organización del Código - **Separación de responsabilidades**: Archivos separados por funcionalidad - **Variables parametrizables**: Configuración flexible mediante variables - **Outputs informativos**: Exposición de información relevante - **Documentación**: Comentarios claros en el código #### Gestión de Estado - **Backend remoto**: Almacenamiento del estado en GCS - **Bloqueo de estado**: Prevención de modificaciones concurrentes - **Versionado**: Control de versiones del estado #### Seguridad - **Principio de menor privilegio**: Permisos mínimos necesarios - **Encriptación**: Uso de KMS para encriptación de datos - **Rotación de claves**: Renovación periódica de claves de encriptación --- **Próximo paso**: Una vez completada la implementación de infraestructura como código, procederemos con los casos de uso prácticos y la integración con otros servicios de Google Cloud.