DEV Community

Cover image for Guía completa para crear y configurar Azure Cosmos DB con Terraform
Daniel J. Saldaña
Daniel J. Saldaña

Posted on • Originally published at danieljsaldana.dev on

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

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
  }
}

Enter fullscreen mode Exit fullscreen mode

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'."
  }
}

Enter fullscreen mode Exit fullscreen mode

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."
}

Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)