Синтаксическая ошибка интерполяции Terraform для файла данных - PullRequest
0 голосов
/ 08 октября 2019

В моем lambda.tf у меня есть ресурс данных

data "template_file" "handler" {
    template = "${file("${path.module}/templates/handler.js")}"

    vars = {
        ENDPOINT = "${var.domain}"
        PASSWORD = "${var.password}"
    }
}

Однако - я сталкиваюсь с синтаксической ошибкой:

Error: failed to render : <template_file>:280,49-50: Extra characters after interpolation expression; Expected a closing brace to end the interpolation expression, but found extra characters.

  on ../docs/lambda.tf line 1, in data "template_file" "handler":
   1: data "template_file" "handler" {

Допускается ли интерполяция внутри интерполяции для Terraform? Если это так - любые предложения по указанию, где ошибка, будет принята с благодарностью.

Terraform v0.12.9. Версия провайдера "aws" "~> 2.7"

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Источник данных template_file продолжает существовать для пользователей Terraform 0.11 и более ранних версий, но, поскольку вы используете версию Terraform 0.12, я бы рекомендовал вместо этого использовать функцию templatefile . Поскольку он встроен непосредственно в Terraform, он может создавать лучшие сообщения об ошибках.

Чтобы использовать его, вы можете заменить свои ссылки на data.template_file.handler.rendered прямым вызовом templatefile. Если вы используете этот результат визуализации в нескольких местах, вы можете присвоить результат templatefile локальному значению и ссылаться на него в нескольких местах.

templatefile("${path.module}/templates/handler.js", {
  ENDPOINT = var.domain
  PASSWORD = var.password
})

Сообщение об ошибке выsaw предполагает, что в самом шаблоне есть синтаксическая ошибка, но поскольку template_file реализован в отдельном поставщике, он сообщает об этой синтаксической ошибке бесполезным способом, указывая на конкретное местоположение источника, но не включая соответствующий фрагмент исходного кода.

Если вместо этого вы используете templatefile, Terraform, возможно, сам сообщит об этой синтаксической ошибке и предоставит более подробную информацию о ней.

В любом случае, похоже, что синтаксическая ошибка находится в строке 280 столбца 49 вашейФайл handler.js вызван тем, что механизм шаблонов Terraform ожидает найти } для закрытия последовательности интерполяции ${ ... }, но вместо этого находит что-то другое. Если вы исправите эту синтаксическую ошибку, рендеринг шаблона должен быть успешным при любом подходе.

0 голосов
/ 08 октября 2019

Не совсем ясно, как выглядит ваш файл шаблона или что вы пытаетесь сделать, поэтому вот несколько разных ответов.

  1. Вы можете избежать интерполяции с двойными знаками доллара: $${foo} будет отображаться как литерал ${foo}.

  2. Terraform не позволяет динамически создавать имена переменных, потому что он должен иметь возможность анализировать конфигурацию статически (то есть безвычисление любых выражений), чтобы определить, в каком порядке должны быть разрешены выражения.

    Terraform поддерживает структуру данных карты, которую можно использовать для достижения этого эффекта.

variable "var1" {
 default = "value1"
}
variable "var2" {
 default = "value2"
}

locals {
 var3 = "${var.var1}_${var.var2}"
 values = {
   "value1_value2" = "local1"
   "value2_value3" = "local2"
   "value3_value4" = "local3"
 }
}

output "val_output" {
 value = "${local.values[local.var3]}"
}

Если ни то, ни другое вам не нужно, вам нужно предоставить доступ к файлу шаблона или измененной версии, которая дублирует ошибку.

...