Creación de Cuentas de Almacenamiento en Azure con Terraform
Resumen
¿Cómo se crea una cuenta de almacenamiento en Azure con Terraform?
Crear una cuenta de almacenamiento en Azure utilizando Terraform es uno de los primeros pasos esenciales al gestionar infraestructura como código. Las cuentas de almacenamiento son como discos duros virtuales, que permiten almacenar una variedad de datos. Aquí te explicamos cómo hacerlo paso a paso.
Preparación del entorno
Buscar y establecer ambiente: Primero, debemos buscar en Internet el término "start up account Terraform". Así encontraremos el registro de Terraform, donde se encuentra la documentación necesaria.
Configuración en VSCode: Crea un nuevo directorio llamado almacenamiento y dentro de este, un archivo llamado main.tf. Evita nombres duplicados en los archivos o carpetas para evitar confusiones.
Configuración inicial del archivo Terraform
Copia de configuraciones previas: Puedes duplicar configuraciones anteriores para ahorrar tiempo. Asegúrate de adecuar nombres y regiones según sea necesario. Por ejemplo, cambiar de "México central" a "Brasil South".
# Ejemplo de configuración Terraform para una cuenta de almacenamiento en Azure.resource "azurerm_storage_account""nombre_cuenta"{name="nombreunicoalmacenamiento"resource_group_name= azurerm_resource_group.rg.name
location= azurerm_resource_group.rg.location
account_tier="Standard"account_replication_type="LRS"}
Propiedades de la cuenta de almacenamiento
Las cuentas de almacenamiento requieren un nombre único y estrictamente en minúsculas. El nombre debe variar entre 3 y 24 caracteres. Puedes ajustar diferentes propiedades según tus necesidades, como public_network_access_enabled.
# Ajuste de acceso de red públicapublic_network_access_enabled=false
Implementación y verificación
Inicialización: Usa el comando terraform init dentro del directorio almacenamiento para inicializar el ambiente.
Ejecución del plan: Ejecuta terraform plan -out=plan.out para ver los cambios que se aplicarán.
Aplicación de la configuración: Finalmente, utiliza terraform apply para desplegar los recursos en Azure.
Manejo de valores de salida
Para extraer los datos sensibles del despliegue, como la cadena de conexión, puedes definir un bloque de output en tu archivo main.tf.
Recuerda que los valores sensibles se deben manejar con cuidado. Terraform los enmascarará y no los mostrará visualmente, excepto en scripts o procesos automatizados de integración continua.
Prueba con distintos valores
Una vez que comprendas estos conceptos básicos, experimenta con otros valores y propiedades que las cuentas de almacenamiento de Azure ofrecen, como la replicación o la ubicación geográfica. La práctica te permitirá aprender más sobre la flexibilidad y el poder de Terraform al gestionar la infraestructura.
En resumen, el uso de Terraform para gestionar recursos en la nube facilita la creación y manejo eficiente de infraestructuras completas, promoviendo buenas prácticas de desarrollo de software y automatización. ¡Explora y sigue aprendiendo!
Este es un ejemplo de módulo reutilizable en Terraform para cuentas de almacenamiento en Azure. Este módulo está pensado para entornos productivos, con buenas prácticas como parametrización, outputs sensibles y flexibilidad para diferentes escenarios.
📦 Módulo Terraform: Cuenta de Almacenamiento en Azure
variable "resource_group_name"{ description ="Nombre del Resource Group donde se desplegará la cuenta de almacenamiento" type = string
}variable "location"{ description ="Región de Azure para desplegar los recursos" type = string
default="eastus"}variable "storage_account_name"{ description ="Nombre único para la cuenta de almacenamiento (3-24 caracteres, minúsculas)" type = string
}variable "account_tier"{ description ="Nivel de rendimiento de la cuenta de almacenamiento" type = string
default="Standard"}variable "account_replication_type"{ description ="Tipo de replicación (LRS, ZRS, GRS, RAGRS)" type = string
default="GRS"}variable "allow_blob_public_access"{ description ="Permitir acceso público a blobs" type = bool
default=false}variable "enable_https_traffic_only"{ description ="Forzar solo tráfico HTTPS" type = bool
default=true}variable "min_tls_version"{ description ="Versión mínima de TLS" type = string
default="TLS1_2"}variable "public_network_access_enabled"{ description ="Permitir acceso público a la cuenta de almacenamiento" type = bool
default=false}variable "tags"{ description ="Etiquetas adicionales para los recursos" type =map(string)default={}}
📤 outputs.tf
output "storage_account_id"{ description ="ID de la cuenta de almacenamiento" value = azurerm_storage_account.storage.id}output "storage_account_name"{ description ="Nombre de la cuenta de almacenamiento" value = azurerm_storage_account.storage.name}output "primary_blob_endpoint"{ description ="Endpoint primario de blobs" value = azurerm_storage_account.storage.primary_blob_endpoint}output "primary_connection_string"{ description ="Cadena de conexión primaria (oculta por seguridad)" value = azurerm_storage_account.storage.primary_connection_string sensitive =true}
📖 README.md (ejemplo de uso)
# Módulo de AzureStorageAccountEste módulo despliega una cuenta de almacenamiento en Azure con opciones de seguridad, replicación y outputs sensibles.## Uso```hcl
module "storage_account"{ source ="./modules/storage_account" resource_group_name ="rg-production"location="brazilsouth" storage_account_name ="prodplatzi123" account_tier ="Standard" account_replication_type ="GRS" public_network_access_enabled =false tags ={ environment ="production" project ="finanzas"}}
Outputs disponibles
storage_account_id
storage_account_name
primary_blob_endpoint
primary_connection_string (sensible)
En mi caso tuve en error de configuración de redundancia por que la region que use no lo admitia, al cambiar de region se soluciono.
Debe ser storage en lugar de start up
Dependiendo la región puede lanzar error de redundancia, para solucionarlo todo es cuestión de cambiarla:
Pueden checar la documentación para entender a mayor profundiad el tema
Documentación terraform AWS S3:
terraform { required_providers { aws ={ source ="hashicorp/aws" version ="6.41.0"}}}locals { common_tags ={ organization =var.org_name project =var.project_name environment =var.environment owner ="felipe" created_by ="terraform"}}provider "aws"{ region =var.region}resource "aws_s3_bucket""s3-assets"{ bucket ="felipecorp-tfcourse-dev-assets" force_destroy =true tags = local.common_tags}output "bucket_name"{ value = aws_s3_bucket.s3-assets.bucket description ="Nombre del bucket S3 creado"}output "bucket_arn"{ value = aws_s3_bucket.s3-assets.arn description ="ARN del bucket S3 creado"}
Este es un tip sencillo para los que trabajan con linux o mac, para limpiar la terminal rápido lo pueden hacer con el shortcut "ctrl/command + L". PS: No recuerdo si en windows también funciona me parece que si.
🚀 Creando y Gestionando Cuentas de Almacenamiento en Azure con Terraform
En esta lección se describe paso a paso cómo provisionar y gestionar cuentas de almacenamiento en Azure utilizando Terraform. El proceso incluye desde la creación inicial del recurso hasta la configuración de salidas sensibles y mejores prácticas de despliegue. A continuación, encontrarás un resumen estructurado y enriquecido con ejemplos prácticos.
📂 Concepto de Cuentas de Almacenamiento en Azure
Las cuentas de almacenamiento en Azure funcionan como una “USB gigante” o un disco duro virtual en la nube, permitiendo almacenar archivos, blobs, tablas o discos. Son un recurso esencial para casi cualquier arquitectura en la nube.
Ejemplo ilustrativo:
Imagina que quieres centralizar archivos de logs generados por aplicaciones distribuidas en varias regiones. Una cuenta de almacenamiento en Azure puede actuar como repositorio único, accesible y escalable.
🔍 Uso de la Documentación en Terraform Registry
El primer paso fue recurrir a la documentación oficial en Terraform Registry, donde se encuentran los bloques necesarios para declarar recursos.
Para este caso, se usó el recurso azurerm_storage_account.
Recomendación clave:
Siempre inicia revisando la documentación más reciente del proveedor.
Copia ejemplos básicos y adáptalos a tu entorno.
🛠 Preparando el Entorno en VS Code
El proceso se llevó a cabo en Visual Studio Code, creando un directorio específico (almacenamiento) y un archivo principal (main.tf).
Se reutilizó parte del código de ejercicios anteriores para acelerar el setup inicial.
Ejemplo práctico:
Carpeta: /terraform/almacenamiento
Archivo: main.tf con definición de azurerm_resource_group y azurerm_storage_account.
🌍 Definiendo Recursos y Regiones
Se eligió la región Brazil South en lugar de Central Mexico, mostrando cómo variar la ubicación de recursos para diferentes escenarios.
Buenas prácticas destacadas:
Usar variables dinámicas en lugar de nombres estáticos.
Permitir que Terraform gestione las dependencias entre recursos (ejemplo: primero se crea el grupo de recursos y luego la cuenta de almacenamiento).
🔑 Nombres Únicos y Restricciones
Las cuentas de almacenamiento en Azure requieren nombres únicos, de 3 a 24 caracteres y en minúsculas.
El ejemplo utilizó un nombre como amin-test-platzi.
Tips prácticos:
Evita nombres genéricos como storageaccount, ya que casi siempre estarán ocupados.
Usa prefijos/sufijos relacionados con tu organización o entorno (ejemplo: dev, test, prod).
⚙️ Ejecución de Comandos Terraform
La secuencia de comandos clave fue:
terraform init → Inicializar el entorno.
terraform plan -out plan.out → Revisar el plan de ejecución.
terraform apply → Desplegar los recursos.
Ejemplo de problema común:
Un error 404 al crear el recurso indica que el nombre elegido ya existe. La solución rápida es cambiar el nombre y volver a aplicar.
🔒 Configuración de Propiedades de Seguridad
Dentro de la cuenta de almacenamiento se ajustó la propiedad public_network_access_enabled a false, limitando el acceso público.
Recomendación:
Configura estas propiedades desde el inicio para evitar que los recursos sean desplegados con configuraciones inseguras.
📝 Outputs y Valores Sensibles
Una parte clave fue la definición de un output para exponer la connection string de la cuenta de almacenamiento.
Al tratarse de información sensible, se configuró:
sensitive =true
Esto garantiza que:
Terraform pueda usar la información en pipelines o scripts.
La cadena no se muestre en texto plano en la terminal.
🧩 Explorando Propiedades y Outputs Adicionales
Más allá de la cadena de conexión, una cuenta de almacenamiento ofrece muchas propiedades útiles que se pueden exponer como outputs:
🌐 Ubicación (location)
🔄 Tipo de replicación (account_replication_type)
💾 Tipo de rendimiento (account_tier)
Ejemplo hipotético:
Definir un output adicional con el tipo de replicación configurado (LRS, GRS, etc.) para auditar despliegues en diferentes entornos.
✅ Conclusión y Recomendaciones Finales
Este ejercicio muestra un flujo completo de trabajo con Terraform y Azure:
Crear y organizar recursos en archivos bien estructurados.
Aprovechar la documentación oficial del Terraform Registry.
Asegurar nombres únicos y buenas prácticas de dependencias.
Configurar outputs de manera segura con sensitive = true.
Explorar propiedades adicionales para enriquecer los outputs.
Recomendación práctica:
Experimenta con diferentes configuraciones de las cuentas de almacenamiento (replicación, accesos, niveles de rendimiento) y expón esas propiedades en tus outputs para entender mejor cómo afectan a tu infraestructura y aplicaciones.
Me toco aprender terraform a la fuerza, necesitaba levantar un proyecto en menos de días en AWS, asi que con ayuda de este curso más IA fui a aprendiendo, ahora ya se obtener las variables importantes, Gracias!. (pd: estaba levantando un servidor con bd bajo una vpc)
output "ec2_public_ip" { value = aws_eip.ip.public_ip }
output "db_endpoint" { value = aws_db_instance.mysql.address }
output "db_name" { value = aws_db_instance.mysql.db_name }
output "db_user" { value = aws_db_instance.mysql.username }
Mi output:
output "secondary_location" { value = azurerm_storage_account.storage_account.secondary_location}
No se muestra en el output pero quedaría en el terraform state el valor limpio, como se manejaría para mejorar esa parte de seguridad?
Simplemente usa el estado remoto que viene en unas clases adelante.