Ссылка на шаблон json на объектную переменную;

У меня есть шаблон 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#" 

Можете ли вы упростить это до минимального воспроизводимого примера, который мы можем воспроизвести и помочь решить вашу проблему?

Chris Doyle 23.02.2024 21:05

это сложно, потому что у меня есть приложение логики, которое использует этот шаблон json. обратите внимание, что для моего uri, который является строкой, когда я развертываю свой код tf, применение tf завершается успешно, и на портале я вижу правильное значение; только для reqBody я не могу, потому что это объект, и я думаю, что на него неправильно ссылаются. ошибка: Неверное значение интерполяции шаблона; Невозможно включить данное значение в шаблон строки: требуется строка

be9inn3r 23.02.2024 21:09
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Предполагая, что вы хотите, чтобы тело запроса представляло собой действительную строку 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"}}"]" и это не нормально. Мне нужно как-то обойтись без [], и мое тело будет работать в приложении логики.

be9inn3r 23.02.2024 21:52

Я попробовал, как вы рекомендовали. иметь: reqBody = jsonencode(var.params_obj) и ссылку в json типа: "subscribe": { "body": ${requestBody}, #без двойных кавычек "method": "POST", "uri": "$ {functionAppUri}" }, "unsubscribe": {} и, похоже, теперь на портале Azure все работает нормально. Сейчас я пытаюсь включить "", как вы сказали.

be9inn3r 23.02.2024 22:00

Не работает, если я попробую "body": "${reqBody}" включая "" для ${reqBody} , что приведет к ошибке типа: Ошибка вызова функции "jsondecode": недопустимый символ 'p' после пары ключ:значение объекта. Но здорово, что он работает без "" и его кодирования.

be9inn3r 23.02.2024 22:22

Почему вы пытаетесь заключить это в кавычки?

Chris Doyle 23.02.2024 22:29

Я следовал вашему предложению. Спасибо, Крис, за быстрые ответы!

be9inn3r 23.02.2024 23:24

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

Chris Doyle 23.02.2024 23:39

Сейчас я пытаюсь использовать его и в сценарии PowerShell, но меня не могут понять правильно: я пытаюсь сделать следующее: $logicAppDefinition.triggers.Recurrence.recurrence.schedule.‌​hours = @('$scheduleHour') и заменяю его с "часами": [ "$scheduleHour" ], и мне нужно быть без двойных кавычек. Если я использую «часы»: [null], но это не ноль. Оно должно выглядеть так: "hours": [ @${scheduleHour} ] .

be9inn3r 11.03.2024 09:09

Я использую сценарий PowerShell, адаптированный к моему случаю, для создания/загрузки с портала Azure приложения логики, но он принимает приложение логики с параметрами в качестве значений, и мне нужно загрузить его так же, как в шаблоне JSON, который использовался при развертывании приложений логики.

be9inn3r 11.03.2024 09:09

Мне нужно как-то сослаться на эту переменную из определения, requestBody, которая является объектом. Это не может быть ошибка вызова функции «jsondecode»: недопустимый символ «p» после пары «ключ:значение объекта» в моем случае ниже: #Следующий комментарий

be9inn3r 12.03.2024 13:14

body = jsonencode({ свойства = { определение = jsondecode(templatefile(local.file_path, { ScheduleHour = tostring(var.schedule_hour) ScheduleMinute = tostring(var.schedule_MINUT) Uri = "https://..." #requestBody = var .func_app_parameters })) состояние = "Включено" } })

be9inn3r 12.03.2024 13:16

Другие вопросы по теме