Guía completa para crear y configurar Azure Cosmos DB con Terraform
Tags: azure, terraform, cosmodb, spanish
Published: 2024-06-25 22:46:50

---
title: Guía completa para crear y configurar Azure Cosmos DB con Terraform
published: true
tags: Azure, Terraform, Cosmodb, Spanish
canonical_url: https://danieljsaldana.dev/guia-completa-para-crear-y-configurar-azure-cosmos-db-con-terraform/
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/706vibmqrkoy156ye3kq.png
---

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.