У меня есть шаблон JSON, используемый для ресурса в проекте terraform. Моя проблема в том, что я не могу успешно ссылаться на значение из блока параметров в моем шаблоне json, когда оно развертывается в представлении кода приложения логики Azure Portal.
Для моего ресурса (тип azapi_resource Microsoft.Logic/workflows@2019-05-01 у меня есть это тело:
body = jsonencode({
properties = {
definition = jsondecode(templatefile("${path.module}/xyz.json",
{
.
.
uri = "https://****"
requestBody = var.params_obj
}))
parameters = {
.
.
uri = { value = "https://****" } #it is a string;
reqBody = { value = var.params_obj #it is an object
}
state = "Enabled"
}
})
В моем файле переменных.tf у меня объявлена переменная:
variable "params_obj" {
type = object({
pipeline = object({
calculation_date = string
name = string
abc = optional(object({
.
.
})
})
})
}
В моем примере json xyz.json мне нужно ссылаться на var.params_obj, но он не работает и помещает представление кода приложения логики как есть, а не значения объекта моей переменной.
В моем образце json xyz.json я пытался ссылаться на него, как показано ниже:
"inputs": {
"subscribe": {
"body": "${reqBody}" #not working; I tried also with "[parameters('reqBody')]" #I tried with another forms... not working;
,
"method": "POST",
"uri": "${uri}" #it works to reference the string uri value;
"unsubscribe": {}
Мой вопрос: как правильно ссылаться на этот reqBody в моем шаблоне json? потому что это немного странно.
Мой образец json содержит определение и схему для Microsoft.Logic/workflows;
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
это сложно, потому что у меня есть приложение логики, которое использует этот шаблон json. обратите внимание, что для моего uri, который является строкой, когда я развертываю свой код tf, применение tf завершается успешно, и на портале я вижу правильное значение; только для reqBody я не могу, потому что это объект, и я думаю, что на него неправильно ссылаются. ошибка: Неверное значение интерполяции шаблона; Невозможно включить данное значение в шаблон строки: требуется строка

Поскольку вы на самом деле не привели четкого примера, который я мог бы использовать для воспроизведения, я предположил, чего вы пытаетесь достичь, и упростил проблему.
Предполагая, что вы хотите, чтобы тело запроса представляло собой действительную строку json в шаблоне, вам нужно использовать функцию jsondecode, чтобы превратить переменную в строку json, прежде чем пытаться использовать ее в шаблоне.
main.tf
variable "params_obj" {
type = object({
pipeline = object({
calculation_date = string
name = string
abc = optional(object({
foo = string
}))
})
})
default = {
pipeline = {
calculation_date = "monday"
name = "chris"
}
}
}
output "this" {
value = templatefile("mytemp.tftpl", {
reqBody = jsonencode(var.params_obj)
uri = "bar"
})
}
шаблон
{
"inputs": {
"subscribe": {
"body": ${reqBody},
"method": "POST",
"uri": "${uri}"
},
"unsubscribe": {}
}
}
ВЫХОД
Outputs:
this = <<EOT
{
"inputs": {
"subscribe": {
"body": "{"pipeline":{"abc":null,"calculation_date":"monday","name":"chris"}}" ,
"method": "POST",
"uri": "bar"
},
"unsubscribe": {}
}
}
EOT
без использования функции jsondecode и попытки передать переменную непосредственно в шаблон я бы получил ошибку
│ Error: Error in function call
│
│ on main.tf line 20, in output "this":
│ 20: value = templatefile("mytemp.tftpl", {
│ 21: reqBody = var.params_obj
│ 22: uri = "bar"
│ 23: })
│ ├────────────────
│ │ while calling templatefile(path, vars)
│ │ var.params_obj is object with 1 attribute "pipeline"
│
│ Call to function "templatefile" failed: mytemp.tftpl:4,29-36: Invalid template interpolation value; Cannot include the given value in a string template: string required..
Я попытался ссылаться на шаблон для тела, например: «body»: [${jsonencode(requestBody)], и он также добавляет [ ], когда он применяется с помощью tf apply. в представлении кода приложения логики я вижу: "body": "["{"pipeline":{"abc":null,"calculation_date":"monday","name":"chris"}}"]" и это не нормально. Мне нужно как-то обойтись без [], и мое тело будет работать в приложении логики.
Я попробовал, как вы рекомендовали. иметь: reqBody = jsonencode(var.params_obj) и ссылку в json типа: "subscribe": { "body": ${requestBody}, #без двойных кавычек "method": "POST", "uri": "$ {functionAppUri}" }, "unsubscribe": {} и, похоже, теперь на портале Azure все работает нормально. Сейчас я пытаюсь включить "", как вы сказали.
Не работает, если я попробую "body": "${reqBody}" включая "" для ${reqBody} , что приведет к ошибке типа: Ошибка вызова функции "jsondecode": недопустимый символ 'p' после пары ключ:значение объекта. Но здорово, что он работает без "" и его кодирования.
Почему вы пытаетесь заключить это в кавычки?
Я следовал вашему предложению. Спасибо, Крис, за быстрые ответы!
Ах, извини, я вижу. Я не кодировал json после рендеринга шаблона. поэтому на самом деле кавычек не должно быть, чтобы json был действительным. Я обновил ответ
Сейчас я пытаюсь использовать его и в сценарии PowerShell, но меня не могут понять правильно: я пытаюсь сделать следующее: $logicAppDefinition.triggers.Recurrence.recurrence.schedule.hours = @('$scheduleHour') и заменяю его с "часами": [ "$scheduleHour" ], и мне нужно быть без двойных кавычек. Если я использую «часы»: [null], но это не ноль. Оно должно выглядеть так: "hours": [ @${scheduleHour} ] .
Я использую сценарий PowerShell, адаптированный к моему случаю, для создания/загрузки с портала Azure приложения логики, но он принимает приложение логики с параметрами в качестве значений, и мне нужно загрузить его так же, как в шаблоне JSON, который использовался при развертывании приложений логики.
Мне нужно как-то сослаться на эту переменную из определения, requestBody, которая является объектом. Это не может быть ошибка вызова функции «jsondecode»: недопустимый символ «p» после пары «ключ:значение объекта» в моем случае ниже: #Следующий комментарий
body = jsonencode({ свойства = { определение = jsondecode(templatefile(local.file_path, { ScheduleHour = tostring(var.schedule_hour) ScheduleMinute = tostring(var.schedule_MINUT) Uri = "https://..." #requestBody = var .func_app_parameters })) состояние = "Включено" } })
Можете ли вы упростить это до минимального воспроизводимого примера, который мы можем воспроизвести и помочь решить вашу проблему?