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:
Previsualizar los cambios que se van a aplicar:
Aplicar los cambios:
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.