Guía completa para crear y configurar Azure Cosmos DB con Terraform
Daniel J. Saldaña
- 25 de junio de 2024
- Puntuación de feedback
![Guía completa para crear y configurar Azure Cosmos DB con Terraform](/_vercel/image?url=%2Fimages%2Fposts%2Fguia-completa-para-crear-y-configurar-azure-cosmos-db-con-terraform.png&w=932&q=100)
En esta guía detallada, aprenderás a crear y configurar una cuenta de Azure Cosmos DB utilizando Terraform. Exploraremos qué es Azure Cosmos DB, sus beneficios, y cómo puedes automatizar su gestión con Terraform para lograr una infraestructura en la nube más eficiente y escalable.
¿Qué es Azure Cosmos DB?
Azure Cosmos DB es un servicio de base de datos distribuida globalmente que permite gestionar datos a gran escala con alta disponibilidad, rendimiento y consistencia. Ofrece capacidades multimodelo, incluyendo soporte para documentos, gráficos y columnas anchas, y es ideal para aplicaciones que requieren escalabilidad horizontal y baja latencia de datos.
Beneficios de Azure Cosmos DB
- Distribución Global: Replica tus datos en múltiples regiones de Azure para ofrecer alta disponibilidad y rendimiento sin la necesidad de gestión manual.
- Modelos de Consistencia: Proporciona cinco niveles de consistencia ajustables según las necesidades de tu aplicación: fuerte, obsoleto limitado, prefijo consistente, sesión y eventual.
- Escalabilidad Horizontal: Permite escalar el rendimiento y el almacenamiento de manera independiente y automática para manejar cargas variables.
- Integración Multimodelo: Soporta múltiples APIs, incluyendo SQL, MongoDB, Cassandra, Gremlin y Table, facilitando la integración con diversas aplicaciones.
- Garantía de Desempeño: Ofrece latencias de lectura y escritura garantizadas menores a 10 milisegundos, asegurando un rendimiento óptimo.
Configuración de Azure Cosmos DB con Terraform
Terraform es una herramienta de infraestructura como código (IaC) que permite definir y gestionar tu infraestructura en la nube de manera declarativa. Utilizar Terraform para configurar Azure Cosmos DB ofrece ventajas como la repetibilidad, el versionado y la automatización del despliegue.
Archivos de configuración
Para comenzar, necesitas crear tres archivos principales: main.tf
, variables.tf
y outputs.tf
.
1. main.tf
Este archivo define el proveedor de Azure y el recurso de Cosmos DB. Aquí se especifican todas las configuraciones necesarias para la cuenta de Cosmos DB.
Código del archivo main.tf
:
provider "azurerm" { features {}}
resource "azurerm_cosmosdb_account" "cosmosdb" { count = var.create_resource ? 1 : 0
name = var.name location = var.location resource_group_name = var.resource_group_name offer_type = var.offer_type kind = var.kind tags = var.tags
enable_automatic_failover = var.enable_automatic_failover is_virtual_network_filter_enabled = var.is_virtual_network_filter_enabled enable_multiple_write_locations = var.enable_multiple_write_locations enable_free_tier = var.enable_free_tier minimal_tls_version = var.minimal_tls_version capacity { total_throughput_limit = var.total_throughput_limit }
geo_location { location = var.location failover_priority = 0 }
capabilities { name = var.capabilities_name } backup { type = var.backup_type tier = var.backup_tier }
consistency_policy { consistency_level = var.consistency_policy }}
2. variables.tf
Este archivo define todas las variables que se utilizarán en el módulo, permitiendo personalizar la configuración del recurso de Cosmos DB según tus necesidades.
Código del archivo variables.tf
:
variable "create_resource" { type = bool default = true
validation { condition = var.create_resource == true || var.create_resource == false error_message = "El valor de create_resource debe ser verdadero o falso." }}
variable "name" { type = string description = "El nombre del Cosmos DB account."
validation { condition = length(var.name) > 0 error_message = "Se debe proporcionar un nombre para el Cosmos DB account." }}
variable "location" { type = string description = "La ubicación en la que se creará el Cosmos DB account."
validation { condition = length(var.location) > 0 error_message = "Se debe proporcionar una ubicación para el Cosmos DB account." }}
variable "resource_group_name" { type = string description = "El nombre del grupo de recursos en el que se creará el Cosmos DB account."
validation { condition = length(var.resource_group_name) > 0 error_message = "Se debe proporcionar un nombre para el grupo de recursos." }}
variable "offer_type" { type = string description = "El tipo de oferta para el Cosmos DB account."
validation { condition = contains(["Standard", "Autoscale"], var.offer_type) error_message = "El valor de offer_type debe ser 'Standard' o 'Autoscale'." }}
variable "kind" { type = string description = "El tipo de Cosmos DB account."
validation { condition = contains(["GlobalDocumentDB", "MongoDB", "Parse"], var.kind) error_message = "El valor de kind debe ser 'GlobalDocumentDB', 'MongoDB' o 'Parse'." }}
variable "tags" { type = map(string) description = "Un mapa de etiquetas para asignar al Cosmos DB account."
validation { condition = length(var.tags) > 0 error_message = "Se deben proporcionar etiquetas para el Cosmos DB account." }}
variable "enable_automatic_failover" { type = bool description = "Indica si se habilita el failover automático."
validation { condition = var.enable_automatic_failover == true || var.enable_automatic_failover == false error_message = "The variable 'my_variable' must be either true or false." }}
variable "is_virtual_network_filter_enabled" { type = bool description = "Indica si se habilita el filtro de red virtual."
validation { condition = var.is_virtual_network_filter_enabled == true || var.is_virtual_network_filter_enabled == false error_message = "El filtro de red virtual solo se puede habilitar para ofertas de tipo 'Standard'." }}
variable "enable_multiple_write_locations" { type = bool description = "Indica si se habilitan las ubicaciones de escritura múltiple."
validation { condition = var.enable_multiple_write_locations == true || var.enable_multiple_write_locations == false error_message = "Las ubicaciones de escritura múltiple solo se pueden habilitar para ofertas de tipo 'Standard'." }}
variable "enable_free_tier" { type = bool description = "Indica si se habilita la capa gratuita."
validation { condition = var.enable_free_tier == true || var.enable_free_tier == false error_message = "La capa gratuita solo se puede habilitar para ofertas de tipo 'Standard'." }}
variable "minimal_tls_version" { type = string description = "La versión mínima de TLS para el Cosmos DB account."
validation { condition = contains(["Tls10", "Tls11", "Tls12"], var.minimal_tls_version) error_message = "El valor de minimal_tls_version debe ser 'Tls10', 'Tls11' o 'Tls12'." }}
variable "total_throughput_limit" { type = number description = "El límite total de rendimiento para el Cosmos DB account."
validation { condition = var.total_throughput_limit > 0 error_message = "El límite total de rendimiento debe ser mayor que cero." }}
variable "geo_location" { description = "La ubicación geográfica y la prioridad de failover para la cuenta de CosmosDB" type = object({ location = string failover_priority = number })
validation { condition = length(var.geo_location) > 0 error_message = "Se debe proporcionar al menos una ubicación geográfica." }}
variable "capabilities_name" { type = string description = "El nombre de la capacidad para el Cosmos DB account."
validation { condition = length(var.capabilities_name) > 0 error_message = "Se debe proporcionar un nombre para la capacidad." }}
variable "backup_type" { type = string description = "El tipo de copia de seguridad para el Cosmos DB account."
validation { condition = contains(["Periodic", "Continuous"], var.backup_type) error_message = "El valor de backup_type debe ser 'Periodic' o 'Continuous'." }}
variable "backup_tier" { type = string description = "El nivel de copia de seguridad para el Cosmos DB account."
validation { condition = contains(["Continuous7Days", "Continuous30Days", "Continuous"], var.backup_tier) error_message = "El valor de backup_tier debe ser 'Continuous7Days', 'Continuous30Days' o 'Continuous'." }}
variable "consistency_policy" { type = string description = "El nivel de consistencia para el Cosmos DB account."
validation { condition = contains(["Eventual", "Session", "Strong", "BoundedStaleness", "ConsistentPrefix"], var.consistency_policy) error_message = "El valor de consistency_level debe ser 'Eventual', 'Session', 'Strong', 'BoundedStaleness' o 'ConsistentPrefix'." }}
3. outputs.tf
Este archivo define las salidas del módulo, como el ID y el nombre de la cuenta de Cosmos DB creada, que pueden ser utilizados en otros módulos o scripts.
Código del archivo outputs.tf
:
output "cosmosdb_id" { value = length(azurerm_cosmosdb_account.cosmosdb) > 0 ? azurerm_cosmosdb_account.cosmosdb[0].id : "" description = "El ID del Cosmos DB account."}
output "cosmosdb_name" { value = length(azurerm_cosmosdb_account.cosmosdb) > 0 ? azurerm_cosmosdb_account.cosmosdb[0].endpoint : "" description = "El nombre del Cosmos DB account."}
Descripción de las variables
A continuación, se describen las principales variables utilizadas en el módulo y su propósito:
create_resource
: Indica si se debe crear el recurso de Cosmos DB (true
ofalse
).name
: Nombre del Cosmos DB account.location
: Ubicación donde se creará el Cosmos DB account.resource_group_name
: Nombre del grupo de recursos donde se creará el Cosmos DB account.offer_type
: Tipo de oferta para el Cosmos DB account (Standard
oAutoscale
).kind
: Tipo de Cosmos DB account (GlobalDocumentDB
,MongoDB
,Parse
).tags
: Mapa de etiquetas para asignar al Cosmos DB account.enable_automatic_failover
: Habilitar o deshabilitar el failover automático.is_virtual_network_filter_enabled
: Habilitar o deshabilitar el filtro de red virtual.enable_multiple_write_locations
: Habilitar o deshabilitar las ubicaciones de escritura múltiple.enable_free_tier
: Habilitar o deshabilitar la capa gratuita.minimal_tls_version
: La versión mínima de TLS para el Cosmos DB account.total_throughput_limit
: El límite total de rendimiento para el Cosmos DB account.geo_location
: La ubicación geográfica y la prioridad de failover para la cuenta de CosmosDB.capabilities_name
: El nombre de la capacidad para el Cosmos DB account.backup_type
: El tipo de copia de seguridad para el Cosmos DB account (Periodic
oContinuous
).backup_tier
: El nivel de copia de seguridad para el Cosmos DB account (Continuous7Days
,Continuous30Days
oContinuous
).consistency_policy
: El nivel de consistencia para el Cosmos DB account (Eventual
,Session
,Strong
,BoundedStaleness
oConsistentPrefix
).
Implementación del módulo
Para ejecutar este módulo, sigue estos pasos:
Inicializar Terraform:
Terminal window terraform initEste comando inicializa el directorio de trabajo con los archivos de configuración de Terraform.
Previsualizar los cambios que se van a aplicar:
Terminal window terraform planEste comando genera un plan de ejecución, que muestra los cambios que Terraform aplicará en tu infraestructura.
Aplicar los cambios:
Terminal window terraform applyEste comando aplica los cambios necesarios para alcanzar el estado deseado de la configuración descrita en los archivos de Terraform.
Salidas
Después de aplicar los cambios, Terraform te proporcionará las siguientes salidas:
cosmosdb_id
: El ID de la cuenta de Cosmos DB creada.cosmosdb_name
: El nombre de la cuenta de Cosmos DB creada.
Estas salidas pueden ser utilizadas en otros módulos o scripts para integrar la cuenta de Cosmos DB con otras partes de tu infraestructura.