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.hcl
, varCommon.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:
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 archivoterraform.tfstate
.
- Permite acceder al estado remoto de Terraform en el que se encuentra la definición del Resource Group (
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.
- Proporciona información sobre una subred específica, necesaria para conectar un
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.
- Obtiene detalles de una zona DNS privada que permitirá resolver nombres para el
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:
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 delPrivate 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 elPrivate Endpoint
, usando el valor obtenido enterraform_remote_state
.location
: Especifica la región para el endpoint.subnet_id
: ID de la subred donde se aloja elPrivate Endpoint
, usando el valor deazurerm_subnet.sbn_data.id
.
- Este recurso define un
- 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 delPrivate Endpoint
.private_connection_resource_id
: ID del Key Vault al que se conecta el endpoint.is_manual_connection
: Establecido enfalse
, indicando que la conexión no es manual.subresource_names
: Define el subrecurso específico del Key Vault (en este caso,vault
).
- Bloque
private_dns_zone_group
:- Define la asociación de la zona DNS privada al
Private Endpoint
. name
: Nombre de la zona DNS, obtenido deazurerm_private_dns_zone.zone_01
.private_dns_zone_ids
: Lista de IDs de las zonas DNS privadas asociadas, utilizando el ID obtenido enazurerm_private_dns_zone.zone_01
.
- Define la asociación de la zona DNS privada al
tags
:- Aplica etiquetas definidas en
local.tags
para la organización del recurso.
- Aplica etiquetas definidas en
- Bloque
lifecycle
:- Define que se ignore cualquier cambio en la etiqueta
CreationDate
, evitando que Terraform intente modificar el recurso si solo cambia esa etiqueta.
- Define que se ignore cualquier cambio en la 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 llamadatags
, que almacena el valor devar.tags
.
tags
: Al asignarvar.tags
alocal.tags
, se facilita el acceso a las etiquetas en distintos recursos sin tener que referenciarvar.tags
directamente cada vez. Esto es especialmente útil sivar.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 tipoazurerm_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ónupper(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 porvar.region
. -
tenant_id
: ID del inquilino de Azure, definido envar.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 dedata.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 devar.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 envar.kv_soft_delete_retention_days
. -
purge_protection_enabled
: Si está activado, evita la eliminación permanente accidental del Key Vault. Su valor es asignado mediantevar.kv_purgue_protection_enabled
. -
public_network_access_enabled
: Establecido enfalse
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 envar.kv_sku_name
, que puede serstandard
opremium
. -
lifecycle
: Define configuraciones de ciclo de vida para el recurso en Terraform. Aquí se utilizaignore_changes
para evitar que Terraform aplique cambios en la etiquetaCreationDate
, permitiendo que dicho valor permanezca inalterado incluso si cambia el valor detags["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 variablevar.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 devar.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 aliashub
: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 devar.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 devar.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.
lz_subscription_id
: ID de la suscripción de Azure utilizada para almacenar el estado remoto (tfstate
).lz_resource_group_name
: Nombre del grupo de recursos donde se almacena el estado remoto de Terraform.lz_storage_account_name
: Nombre de la cuenta de almacenamiento que aloja el archivo de estado remoto.lz_container_name
: Nombre del contenedor dentro del almacenamiento donde se encuentra el estado de Terraform.Tenant
: ID del tenant de Azure Active Directory (AAD).Subscription
: ID de la suscripción de Azure que se usará para crear recursos.Provider
: Nombre del proveedor de nube (por ejemplo,Azure
).Environment
: El entorno donde se deben desplegar los recursos (ej.dev
,prod
).BussinessUnit
: La unidad de negocio relacionada con el proyecto.ProjectName
: Nombre del proyecto para etiquetar y organizar los recursos.ServiceName
: Nombre del servicio que se está desplegando.EntityName
: Nombre de la entidad que está siendo gestionada.mapProjectPathKey
: Mapa que contiene rutas específicas a elementos dentro del proyecto.region
: La región geográfica de Azure donde se crearán los recursos.subscription_hub_id
: ID de la suscripción que se utilizará para la infraestructura de hub.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.
private_dns_zone_name_keyvault
: Nombre de la zona DNS privada para el Key Vault.rg_net_name
: Nombre del grupo de recursos de la red.vnet_net_name
: Nombre de la red virtual (VNet).sbn_data_net_name
: Nombre de la subred de datos.kv_enabled_for_disk_encryption
: Configuración de si el Key Vault debe ser habilitado para la encriptación de discos.kv_purgue_protection_enabled
: Configuración para proteger el Key Vault contra la purga.kv_sku_name
: Nombre del SKU para el Key Vault.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 bloquepaths
está vacío.
include
: Estos bloques incluyen archivos de variables externos (varEnvironment.hcl
,varCommon.hcl
,varDataState.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 mapamapProjectPathKey
del archivovarEnvironment.hcl
.
tags
: Codifica como JSON un conjunto de etiquetas combinando un conjunto fijo de etiquetas (Managed_By
yProvider
), las etiquetas globales definidas envarCommon.hcl
y las etiquetas específicas del entorno definidas envarEnvironment.hcl
.
generate "backend"
: Este bloque genera un archivo llamadobackend.tfvars
. Este archivo se utiliza para configurar el backend de Terraform. Contiene variables comosubscription_id
,key
,resource_group_name
,storage_account_name
, ycontainer_name
. Los valores de estas variables se obtienen de los archivos incluidos (varDataState.hcl
yvarCommon.hcl
).
generate "vars"
: Este bloque genera un archivo llamadovars.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.hcl
,varCommon.hcl
,varEnvironment.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, comoplan
yapply
. En este caso, se ejecutan dos ganchos:print_tags
ycopy_vars
.
extra_arguments
: Este bloque especifica argumentos adicionales que se pasarán a los comandos de Terraform (init
,plan
,apply
,destroy
,import
). 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ón:
subscription_hub_id
ySubscription
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 Proyecto:
mapProjectPathKey
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 Entorno:
environmentTags
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 bloquelocals
. - ProjectName: Se asigna la variable
ProjectName
del bloquelocals
. - ServiceName: Se asigna la variable
ServiceName
del bloquelocals
. - BussinessUnit: Se asigna la variable
BussinessUnit
del bloquelocals
. - Subscription: Este valor está comentado, lo que indica que esta variable no se está utilizando activamente.
- Tenant: Se asigna la variable
Tenant
del bloquelocals
. - Provider: Se asigna la variable
Provider
del bloquelocals
. - required_version: Se asigna la variable
required_version
del bloquelocals
. - 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 bloquelocals
, 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 bloquelocals
. 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 enlocals
, especificando el grupo de recursos en Azure.
- lz_storage_account_name: Se asigna el valor de
lz_storage_account_name
definido enlocals
, 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 enlocals
, especificando el contenedor donde se almacenará el estado. - path_resources_terraform_state: Se asigna el valor de
path_resources_terraform_state
definido enlocals
, que indica la ruta dentro del contenedor donde se guardará el estado de Terraform (en este caso, «rg/00»).
:wq!