Saltar al contenido

¿Cómo puedo cargar datos de entrada desde un archivo en Terraform?

Te doy la bienvenida a nuestra página, ahora encontrarás la respuesta a lo que estás buscando.

Solución:

La respuesta aquí depende de algunas preguntas diferentes:

  • ¿Es este archivo un static parte de su configuración, registrada en el control de versiones junto con su .tf archivos o se genera dinámicamente como parte del proceso de solicitud?
  • ¿Desea utilizar el contenido del archivo literalmente o necesita sustituir valores en él desde otra parte de la configuración de Terraform?

Estas dos preguntas forman una matriz de cuatro respuestas diferentes:

             |  Literal Content            Include Values from Elsewhere
-------------|----------------------------------------------------------
Static File  |  file(...) function         templatefile(...) function
Dynamic File |  local_file data source     template_file data source

Describiré cada una de estas cuatro opciones con más detalle a continuación.

Un tema común en todos estos ejemplos serán las referencias a path.module, que evalúa la ruta desde la que se carga el módulo actual. Otra forma de pensar en eso es que es el directorio que contiene el actual .tf expediente. Acceder a archivos en otros directorios es permitido, pero en la mayoría de los casos es apropiado mantener las cosas autocontenidas en su módulo manteniendo juntos los archivos de datos y los archivos de configuración.

Las cadenas de Terraform son secuencias de caracteres Unicode, por lo que Terraform solo puede leer archivos que contengan texto codificado en UTF-8 válido. Para JSON eso no es un problema, pero vale la pena tenerlo en cuenta para otros formatos de archivo que pueden no estar codificados convencionalmente en UTF-8.

los file función

los file La función lee el contenido literal de un archivo del disco como parte de la evaluación inicial de la configuración. El contenido del archivo se trata como si fuera un literal. string valor para fines de validación, por lo que el archivo debe existen en el disco (y por lo general, en su control de versiones) como un static parte de su configuración, en lugar de generarse dinámicamente durante terraform apply.

resource "aws_cloudwatch_event_target" "data" 
  rule      = aws_cloudwatch_event_rule.scheduler.name
  target_id = "finance_producer_cloudwatch"
  arn       = aws_lambda_function.finance_data_producer.arn
  input     = file("$path.module/input.json")

Ésta es la opción más común y sencilla. Si el file La función es suficiente para sus necesidades, entonces es la mejor opción para usar como opción predeterminada.

los templatefile función

los templatefile función es similar a la file función, pero en lugar de simplemente devolver el contenido del archivo literalmente, en su lugar analiza el contenido del archivo como un string template y luego lo evalúa usando un conjunto de variables locales dadas en su segundo argumento. Esto es útil si necesita pasar algunos datos de otro lugar en la configuración de Terraform, como en este ejemplo:

resource "aws_cloudwatch_event_target" "data" 
  rule      = aws_cloudwatch_event_rule.scheduler.name
  target_id = "finance_producer_cloudwatch"
  arn       = aws_lambda_function.finance_data_producer.arn
  input     = templatefile("$path.module/input.json.tmpl", 
    instance_id = aws_instance.example.id
  )

En input.json.tmpl puede usar la sintaxis de la plantilla Terraform para sustituir ese valor de variable:

"instance_id":$jsonencode(instance_id)

En casos como este donde todo resultado es JSON, sugeriría generar todo el resultado usando jsonencode, desde entonces, puede dejar que Terraform se preocupe por el escape de JSON, etc. y simplemente escribir la estructura de datos en la sintaxis del objeto de Terraform:

$jsonencode(
  instance_id = instance_id
)

Al igual que con file, porque templatefile es una función que se evalúa durante la decodificación inicial de la configuración y su resultado se valida como un valor literal. Por lo tanto, el archivo de plantilla también debe ser un static archivo que se distribuye como parte de la configuración, en lugar de un archivo generado dinámicamente.

los local_file fuente de datos

Las fuentes de datos son tipos de recursos especiales que leen un objeto existente o calculan un resultado, en lugar de crear y administrar un nuevo objeto. Debido a que son recursos, pueden participar en el gráfico de dependencia y, por lo tanto, pueden hacer uso de objetos (incluidos archivos locales) que son creados por otros recursos en la misma configuración de Terraform durante terraform apply.

los local_file la fuente de datos pertenece al local proveedor y es esencialmente la fuente de datos equivalente a la file función.

En el siguiente ejemplo, estoy usando var.input_file como marcador de posición para cualquier referencia a una ruta de archivo creada por algún otro recurso en la misma configuración. En un ejemplo real, lo más probable es que sea una referencia directa a un attribute de un recurso.

data "local_file" "input" 
  filename = var.input_file


resource "aws_cloudwatch_event_target" "data" 
  rule      = aws_cloudwatch_event_rule.scheduler.name
  target_id = "finance_producer_cloudwatch"
  arn       = aws_lambda_function.finance_data_producer.arn
  input     = data.local_file.input.content

los template_file fuente de datos

los template_file fuente de datos es la fuente de datos equivalente a la templatefile función. Es similar en uso a local_file aunque en este caso rellenamos la propia plantilla leyéndola como un static archivo, utilizando el file función o local_file como se describe arriba dependiendo de si la plantilla está en un static archivo o uno generado dinámicamente, aunque si fuera un static archivo preferimos utilizar el templatefile función y entonces usaremos el local_file fuente de datos aquí:

data "local_file" "input_template" 
  filename = var.input_template_file


data "template_file" "input" 
  template = data.local_file.input_template.content
  vars = 
    instance_id = aws_instance.example.id
  


resource "aws_cloudwatch_event_target" "data" 
  rule      = aws_cloudwatch_event_rule.scheduler.name
  target_id = "finance_producer_cloudwatch"
  arn       = aws_lambda_function.finance_data_producer.arn
  input     = data.template_file.input.rendered

los templatefile La función se agregó en Terraform 0.12.0, por lo que puede ver ejemplos en otros lugares del uso de la template_file fuente de datos para representar static archivos de plantilla. Ese es un patrón antiguo, ahora en desuso en Terraform 0.12, porque el templatefile La función hace que la configuración sea más directa y legible en la mayoría de los casos.

Una peculiaridad del template_file fuente de datos en contraposición a la templatefile función es que la fuente de datos pertenece a la template proveedor en lugar de Terraform Core, por lo que las funciones de plantilla que estén disponibles dependerán de la versión del proveedor que esté instalada en lugar de la versión de Terraform CLI instalada. los template Es probable que el proveedor se quede atrás de Terraform Core en términos de qué funciones de lenguaje de plantilla están disponibles, lo cual es otra razón para preferir el templatefile funcionar siempre que sea posible.

Otras posibilidades

Esta pregunta fue específicamente sobre la lectura de datos de un archivo, pero para completar también quiero señalar que para cargas útiles JSON pequeñas, a veces puede ser preferible incorporarlas directamente en la configuración como una estructura de datos Terraform y convertirlas a JSON usando jsonencode, como esto:

resource "aws_cloudwatch_event_target" "data" 
  rule      = aws_cloudwatch_event_rule.scheduler.name
  target_id = "finance_producer_cloudwatch"
  arn       = aws_lambda_function.finance_data_producer.arn
  input     = jsonencode(
    instance_id = aws_instance.example.id
  )

Escribir la estructura de datos en línea como una expresión de Terraform significa que un futuro lector puede ver directamente lo que se enviará sin necesidad de consultar un archivo separado. Sin embargo, si la estructura de datos es muy grande y complicada, puede afectar la legibilidad general para incluirla en línea porque podría abrumar a la otra configuración en el mismo archivo.

Por lo tanto, qué opción elegir dependerá mucho de las circunstancias específicas, pero siempre vale la pena considerar si la dirección indirecta de un archivo separado es la mejor opción para la legibilidad.

Terraform también tiene un yamlencode función (experimental en el momento de escribir este artículo) que puede funcionar de manera similar para las estructuras de datos con formato YAML, ya sea directamente dentro de un .tf archivo o en una secuencia de interpolación en una plantilla externa.

Más adelante puedes encontrar las referencias de otros sys admins, tú aún puedes dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

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