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

  • Imagen de redactor Daniel J. Saldaña
  • 25 de junio de 2024
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:

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:

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:

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:

    Terminal window
    terraform init

    Este comando inicializa el directorio de trabajo con los archivos de configuración de Terraform.

  2. Previsualizar los cambios que se van a aplicar:

    Terminal window
    terraform plan

    Este comando genera un plan de ejecución, que muestra los cambios que Terraform aplicará en tu infraestructura.

  3. Aplicar los cambios:

    Terminal window
    terraform apply

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

¡Suscríbete y recibe actualizaciones sobre tecnología, diseño, productividad, programación y mucho más!
0
0