Строковая интерполяция с использованием синтаксиса ${ ... }
является наименьшим изменением по сравнению с литеральной строкой JSON, но она сопряжена с риском создания правильного синтаксиса JSON, если, например, вставляемые строки содержат обратную косую черту и кавычки, что JSON синтаксический анализатор может неверно истолковать.
Функция Terraform jsonencode
может быть хорошим компромиссом, поскольку Terraform имеет синтаксис объекта, очень похожий на JSON, и, следовательно, способность быстро понять, что такое структура JSON его создание сохраняется, и в то же время допускается произвольное выражение Terraform, результаты которого будут автоматически кодироваться с использованием правильного синтаксиса JSON:
device-status-policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "${SOMEVAR}/device-status-qa*"
},
{
"Effect": "Allow",
"Action": [ "iot:Publish", "iot:Receive", "iot:Subscribe" ]
}
]
})
Обратите внимание, что выше используется вариантная форма объекта языка Terraform. синтаксис, который использует двоеточия вместо знаков равенства; оба действительны, и использование двоеточий здесь помогает вводу напоминать JSON и, следовательно, облегчает адаптацию JSON, которую вы уже написали (как я сделал здесь), без большого количества переписывания.
Однако, * Последовательность 1010 * понимается Terraform как выражение шаблона в кавычках, а не как буквальная строка, поэтому она будет оценивать SOMEVAR
и включать результат в значение Resource
до сериализации всей полученной строки с использованием JSON синтаксис. Хотя в данном конкретном случае это кажется маловероятным, если бы результатом SOMEVAR
была строка, содержащая "
, то кодировка JSON автоматически сменила бы ее как \"
, чтобы обеспечить правильный синтаксис результата.
Для больших структур данных, в которых улучшается читаемость, чтобы выделить их в отдельный файл, документация templatefile
содержит несколько примеров вызова jsonencode
из внешнего шаблона тоже с похожими результатами.