Guía completa para crear y configurar Azure Cosmos DB con Terraform



This content originally appeared on DEV Community and was authored by Daniel J. Saldaña

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

  1. 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.
  2. 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.
  3. Escalabilidad Horizontal : Permite escalar el rendimiento y el almacenamiento de manera independiente y automática para manejar cargas variables.
  4. Integración Multimodelo : Soporta múltiples APIs, incluyendo SQL, MongoDB, Cassandra, Gremlin y Table, facilitando la integración con diversas aplicaciones.
  5. 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 o false).
  • 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 o Autoscale).
  • 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 o Continuous).
  • backup_tier: El nivel de copia de seguridad para el Cosmos DB account (Continuous7Days, Continuous30Days o Continuous).
  • consistency_policy: El nivel de consistencia para el Cosmos DB account (Eventual, Session, Strong, BoundedStaleness o ConsistentPrefix).

Implementación del módulo

Para ejecutar este módulo, sigue estos pasos:

  1. Inicializar Terraform:

  2. Previsualizar los cambios que se van a aplicar:

  3. 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.


This content originally appeared on DEV Community and was authored by Daniel J. Saldaña