Despliegue de Key Vault en Azure con Terraform y Terragrunt

Introducción

En este proyecto, se presenta una estructura organizada para el despliegue de una infraestructura en Azure utilizando Terraform y Terragrunt. La solución facilita la creación y gestión de recursos de Azure Key Vault, optimizando la reutilización de configuraciones entre diferentes entornos, como desarrollo y producción, mediante archivos de configuración bien estructurados.

La estructura del proyecto permite una implementación modular y reutilizable, separando la configuración de los entornos específicos de los archivos de despliegue principales. Terraform y Terragrunt ofrecen un enfoque robusto para gestionar el estado y las variables comunes y específicas por entorno, facilitando así la administración y escalabilidad de la infraestructura en entornos empresariales.

Estructura del Proyecto

La organización del proyecto es la siguiente:

├── env
│   ├── code
│   │   └── keyvault
│   │       └── 00
│   │           ├── backend.tf
│   │           ├── data.tf
│   │           ├── endpoint.tf
│   │           ├── locals.tf
│   │           ├── main.tf
│   │           ├── outputs.tf
│   │           ├── provider.tf
│   │           └── variables.tf
│   └── dev
│       ├── keyvault
│       │   └── 00
│       │       ├── terragrunt.hcl
│       │       └── vars.tfvars
│       └── varEnvironment.hcl
├── varCommon.hcl
└── varDataState.hcl

La carpeta env contiene la configuración específica del entorno, mientras que code alberga los archivos de configuración de Terraform para el despliegue de Key Vault. La carpeta dev contiene archivos de configuración específicos del entorno de desarrollo. terragrunt.hclvarCommon.hcl y varDataState.hcl son archivos de configuración para Terragrunt y variables comunes.

Configuración de Terraform

Ahora, profundicemos en los archivos de configuración de Terraform necesarios para desplegar Key Vault.

backend.tf

 

terraform {
  backend "azurerm" {
  }
  required_version = "~>0.14"
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "3.47.0"
    }
  }
}

data.tf

El archivo data.tf contiene bloques de datos que permiten a Terraform acceder a la información de recursos existentes en Azure. Estos bloques son fundamentales para reutilizar la infraestructura existente y garantizar que los nuevos recursos se implementen de manera coherente.

data "terraform_remote_state" "rg" {
  #count   = var.terraform_remote_state_route53 ? 1 : 0
  backend = "azurerm"
  config = {
    subscription_id             = var.lz_subscription_id
    resource_group_name         = var.lz_resource_group_name    
    storage_account_name        = var.lz_storage_account_name
    container_name              = var.lz_container_name
    key                         = "${var.ProjectName}/${var.ServiceName}/env/${var.Environment}/${var.mapProjectPathKey.rg}/terraform.tfstate"
  }
}

data "azurerm_subnet" "sbn_data" {
  name                 = var.sbn_data_net_name
  virtual_network_name = var.vnet_net_name
  resource_group_name  = var.rg_net_name
}

data "azurerm_private_dns_zone" "zone_01" {
  provider            = azurerm.hub
  name                = var.private_dns_zone_name_keyvault
  resource_group_name = var.hub_resource_group_name
}
endpoint.tf
resource "azurerm_private_endpoint" "pren_01" {
  name                = upper(join("-", [ var.Environment, var.BussinessUnit, var.Provider, var.ServiceName, "kv-pren-01"])) #local.private_endpoint_name_01
  resource_group_name = data.terraform_remote_state.rg.outputs.name
  location            = var.region
  subnet_id           = data.azurerm_subnet.sbn_data.id

  private_service_connection {
    name                           = upper(join("-", [ var.Environment, var.BussinessUnit, var.Provider, var.ServiceName, "kv-pren-01"]))
    private_connection_resource_id = azurerm_key_vault.keyvault.id
    is_manual_connection           = false
    subresource_names              = ["vault"]
  }

  private_dns_zone_group {
    name                 = data.azurerm_private_dns_zone.zone_01.name
    private_dns_zone_ids = [data.azurerm_private_dns_zone.zone_01.id]
  }

  tags = local.tags

  lifecycle {
    ignore_changes = [
      tags["CreationDate"]
    ]
  }
}

Explicación:

  1. data "terraform_remote_state" "rg":
    • Permite acceder al estado remoto de Terraform en el que se encuentra la definición del Resource Group (rg).
    • backend: Especifica el backend de Azure (azurerm) donde se almacena el estado.
    • config: Define los parámetros necesarios para acceder al estado remoto:
      • subscription_id, resource_group_name, storage_account_name, container_name: Datos de conexión a la cuenta de almacenamiento donde se guarda el estado.
      • key: Ruta completa en el almacenamiento para el archivo terraform.tfstate.
  2. data "azurerm_subnet" "sbn_data":
    • Proporciona información sobre una subred específica, necesaria para conectar un Private Endpoint.
    • name: Nombre de la subred de destino.
    • virtual_network_name: Nombre de la red virtual a la que pertenece la subred.
    • resource_group_name: Nombre del grupo de recursos donde se encuentra la red virtual.
  3. data "azurerm_private_dns_zone" "zone_01":
    • Obtiene detalles de una zona DNS privada que permitirá resolver nombres para el Private Endpoint.
    • provider: Especifica el proveedor de Azure, en este caso, la región o hub.
    • name: Nombre de la zona DNS privada asociada al Key Vault.
    • resource_group_name: Grupo de recursos donde se encuentra esta zona DNS privada.

endpoint.tf

Este archivo define el recurso de Private Endpoint, permitiendo la conexión privada al Key Vault. Este Private Endpoint se asocia a la subred y la zona DNS privada especificadas.

Código:

resource "azurerm_private_endpoint" "pren_01" {
name = upper(join("-", [ var.Environment, var.BussinessUnit, var.Provider, var.ServiceName, "kv-pren-01"]))
resource_group_name = data.terraform_remote_state.rg.outputs.name
location = var.region
subnet_id = data.azurerm_subnet.sbn_data.id

private_service_connection {
name = upper(join("-", [ var.Environment, var.BussinessUnit, var.Provider, var.ServiceName, "kv-pren-01"]))
private_connection_resource_id = azurerm_key_vault.keyvault.id
is_manual_connection = false
subresource_names = ["vault"]
}

private_dns_zone_group {
name = data.azurerm_private_dns_zone.zone_01.name
private_dns_zone_ids = [data.azurerm_private_dns_zone.zone_01.id]
}

tags = local.tags

lifecycle {
ignore_changes = [
tags["CreationDate"]
]
}
}

Explicación:

  1. resource "azurerm_private_endpoint" "pren_01":
    • Este recurso define un Private Endpoint que permite una conexión segura y privada al Key Vault en Azure.
    • name: Nombre del Private Endpoint, generado dinámicamente usando varias variables (Environment, BussinessUnit, Provider, ServiceName), según el entorno y la unidad de negocio.
    • resource_group_name: Grupo de recursos donde se crea el Private Endpoint, usando el valor obtenido en terraform_remote_state.
    • location: Especifica la región para el endpoint.
    • subnet_id: ID de la subred donde se aloja el Private Endpoint, usando el valor de azurerm_subnet.sbn_data.id.
  2. Bloque private_service_connection:
    • Configura la conexión privada al Key Vault.
    • name: Nombre de la conexión privada, en el mismo formato que el nombre del Private Endpoint.
    • private_connection_resource_id: ID del Key Vault al que se conecta el endpoint.
    • is_manual_connection: Establecido en false, indicando que la conexión no es manual.
    • subresource_names: Define el subrecurso específico del Key Vault (en este caso, vault).
  3. Bloque private_dns_zone_group:
    • Define la asociación de la zona DNS privada al Private Endpoint.
    • name: Nombre de la zona DNS, obtenido de azurerm_private_dns_zone.zone_01.
    • private_dns_zone_ids: Lista de IDs de las zonas DNS privadas asociadas, utilizando el ID obtenido en azurerm_private_dns_zone.zone_01.
  4. tags:
    • Aplica etiquetas definidas en local.tags para la organización del recurso.
  5. Bloque lifecycle:
    • Define que se ignore cualquier cambio en la etiqueta CreationDate, evitando que Terraform intente modificar el recurso si solo cambia esa etiqueta.

locals.tf

El archivo locals.tf define variables locales que pueden ser reutilizadas en múltiples partes del código Terraform. Las variables locales son útiles para centralizar valores que se utilizan en varios recursos, mejorando la claridad y mantenibilidad del código.

locals {
  tags = var.tags
}

Explicación:

  • locals: Este bloque crea una variable local llamada tags, que almacena el valor de var.tags.
  • tags: Al asignar var.tags a local.tags, se facilita el acceso a las etiquetas en distintos recursos sin tener que referenciar var.tags directamente cada vez. Esto es especialmente útil si var.tags se utiliza en múltiples archivos o recursos, ya que permite cambiar las etiquetas en un solo lugar si fuera necesario en el futuro.

main.tf

En el archivo main.tf se definen los principales recursos de la infraestructura. En este caso, se está creando un recurso de Azure Key Vault que servirá para almacenar secretos y otros valores sensibles, asegurando así la seguridad de la información.

resource "azurerm_key_vault" "keyvault" {
  name                        = upper(join("-", [ var.Environment, var.BussinessUnit, var.Provider, var.ServiceName, "kv-01"]))
  location                    = var.region
  tenant_id                   = var.Tenant
  resource_group_name         = data.terraform_remote_state.rg.outputs.name
  enabled_for_disk_encryption = var.kv_enabled_for_disk_encryption
  soft_delete_retention_days  = var.kv_soft_delete_retention_days
  purge_protection_enabled    = var.kv_purgue_protection_enabled
  public_network_access_enabled = false
  sku_name = var.kv_sku_name

  lifecycle {
      ignore_changes = [
        tags["CreationDate"]
      ]
    }
}

Explicación:

  • resource "azurerm_key_vault" "keyvault": Este bloque define un recurso de tipo azurerm_key_vault (Azure Key Vault) en Terraform. keyvault es el identificador del recurso en Terraform, utilizado para referenciarlo en otras partes del código.

  • name: Utiliza una función upper(join("-", [...])) para construir el nombre del Key Vault, combinando variables (var.Environment, var.BussinessUnit, var.Provider, var.ServiceName) para generar un nombre único y estandarizado, asegurando consistencia y fácil identificación del recurso.

  • location: Define la ubicación geográfica del recurso, especificada por var.region.

  • tenant_id: ID del inquilino de Azure, definido en var.Tenant, necesario para vincular el Key Vault con el directorio de Azure AD adecuado.

  • resource_group_name: Nombre del grupo de recursos en el que se ubicará el Key Vault, en este caso obtenido de data.terraform_remote_state.rg.outputs.name, el cual referencia el estado remoto de Terraform donde se almacena la configuración de este recurso.

  • enabled_for_disk_encryption: Determina si el Key Vault puede ser utilizado para cifrar discos de VM en Azure. Su valor proviene de var.kv_enabled_for_disk_encryption.

  • soft_delete_retention_days: Número de días que los elementos eliminados en el Key Vault serán retenidos antes de su eliminación definitiva, definido en var.kv_soft_delete_retention_days.

  • purge_protection_enabled: Si está activado, evita la eliminación permanente accidental del Key Vault. Su valor es asignado mediante var.kv_purgue_protection_enabled.

  • public_network_access_enabled: Establecido en false para desactivar el acceso desde redes públicas, aumentando la seguridad del recurso al restringir el acceso a redes privadas.

  • sku_name: Define el nivel de servicio o SKU del Key Vault, especificado en var.kv_sku_name, que puede ser standard o premium.

  • lifecycle: Define configuraciones de ciclo de vida para el recurso en Terraform. Aquí se utiliza ignore_changes para evitar que Terraform aplique cambios en la etiqueta CreationDate, permitiendo que dicho valor permanezca inalterado incluso si cambia el valor de tags["CreationDate"].

provider.tf

En el archivo provider.tf se configuran los proveedores de infraestructura, en este caso el proveedor de Azure (azurerm). Aquí se definen dos configuraciones para el proveedor de Azure, una por defecto y otra con un alias. Esto permite trabajar con múltiples suscripciones de Azure dentro del mismo proyecto Terraform


provider "azurerm" {
  subscription_id = var.Subscription
  tenant_id       = var.Tenant
  features {}
}

provider "azurerm" {
  alias           = "hub"
  subscription_id = var.subscription_hub_id
  tenant_id       = var.Tenant
  features {}
}

Explicación:

  • Primer bloque provider "azurerm":

    • subscription_id: Esta propiedad define la ID de la suscripción de Azure que se utilizará para aprovisionar y gestionar recursos. Se obtiene de la variable var.Subscription, que debe estar configurada previamente.
    • tenant_id: El ID de tenant de Azure Active Directory al que se debe asociar el proveedor de Azure. En este caso, se toma de var.Tenant.
    • features {}: Un bloque requerido por el proveedor de Azure (azurerm) que puede contener configuraciones adicionales. Aunque en este caso está vacío, es necesario para inicializar correctamente el proveedor.
  • Segundo bloque provider "azurerm" con alias hub:

    • alias: El alias "hub" permite crear un segundo proveedor de Azure dentro de la misma configuración de Terraform, lo cual es útil cuando se necesitan trabajar con múltiples suscripciones. Al asignar un alias, se puede referenciar este proveedor específico más adelante en los recursos o datos, de forma que se pueda diferenciar del proveedor predeterminado.
    • subscription_id: Similar al primer bloque, esta propiedad se define a través de var.subscription_hub_id, que representa la ID de la suscripción de Azure para la configuración del «hub».
    • tenant_id: El ID de tenant sigue siendo el mismo y se toma de var.Tenant para mantener la consistencia en el entorno.
    • features {}: Al igual que el primer bloque, este bloque es necesario aunque no contenga configuraciones adicionales.

variables.tf

En el archivo variables.tf se definen todas las variables utilizadas a lo largo de la infraestructura de Terraform. Este archivo centraliza los parámetros configurables que pueden cambiar dependiendo del entorno, la suscripción, el nombre de recursos, etc. Esto permite la reutilización del código y facilita su gestión.


######################
# VARIABLES COMUNES  #
######################

variable "lz_subscription_id" {
  type        = string
  description = "ID de la susbcriptcion de los tfstate"
  default     = ""
}

variable "lz_resource_group_name" {
  type        = string
  description = "Nombre del resoruce group de los tfstate"
  default     = ""
}

variable "lz_storage_account_name" {
  type        = string
  description = "Nombre del storage account de los tfstate"
  default     = ""
}

variable "lz_container_name" {
  type        = string
  description = "Nombre del container name de los tfstate"
  default     = ""
}

variable "Tenant" {
  type        = string
  description = "Nombre del tenant"
  default     = ""
}

variable "Subscription" {
  type        = string
  description = "Nombre de la subscripcion"
  default     = ""
}

variable "Provider" {
  type        = string
  description = "Nombre del Provider cloud"
  default     = ""
}

variable "Environment" {
  type        = string
  description = "(Required) Specifies the Environment where the Resources should exist."
  default     = ""
}

variable "BussinessUnit" {
  type        = string
  description = "(Required) Bussiness Unit."
  default     = ""
}

variable "ProjectName" {
  type        = string
  description = "(Required) ProjectName."
  default     = ""
}

variable "ServiceName" {
  type        = string
  description = "(Required) ServiceName."
  default     = ""
}

variable "EntityName" {
  type        = string
  description = "(Required) Entity."
  default     = ""
}

variable "mapProjectPathKey" {
  type        = map(string)
  default     = {}
  description = "Mapa de rutas de los elementos"
}

variable "region" {
  type        = string
  description = "(Required) Region Name"
  default     = ""
}

variable "subscription_hub_id" {
  type    = string
  default = ""
  description = "Nombre de la subscripcion de HUB"
}

variable "hub_resource_group_name" {
  type    = string
  default = ""
  description = "Nombre del resource group de HUB"
}
#############################
# VARIABLES Keyvault #
#############################

variable "private_dns_zone_name_keyvault" {
  type        = string
  description = "Nombre del private dns zone name"
  default     = ""
}

variable "rg_net_name" {
  type        = string
  description = "Name rg of net"
  default = ""
}

variable "vnet_net_name" {
  type        = string
  description = "Name of vnet of net"
  default = ""
}

variable "sbn_data_net_name" {
  type        = string
  description = "Name of Subnet Data of net"
  default = ""
}
variable "kv_enabled_for_disk_encryption" {
  type        = string
  description = ""
  default = ""
}
variable "kv_purgue_protection_enabled" {
  type        = string
  description = ""
  default = ""
}
variable "kv_sku_name" {
  type        = string
  description = ""
  default = ""
}
variable "kv_soft_delete_retention_days" {
  type        = string
  description = ""
  default = ""
}

######################
#   VARIABLE TAGS    #
######################

variable "tags" {
  type        = map(string)
  default     = {}
  description = "(Optional) A mapping of tags which should be assigned to the Resource Group."
}

Explicación:

Variables comunes:

Estas variables contienen información general sobre la infraestructura y la configuración del proyecto.

  1. lz_subscription_id: ID de la suscripción de Azure utilizada para almacenar el estado remoto (tfstate).
  2. lz_resource_group_name: Nombre del grupo de recursos donde se almacena el estado remoto de Terraform.
  3. lz_storage_account_name: Nombre de la cuenta de almacenamiento que aloja el archivo de estado remoto.
  4. lz_container_name: Nombre del contenedor dentro del almacenamiento donde se encuentra el estado de Terraform.
  5. Tenant: ID del tenant de Azure Active Directory (AAD).
  6. Subscription: ID de la suscripción de Azure que se usará para crear recursos.
  7. Provider: Nombre del proveedor de nube (por ejemplo, Azure).
  8. Environment: El entorno donde se deben desplegar los recursos (ej. dev, prod).
  9. BussinessUnit: La unidad de negocio relacionada con el proyecto.
  10. ProjectName: Nombre del proyecto para etiquetar y organizar los recursos.
  11. ServiceName: Nombre del servicio que se está desplegando.
  12. EntityName: Nombre de la entidad que está siendo gestionada.
  13. mapProjectPathKey: Mapa que contiene rutas específicas a elementos dentro del proyecto.
  14. region: La región geográfica de Azure donde se crearán los recursos.
  15. subscription_hub_id: ID de la suscripción que se utilizará para la infraestructura de hub.
  16. hub_resource_group_name: Nombre del grupo de recursos para la infraestructura de hub.

Variables de KeyVault:

Este bloque define variables relacionadas específicamente con Azure Key Vault y su configuración.

  1. private_dns_zone_name_keyvault: Nombre de la zona DNS privada para el Key Vault.
  2. rg_net_name: Nombre del grupo de recursos de la red.
  3. vnet_net_name: Nombre de la red virtual (VNet).
  4. sbn_data_net_name: Nombre de la subred de datos.
  5. kv_enabled_for_disk_encryption: Configuración de si el Key Vault debe ser habilitado para la encriptación de discos.
  6. kv_purgue_protection_enabled: Configuración para proteger el Key Vault contra la purga.
  7. kv_sku_name: Nombre del SKU para el Key Vault.
  8. kv_soft_delete_retention_days: Número de días que se mantendrá el Key Vault en estado de eliminación suave.

Variable Tags:

Esta variable define un conjunto de etiquetas (tags) que se pueden asignar a los recursos de Azure, para facilitar su organización, facturación y gestión.

terragrunt.hcl

El archivo terragrunt.hcl que proporcionas configura un entorno para gestionar infraestructura utilizando Terragrunt, que es una herramienta para gestionar configuraciones de Terraform de manera modular. Aquí está un desglose detallado de lo que hace este archivo:


dependencies {
  paths = [
    "../../rg/00/"
  ]
}

include "varEnvironment" {
  path = find_in_parent_folders("varEnvironment.hcl")
  expose = true
}

include "varCommon" {
  path = find_in_parent_folders("varCommon.hcl")
  expose = true
}

include "varDataState" {
  path = find_in_parent_folders("varDataState.hcl")
  expose = true
}

locals {
  #acm = yamldecode(file(find_in_parent_folders("config.yaml"))).dataAcm
  mapProjectPathKey = jsonencode(include.varEnvironment.inputs.mapProjectPathKey)
  tags = jsonencode(merge({
    Managed_By = "Terraform"
    Provider = "AZR"
  },
  include.varCommon.inputs.globalTags,
  include.varEnvironment.inputs.environmentTags
  ))
}


generate "backend"{
  path      = "backend.tfvars"
  if_exists = "overwrite" # "overwrite" "skip" "overwrite_terragrunt" 
  contents = <<EOF
subscription_id = "${include.varDataState.inputs.lz_subscription_id}"
key = "${include.varCommon.inputs.ProjectName}/${include.varCommon.inputs.ServiceName}/${get_path_from_repo_root()}/terraform.tfstate"
resource_group_name = "${include.varDataState.inputs.lz_resource_group_name}"
storage_account_name =  "${include.varDataState.inputs.lz_storage_account_name}"
container_name = "${include.varDataState.inputs.lz_container_name}"
EOF
}


generate "vars"{
  path      = "vars.tfvars"
  if_exists = "overwrite" #"skip" #"overwrite_terragrunt"
  contents = <<EOF
###############################
#    VALORES DATA DataState     #
###############################
lz_subscription_id             = "${include.varDataState.inputs.lz_subscription_id}"
lz_resource_group_name         = "${include.varDataState.inputs.lz_resource_group_name}"
lz_storage_account_name        = "${include.varDataState.inputs.lz_storage_account_name}"
lz_container_name              = "${include.varDataState.inputs.lz_container_name}"

###############################
#     VALORES GENERALES       #
###############################
region  = "${include.varEnvironment.inputs.region}"
Environment = "${include.varEnvironment.inputs.Environment}"
BussinessUnit = "${include.varCommon.inputs.BussinessUnit}"
ProjectName = "${include.varCommon.inputs.ProjectName}"
ServiceName = "${include.varCommon.inputs.ServiceName}"
EntityName = "${include.varCommon.inputs.EntityName}"
Subscription = "${include.varEnvironment.inputs.Subscription}"
Tenant = "${include.varCommon.inputs.Tenant}"
# ApplicationName = null
mapProjectPathKey = ${local.mapProjectPathKey}
subscription_hub_id = "${include.varEnvironment.inputs.subscription_hub_id}"
hub_resource_group_name = "${include.varEnvironment.inputs.hub_resource_group_name}"
private_dns_zone_name_keyvault = "${include.varEnvironment.inputs.private_dns_zone_name_keyvault}"

###################################
# Valores Keyvault #
###################################

kv_enabled_for_disk_encryption = "true"
kv_soft_delete_retention_days = "7"
kv_purgue_protection_enabled = "true"
kv_sku_name = "standard"


###########################
#       VALORES TAGS      #
###########################

tags = ${local.tags}

EOF
}

terraform {
  source = "../../..//code/keyvault/00/"

  before_hook "print_tags" {
    commands = ["plan", "apply"] #["${get_terraform_commands_that_need_vars()}"]
    execute  = ["echo", "tags", "=", "${local.tags}", ">", "vars.tfvars"]
  }

  before_hook "copy_vars" {
    commands = ["plan", "apply"] #["${get_terraform_commands_that_need_vars()}"]
    execute  = ["cp", "-f", "vars.tfvars", "${get_original_terragrunt_dir()}/vars.tfvars"]
  }

  extra_arguments "backend_vars" {
    commands = ["init"]
    arguments = [
      "-backend-config=backend.tfvars"
    ]
  }
  extra_arguments "vars_vars" {
    commands = ["plan", "apply", "destroy", "import"]

    arguments = [
      "-var-file=vars.tfvars"
    ]
  }
}

Explicación:

  • dependencies: Este bloque define las dependencias del Terragrunt. En este caso, no se especifican rutas de dependencias, ya que el bloque paths está vacío.
  • include: Estos bloques incluyen archivos de variables externos (varEnvironment.hclvarCommon.hclvarDataState.hcl) en el Terragrunt. Los archivos incluidos pueden exponer sus variables para ser utilizadas en este archivo Terragrunt.
  • locals: Este bloque define variables locales que se utilizan dentro de este archivo Terragrunt.
  • mapProjectPathKey: Codifica como JSON el mapa mapProjectPathKey del archivo varEnvironment.hcl.
  • tags: Codifica como JSON un conjunto de etiquetas combinando un conjunto fijo de etiquetas (Managed_By y Provider), las etiquetas globales definidas en varCommon.hcl y las etiquetas específicas del entorno definidas en varEnvironment.hcl.
  • generate "backend": Este bloque genera un archivo llamado backend.tfvars. Este archivo se utiliza para configurar el backend de Terraform. Contiene variables como subscription_idkeyresource_group_namestorage_account_name, y container_name. Los valores de estas variables se obtienen de los archivos incluidos (varDataState.hcl y varCommon.hcl).
  • generate "vars": Este bloque genera un archivo llamado vars.tfvars. Este archivo se utiliza para proporcionar valores de variables a Terraform. Contiene valores para las variables específicas definidas en los archivos incluidos (varDataState.hclvarCommon.hclvarEnvironment.hcl). Los valores se interpolan a partir de las variables incluidas.
  • terraform: Este bloque proporciona configuraciones adicionales para Terraform.
  • source: Especifica la ruta de origen del módulo de Terraform. En este caso, el origen se establece en un directorio relativo ../../..//code/rg/00/.
  • before_hook: Este bloque define ganchos de ejecución que se ejecutarán antes de ciertos comandos de Terraform, como plan y apply. En este caso, se ejecutan dos ganchos: print_tags y copy_vars.
  • extra_arguments: Este bloque especifica argumentos adicionales que se pasarán a los comandos de Terraform (initplanapplydestroyimport). En este caso, se especifican argumentos adicionales para la configuración del backend (backend_vars) y para las variables (vars_vars).

 

vars.tfvars

Este archivo vars.tfvars contiene los valores de configuración que se utilizarán en los módulos de Terraform para configurar los recursos en Azure. Aquí te explico los bloques y valores clave presentes en el archivo:



###############################
#    VALORES DATA DataState     #
###############################
lz_subscription_id             = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
lz_resource_group_name         = "PRO-HUB-01"
lz_storage_account_name        = "keyvault"
lz_container_name              = "keyvault"

###############################
#     VALORES GENERALES       #
###############################
region  = "northeurope"
Environment = "dev"
BussinessUnit = "ag"
ProjectName = "infa"
ServiceName = "infa"
EntityName = "RO"
Subscription = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
Tenant = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
# ApplicationName = null
mapProjectPathKey = {"keyvault":"keyvault/00","rg":"rg/00","sbn00":"networking/sbn/sbn00","sbnVint00":"networking/sbn/vint00"}
subscription_hub_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
hub_resource_group_name = "PRO-NWHUB-RGP-01"
private_dns_zone_name_keyvault = "privatelink.vaultcore.azure.net"

###################################
# Valores Keyvault #
###################################

kv_enabled_for_disk_encryption = "true"
kv_soft_delete_retention_days = "7"
kv_purgue_protection_enabled = "true"
kv_sku_name = "standard"

Explicación:

1. Valores Data State (DataState)

Estos valores están relacionados con la configuración del estado de los datos y la infraestructura básica en Azure.

  • lz_subscription_id: El ID de la suscripción de Azure donde se gestionarán los recursos. Es un identificador único para la suscripción en Azure.
  • lz_resource_group_name: El nombre del grupo de recursos de Azure donde se agruparán los recursos relacionados con este proyecto.
  • lz_storage_account_name: El nombre de la cuenta de almacenamiento de Azure utilizada para almacenar el estado de Terraform u otros datos persistentes.
  • lz_container_name: El nombre del contenedor dentro de la cuenta de almacenamiento donde se almacenan los datos de Terraform o el estado de recursos.

2. Valores Generales

Este bloque define parámetros generales que se utilizan para caracterizar el entorno y los recursos de la infraestructura.

  • region: La región de Azure donde se desplegarán los recursos. En este caso, «northeurope» se especifica como la región en la que se creará la infraestructura.
  • Environment: Define el entorno de trabajo, en este caso «dev» (desarrollo).
  • BussinessUnit: La unidad de negocio asociada con este proyecto, en este caso «ag» (puede referirse a una abreviatura del nombre de la unidad).
  • ProjectName: El nombre del proyecto, que en este caso es «infa».
  • ServiceName: El nombre del servicio relacionado con el proyecto, aquí también es «infa».
  • EntityName: El nombre de la entidad a la que pertenece el servicio o proyecto, que es «RO».
  • Subscription: El ID de la suscripción de Azure donde se gestionan los recursos, similar a lz_subscription_id.
  • Tenant: El ID del tenant de Azure, que es el identificador único para el directorio de Azure Active Directory.
  • mapProjectPathKey: Un mapa JSON que asocia nombres clave a rutas de proyectos o módulos dentro del repositorio, facilitando la referencia de los distintos recursos en la infraestructura.
  • subscription_hub_id: El ID de la suscripción de Azure para el hub de red, utilizado para el despliegue de recursos de red.
  • hub_resource_group_name: El nombre del grupo de recursos para el hub de red.
  • private_dns_zone_name_keyvault: El nombre de la zona DNS privada utilizada por el KeyVault para habilitar la conectividad privada.

3. Valores de KeyVault

Este bloque contiene configuraciones específicas para el recurso de KeyVault en Azure.

  • kv_enabled_for_disk_encryption: Indica si KeyVault está habilitado para el cifrado de discos, en este caso está configurado a «true».
  • kv_soft_delete_retention_days: Define cuántos días se conservarán los datos eliminados de manera suave (soft delete) antes de ser eliminados permanentemente. En este caso, son 7 días.
  • kv_purgue_protection_enabled: Activa o desactiva la protección contra purga en KeyVault. Aquí está configurado a «true», lo que significa que los secretos eliminados no pueden ser purgados hasta que se cumplan ciertas condiciones.
  • kv_sku_name: Define el SKU (Stock Keeping Unit) de KeyVault. En este caso, se especifica el SKU «standard», que es una opción estándar para KeyVault.

varEnvironment.hcl

locals {
  subscription_hub_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  hub_resource_group_name = "PRO-NWHUB-RGP-01"
  region = "northeurope"
  Subscription = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  Environment = "dev"
  rg_net_name = "DEV-REDORBITA-RG-01"
  vnet_net_name = "DEV-REDORBITA-NET-01"
  subnet_name  = "DEV-REDORBITA-SBN-01"
  mapProjectPathKey = {
    rg = "rg/00"
    sbn00 = "networking/sbn/sbn00"
  }
}

inputs = {
    ##############################
    #   VARIABLES Environment    #
    ##############################
    subscription_hub_id = local.subscription_hub_id
    hub_resource_group_name = local.hub_resource_group_name
    vnet_net_name = local.vnet_net_name
    subnet_name = local.subnet_name
    rg_net_name = local.rg_net_name
    Subscription = local.Subscription
    region = local.region
    #profile = local.profile
    Environment = local.Environment
    environmentTags = {
        Enviroment         = "${upper(local.Environment)}"
      }
    mapProjectPathKey = local.mapProjectPathKey
}

Explicación:

Variables Locales (locals):

  • Se definen variables que pueden ser utilizadas en todo el archivo. Esto incluye identificadores de suscripción, nombres de grupos de recursos, configuraciones de red y más.
  • Identificadores de Suscripciónsubscription_hub_id y Subscription son críticos para la autenticación y la gestión de recursos en Azure.
  • Nombres de Recursos: Los nombres de grupos de recursos, redes virtuales y subredes se establecen para facilitar la gestión y referencia en el código.
  • Mapas de ProyectomapProjectPathKey permite definir rutas de acceso a diferentes componentes de la infraestructura, lo que puede facilitar la reutilización de código y la navegación en el proyecto.

Entradas (inputs):

  • Se define un mapa de entradas que se utilizarán en los módulos de Terraform. Cada entrada corresponde a una variable local, lo que permite que los módulos reciban valores configurados de manera centralizada.
  • Etiquetas del EntornoenvironmentTags se utiliza para definir etiquetas que se aplicarán a los recursos. Las etiquetas son útiles para la clasificación, gestión y facturación de recursos en Azure.

varCommon.hcl

Este archivo varCommon.hcl contiene variables locales y de entrada que se utilizan en el proyecto Terraform para configurar la infraestructura y proporcionar información común que se puede reutilizar en diferentes módulos y recursos. A continuación, te explico cada parte de este archivo:


locals {
  #common_vars = yamldecode(file(find_in_parent_folders("config.yaml")))
  EntityName              = "RO"
  ProjectName             = "RedOrbita"
  ServiceName             = "RedOrbita"
  BussinessUnit           = "XX"
  Subscription            = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  Tenant                  = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  Provider                = "azr"
  required_version = "~>0.14"
  globalTags = {
      Company             = "Red-Orbita"
      Owner               = "xxxx@redorbita.com"
      ProjectName         = "XXXX"
      "Service Description" = "XXXX"
      Status              = "Implementacion"
      Provider            = "Azure"
      Cluster             = "N/A"
      "Operating System"  = "N/A"
      Temporal            = "NO"
      "App ID"              = "N/A"
    }
  storage_account          = "protfdata"
  container_name           = "iasearch" 
  subscription_hub_id2     = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  location                 = "northeurope"
}



inputs = {
  ##############################
  #  VARIABLES COMMON          #
  ##############################

  EntityName              = local.EntityName
  ProjectName             = local.ProjectName
  ServiceName             = local.ServiceName
  BussinessUnit           = local.BussinessUnit
  Subscription            = local.Subscription
  Tenant                  = local.Tenant
  Provider                = local.Provider
  required_version        = local.required_version
  globalTags              = local.globalTags
}



inputs = {
  ##############################
  #  VARIABLES COMMON          #
  ##############################

  EntityName              = local.EntityName
  ProjectName             = local.ProjectName
  ServiceName             = local.ServiceName
  BussinessUnit           = local.BussinessUnit
  # Subscription            = local.Subscription
  # Subscription_pro        = local.Subscription_pro
  Tenant                  = local.Tenant
  Provider                = local.Provider
  required_version        = local.required_version
  id_project              = local.id_project
  globalTags              = local.globalTags
}

1. Bloque locals

El bloque locals define variables locales dentro del archivo que pueden ser utilizadas dentro de este mismo archivo o por otros módulos de Terraform. Aquí se encuentran algunas configuraciones clave:

  • EntityName: Define el nombre de la entidad, que en este caso es «RO». Puede referirse a un nombre o identificador para un proyecto o grupo dentro de la organización.
  • ProjectName: El nombre del proyecto, aquí es «RedOrbita». Este es el nombre del proyecto o iniciativa bajo el cual se crean los recursos.
  • ServiceName: El nombre del servicio relacionado con el proyecto, también «RedOrbita». Se refiere al servicio o solución principal que se implementará.
  • BussinessUnit: La unidad de negocio asociada al proyecto, que en este caso es «XX».
  • Subscription: El ID de la suscripción de Azure que se utiliza para crear y gestionar los recursos. Este valor debe ser el identificador único de la suscripción de Azure.
  • Tenant: El ID del tenant de Azure, que es un identificador único del directorio de Azure Active Directory.
  • Provider: El proveedor de infraestructura, en este caso, «azr», que indica que el proveedor es Azure.
  • required_version: La versión requerida de Terraform para ejecutar el archivo, en este caso, «~>0.14», lo que significa que cualquier versión compatible de Terraform 0.14.x es válida.
  • globalTags: Un conjunto de etiquetas globales que se aplican a los recursos de infraestructura. Estas etiquetas incluyen información sobre el proyecto, como el nombre de la empresa, el propietario, el estado del proyecto y otros detalles.
    • Company: El nombre de la empresa asociada, «Red-Orbita».
    • Owner: La dirección de correo electrónico del propietario del proyecto.
    • ProjectName: Un nombre genérico para el proyecto.
    • Service Description: La descripción del servicio asociado.
    • Status: El estado del proyecto, que en este caso es «Implementación».
    • Provider: El proveedor de la infraestructura, «Azure».
    • Cluster: Se define como «N/A», lo que sugiere que no se está utilizando un clúster.
    • Operating System: También se define como «N/A», posiblemente indicando que el sistema operativo no se especifica.
    • Temporal: Indicador de si el proyecto es temporal o no, en este caso «NO».
    • App ID: Se establece como «N/A», lo que indica que no se está utilizando un ID de aplicación.
  • storage_account: El nombre de la cuenta de almacenamiento de Azure que se utilizará, en este caso «protfdata».
  • container_name: El nombre del contenedor dentro de la cuenta de almacenamiento, que es «iasearch».
  • subscription_hub_id2: Otro ID de suscripción para el hub de red, lo que sugiere que se está utilizando más de una suscripción en la infraestructura.
  • location: Define la región de Azure donde se desplegarán los recursos, en este caso «northeurope».

2. Bloque inputs

El bloque inputs define las variables que se pasarán a otros módulos de Terraform o archivos de configuración. En este archivo se repiten dos bloques inputs, pero no es necesario definir las mismas variables dos veces. Aquí se describe la configuración del primer bloque inputs:

  • EntityName: Se asigna la variable EntityName del bloque locals.
  • ProjectName: Se asigna la variable ProjectName del bloque locals.
  • ServiceName: Se asigna la variable ServiceName del bloque locals.
  • BussinessUnit: Se asigna la variable BussinessUnit del bloque locals.
  • Subscription: Este valor está comentado, lo que indica que esta variable no se está utilizando activamente.
  • Tenant: Se asigna la variable Tenant del bloque locals.
  • Provider: Se asigna la variable Provider del bloque locals.
  • required_version: Se asigna la variable required_version del bloque locals.
  • globalTags: Se asigna el conjunto de etiquetas globales definidas en el bloque locals.

El segundo bloque inputs tiene una estructura similar, pero hay algunas diferencias:

  • id_project: Se hace referencia a una variable id_project que no está definida en el bloque locals, lo que sugiere que debería definirse en otro lugar o ser pasada desde otro archivo.

varDataState.hcl

Este archivo varDataState.hcl se utiliza para definir y organizar las variables relacionadas con el estado de los datos y la infraestructura de Terraform en el entorno de trabajo. Este archivo contiene configuraciones para el almacenamiento del estado de Terraform en Azure, lo cual es crucial para el manejo de los recursos de infraestructura y su persistencia. A continuación, se explica el propósito y uso de las configuraciones definidas en este archivo:

locals {
 #common_vars = yamldecode(file(find_in_parent_folders("config.yaml")))
 lz_subscription_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
 lz_resource_group_name = "PRO-HUB-01"
 lz_storage_account_name = "keyvault"
 lz_container_name = "keyvault"
 path_resources_terraform_state = jsonencode({
 rg = "rg/00"

})
}

inputs = {
##############################
# VARIABLES FOR DATA STATES #
##############################
lz_subscription_id = local.lz_subscription_id
lz_resource_group_name = local.lz_resource_group_name
lz_storage_account_name = local.lz_storage_account_name
lz_container_name = local.lz_container_name
path_resources_terraform_state = local.path_resources_terraform_state
}

1. Bloque locals

El bloque locals define variables locales que se utilizarán dentro del archivo y que pueden ser reutilizadas en otras partes del proyecto. Las variables definidas aquí incluyen configuraciones relacionadas con el almacenamiento de datos y la gestión del estado de Terraform:

  • lz_subscription_id: Este es el ID de la suscripción de Azure donde se almacenarán los recursos. Es una variable importante para identificar la suscripción dentro de Azure en la que se crearán los recursos de infraestructura.
  • lz_resource_group_name: Es el nombre del grupo de recursos de Azure que contendrá los recursos para almacenar el estado de Terraform. En este caso, el grupo de recursos se llama «PRO-HUB-01».
  • lz_storage_account_name: El nombre de la cuenta de almacenamiento de Azure que se utilizará para guardar el estado de Terraform. En este archivo se utiliza «keyvault».
  • lz_container_name: El nombre del contenedor dentro de la cuenta de almacenamiento de Azure. En este caso, el contenedor se llama «keyvault».
  • path_resources_terraform_state: Esta variable se utiliza para definir la ruta donde se almacenará el estado de Terraform. En este caso, el valor de esta variable está codificado como un objeto JSON que contiene un campo rg con el valor «rg/00». Este campo indica que el estado se almacenará en una carpeta llamada «rg/00» dentro del almacenamiento configurado.

2. Bloque inputs

El bloque inputs define las variables que se pasarán a otros módulos de Terraform o a configuraciones externas. En este caso, las variables definidas en el bloque locals se exponen a través del bloque inputs, lo que permite que otras configuraciones o módulos puedan hacer uso de ellas:

  • lz_subscription_id: Se asigna el valor de lz_subscription_id definido en el bloque locals. Esta variable indica la suscripción de Azure en la que se gestionará el estado de Terraform.
  • lz_resource_group_name: Se asigna el valor de lz_resource_group_name definido en locals, especificando el grupo de recursos en Azure.
  • lz_storage_account_name: Se asigna el valor de lz_storage_account_name definido en locals, que indica la cuenta de almacenamiento donde se guardará el estado de Terraform.
  • lz_container_name: Se asigna el valor de lz_container_name definido en locals, especificando el contenedor donde se almacenará el estado.
  • path_resources_terraform_state: Se asigna el valor de path_resources_terraform_state definido en locals, que indica la ruta dentro del contenedor donde se guardará el estado de Terraform (en este caso, «rg/00»).

:wq!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *