Comprensión de las variables, los valores locales y los resultados de Terraform - AWS Orientación prescriptiva

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Comprensión de las variables, los valores locales y los resultados de Terraform

Las variables mejoran la flexibilidad del código al permitir colocar marcadores de posición dentro de los bloques de código. Las variables pueden representar valores diferentes siempre que se reutilice el código. Terraform distingue sus tipos de variables por su alcance modular. Las variables de entrada son valores externos que se pueden inyectar en un módulo, los valores de salida son valores internos que se pueden compartir externamente y los valores locales siempre permanecen dentro de su ámbito original.

Variables

AWS CloudFormation usa parámetros para representar valores personalizados que se pueden configurar y restablecer de una implementación de pila a la siguiente. Del mismo modo, Terraform usa variables o variables de entrada. Las variables se pueden declarar en cualquier parte de un archivo de configuración de Terraform y, por lo general, se declaran con el tipo de datos requerido o el valor predeterminado. Las tres expresiones siguientes son declaraciones de variables de Terraform válidas.

variable "thing_i_made_up" { type = string } variable "random_number" { default = 5 } variable "dogs" { type = list(object({ name = string breed = string })) default = [ { name = "Sparky", breed = "poodle" } ] }

Para acceder a la raza de Sparky dentro de la configuración, debes usar la variable. var.dogs[0].breed Si una variable no tiene valores predeterminados y no está clasificada como anulable, se debe establecer el valor de la variable para cada implementación. De lo contrario, es opcional establecer un nuevo valor para la variable. En un módulo raíz, puede establecer los valores de las variables actuales en la línea de comandos, como variables de entorno o en el archivo terraform.tfvars. El siguiente ejemplo muestra cómo introducir valores de variables en el archivo terraform.tfvars, que se almacena en el directorio de nivel superior del módulo.

# terraform.tfvars dogs = [ { name = "Sparky", breed = "poodle" }, { name = "Fluffy", breed = "chihuahua" } ] random_number = 7 thing_i_made_up = "Kabibble"

El valor del archivo terraform.tfvars de este ejemplo anularía el valor predeterminado de la declaración de variables. dogs Si declaras variables dentro de un módulo secundario, puedes establecer los valores de las variables directamente dentro del bloque de declaración del módulo, como se muestra en el siguiente ejemplo.

module "my_custom_module" { source = "modulesource/custom" version = "0.0.1" random_number = 8 }

Algunos de los otros argumentos que puedes usar al declarar una variable son:

  • sensitive— Configurarlo para true evitar que el valor de la variable quede expuesto en las salidas del proceso de Terraform. 

  • nullable— Si se configura de esta manera, se true permite que la variable no tenga ningún valor. Esto resulta práctico para las variables en las que no se establece un valor predeterminado.

  • description— Añadir una descripción de la variable a los metadatos de la pila.

  • validation— Establecer reglas de validación para la variable.

Uno de los aspectos más convenientes de las variables de Terraform es la posibilidad de añadir uno o más objetos de validación dentro de la declaración de variables. Puede usar los objetos de validación para agregar una condición que la variable deba cumplir o, de lo contrario, el despliegue fallará. También puede configurar un mensaje de error personalizado para que se muestre cada vez que se infrinja la condición.

Por ejemplo, estás configurando un archivo de configuración de Terraform que ejecutarán los miembros de tu equipo. Antes de implementar las pilas, un miembro del equipo debe crear un archivo terraform.tfvars para establecer un valor de configuración importante. Para recordárselo, puedes hacer algo como lo siguiente.

variable "important_config_setting" { type = string validation { condition = length(var.important_config_setting) > 0 error_message = "Don't forget to create the terraform.tfvars file!" } validation { condition = substr(var.important_config_setting, 0, 7) == "prefix-" error_message = "Remember that the value always needs to start with 'prefix-'" } }

Como se muestra en este ejemplo, puede establecer varias condiciones dentro de una sola variable. Terraform solo muestra los mensajes de error de las condiciones fallidas. De esta forma, puede hacer cumplir todo tipo de reglas sobre los valores de las variables. Si un valor variable provoca un fallo en la canalización, sabrá exactamente por qué.

Valores locales

Si hay algún valor dentro de un módulo al que desee asignar un alias, utilice la locals palabra clave en lugar de declarar una variable predeterminada que nunca se actualizará. Como su nombre indica, un locals bloque contiene términos que se refieren internamente a ese módulo específico. Si quieres transformar un valor de cadena, por ejemplo, añadiendo un prefijo a un valor de variable para usarlo en el nombre de un recurso, usar un valor local puede ser una buena solución. Un solo locals bloque puede declarar todos los valores locales del módulo, como se muestra en el siguiente ejemplo.

locals { moduleName = "My Module" localConfigId = concat("prefix-", var.important_config_setting) }

Recuerda que cuando accedes al valor, la locals palabra clave pasa a ser singular, por ejemplolocal.LocalConfigId.

Valores de salida

Si las variables de entrada de Terraform son como CloudFormation parámetros, entonces se podría decir que los valores de salida de Terraform son como CloudFormation salidas. Ambos se utilizan para exponer los valores de una pila de despliegue. Sin embargo, dado que el módulo Terraform está más integrado en la estructura de la herramienta, los valores de salida de Terraform también se utilizan para exponer los valores de un módulo a un módulo principal o a otros módulos secundarios, incluso si esos módulos están todos dentro de la misma pila de despliegue. Si estás creando dos módulos personalizados y el primer módulo necesita acceder al valor de ID del segundo módulo, tendrás que añadir el siguiente output bloque al segundo módulo.

output "module_id" { value = local.module_id } Then in the first module you could use it like this: module "first_module" { source = "path/to/first/module" } resource "example_resource" "example_resource_name" { module_id = module.first_module.module_id }

Como los valores de salida de Terraform se pueden usar en la misma pila, también puedes usar el sensitive atributo en un output bloque para evitar que el valor se muestre en la salida de la pila. Además, un output bloque puede usar precondition bloques de la misma manera que las variables usan validation bloques: para garantizar que las variables sigan un conjunto determinado de reglas. Esto ayuda a garantizar que todos los valores de un módulo existan según lo esperado antes de continuar con la implementación.

output "important_config_setting" { value = var.important_config_setting precondition { condition = length(var.important_config_setting) > 0 error_message = "You forgot to create the terraform.tfvars file again." } }