Terraform 0.12.13, поставщик Azurerm 1.35
Некоторые сведения. У меня есть набор служб приложений Azure, размещенных в плане обслуживания приложений в группе ресурсов в расположении Azure. Теперь мне нужно продублировать этот стек в другом месте Azure и добавить некоторые дополнительные ресурсы, такие как диспетчеры трафика и CNAME, и тому подобное, чтобы реализовать высокую доступность. Архитектурно у нас есть Первичные ресурсы, а затем меньшее подмножество Вторичных ресурсов во вторичном регионе (не все должно дублироваться). Не каждое развертывание потребует высокой доступности, поэтому мне нужно иметь возможность создавать или не создавать экземпляры Secondary во время выполнения.
Поскольку я пытался быть хорошим инженером-программистом, я создал модули для создания большинстваэтот материал - один для служб приложений, один для плана обслуживания приложений, один для диспетчеров трафика и т. д.
Проблема, с которой я столкнулся сейчас, заключается в том, что я использую старый трюк со счетом + троичным операторомконтролировать, создаются ли вторичные ресурсы, и это ломается, потому что 1) счетчик пока не разрешен как мета-аргумент модуля и 2) я не могу понять, как передать экспортированные атрибуты из ресурса, контролируемого мета-счетчиком-аргумент модуля в качестве входной переменной.
Следующий код может сделать это более понятным.
resource "azurerm_resource_group" "appservices_secondary" {
name = "foo-services-ca-${local.secondary_release_stage_name}-${var.pipeline}-rg"
location = local.secondary_location
count = var.enable_high_availability ? 1 : 0
}
# Create the app service plan to host the secondary app services
module "plan_secondary" {
source = "./app_service_plan"
release_stage_name = local.secondary_release_stage_name
# HERE'S THE PROBLEMATIC LINE
appsvc_resource_group_name = azurerm_resource_group.appservices_secondary[0].name
location = local.secondary_location
pipeline = var.pipeline
}
Если счетчик разрешается в 1 (var.enable_high_availability = true
), то все в порядке. Если значение count равно 0 (var.enable_high_availability = false
), то terraform plan
завершается неудачно:
Error: Invalid index
on .terraform\modules\services\secondary.tf line 25, in module "plan_secondary":
25: appsvc_resource_group_name = azurerm_resource_group.appservices_secondary[0].name
|----------------
| azurerm_resource_group.appservices_secondary is empty tuple
The given key does not identify an element in this collection value.
Если я изменю значение входной переменной на azurerm_resource_group.appservices_secondary.name
, тогда оно не пройдет terraform validate
, потому что распознает, что оноНужно [count.index]
.
Есть ли простой способ решить эту проблему? Я все чаще думаю, что это проблема проектирования, и я должен был построить модули с count = [1..2], а не count = 1 (основной) и count = [0 ||1] (вторично), но для этого потребуется, чтобы я переписал все модули, и я бы хотел избежать этого, если есть какой-нибудь умный обходной путь.