TL; DR: JSON Terraform Azure Vnet требует, чтобы вложенные подсети имели идентификатор, но при предоставлении идентификатора возникают ошибки.
Фон
У меня есть учетная запись Azure, в которой есть множество ресурсов, которые были созданы вне канала, но теперь клиент хочет, чтобы мы управляли всеми ресурсами в терраформе. К счастью, в terraform есть способ импорта ресурсов, и даже прекрасное руководство демонстрирует, как импортировать ресурсы и генерировать необходимую конфигурацию (https://learn.hashicorp.com/tutorials/terraform/state-import).
После того, как я импортировал ресурсы, я запускаю команду tf show -no-color -json > main.tf.json
, чтобы сгенерировать тело конфигурации. Я выгружаю его в формате JSON, потому что после запуска tf show
вам необходимо изменить некоторые выходные данные, чтобы результаты были действительным файлом конфигурации terraform.
После запуска tf show
у меня есть сценарий, который изменяет данные, внося некоторые изменения в структуру JSON и удаляя атрибуты, которые необходимо удалить или изменить.
Эта проблема
Возникающая проблема заключается в том, что после очистки вывода, сгенерированного tf show
при запуске, tf validate
или любой другой командой, требующей проверки, я получаю сообщение об ошибке, в котором говорится, что атрибут id
требуется для элементов в массиве JSON подсети в azurerm_virtual_network
JSON объект. Однако, когда я добавляю идентификатор, я получаю сообщение об ошибке, в котором говорится, что id
не может быть указан для объекта JSON подсети Azure.
Обратите внимание, что это происходит только тогда, когда я использую файл .tf.json
, если я использую обычный файл tf
, никаких проблем не возникает.
Код
Версия Terraform: Terraform v0.13.5
Версия поставщика: azurerm v2.38.0
Вот конфигурация JSON terraform, которая демонстрирует проблему
{
"resource": {
"azurerm_virtual_network": {
"gork_vnet": {
"address_space": [
"10.0.0.0/16"
],
"location": "westus2",
"name": "gork_vnet",
"resource_group_name": "mork_rg",
"subnet": [
{
"address_prefix": "10.0.0.0/24",
"name": "cunning_brutality",
"security_group": ""
}
]
}
}
}
}
Произведена ошибка:
Error: Incorrect attribute value type
on main.tf.json line 22, in [1].resource.azurerm_virtual_network.gork_vnet:
22: "subnet": [
23: {
24: "address_prefix": "10.0.0.0/24",
25: "name": "cunning_brutality",
26: "security_group": ""
27: }
28: ]
Inappropriate value for attribute "subnet": element 0: attribute "id" is
required.
Если я добавлю идентификатор, я получу эту ошибку
Error: "subnet.0.id": this field cannot be set
on main.tf.json line 30, in [1].resource.azurerm_virtual_network.gork_vnet:
30: }
Кроме того, следует отметить, что в соответствии с документами TF, JSON фактически должен быть структурирован как
"subnet": [
{
"cunning_brutality": {
"address_prefix": "10.0.0.0/24",
"name": "cunning_brutality",
"security_group": ""
}
}
]
Но это порождает ошибку
Inappropriate value for attribute "subnet": element 0: attributes
"address_prefix", "id", "name", and "security_group" are required.
Заключение
К сожалению, мой анализ кода не дал ничего особенно поучительного, согласно всей документации, это должно сработать. Так что любое направление или руководство будут очень благодарны.