Как подключить сетевой интерфейс Azure VM к пулу адресов балансировщика нагрузки Azure?

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

Ошибка: ошибка: конфигурация IP «azure_network_interface_address_pool_association» не найдена в сетевом интерфейсе «client_host_nic-0» (группа ресурсов «client_rg»)

в строке 99 vm2.tf, в ресурсе "azurerm_network_interface_backend_address_pool_association" "network_interface_backend_address_pool_association": 99: ресурс "azurerm_network_interface_backend_address_pool_association" "network_interfacedress_association" "network_interface_association"

vm2.tf файл включает

# Create virtual machine
resource "azurerm_network_interface" "client_nics" {
    count                     = var.node_count
    name                      = "client_host_nic-${count.index}"
    location                  = var.resource_group_location
    resource_group_name       = module.network.azurerm_resource_group_client_name
#    network_security_group_id = module.network.bastion_host_network_security_group

    ip_configuration {
        name                          = "client_host_nic"
        subnet_id                     = module.network.client_subnet_id
        private_ip_address_allocation = "Dynamic"
#        public_ip_address_id          = module.network.bastion_host_puplic_ip_address #optional field we have a bastion host so no need for public IP also its vnet peered so this adds an extra layer of securit in a way
    }

    tags = {
        environment = "Production"
    }
}

# Generate random text for a unique storage account name
resource "random_id" "randomId_Generator" {
    keepers = {
        # Generate a new ID only when a new resource group is defined
        resource_group = var.resource_group_location
    }

    byte_length = 8
}


# Create storage account for boot diagnostics
resource "azurerm_storage_account" "client_storageaccount" {
    name                        = "diag${random_id.randomId_Generator.hex}"
    resource_group_name         = module.network.azurerm_resource_group_client_name
    location                    = var.resource_group_location
    account_tier                = "Standard"
    account_replication_type    = "LRS"

    tags = {
        environment = "Production"
    }
}

resource "azurerm_virtual_machine" "node" {
  count                 = var.node_count
  name                  = "client-host-${count.index}"
  location              = var.resource_group_location
  resource_group_name   = module.network.azurerm_resource_group_client_name
  network_interface_ids = ["${element(azurerm_network_interface.client_nics.*.id, count.index)}"]

  # Uncomment this line to delete the OS disk automatically when deleting the VM
   delete_os_disk_on_termination = true

  # Uncomment this line to delete the data disks automatically when deleting the VM
   delete_data_disks_on_termination = true  

  # 1 vCPU, 3.5 Gb of RAM
  vm_size = var.machine_type

  storage_os_disk {
    name              = "myOsDisk-${count.index}"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Premium_LRS"
  }

  storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  os_profile {
        computer_name  = "Production"
        admin_username = "azureuser"
    }

  os_profile_linux_config {
        disable_password_authentication = true
        ssh_keys {
            path     = "/home/azureuser/.ssh/authorized_keys" #This cannot be changed as mentioned in https://www.terraform.io/docs/providers/azurerm/r/virtual_machine.html
            key_data = file("~/.ssh/client.pub")

        }
    }

    boot_diagnostics {
        enabled = "true"
        storage_uri = azurerm_storage_account.client_storageaccount.primary_blob_endpoint
    }

    tags = {
        environment = "Production"
    }
}

resource "azurerm_network_interface_backend_address_pool_association" "network_interface_backend_address_pool_association" {
  count                 = var.node_count
  network_interface_id    = element(azurerm_network_interface.client_nics.*.id, count.index) #fixes interpolation issues
  ip_configuration_name   = "azure_network_interface_address_pool_association"
  backend_address_pool_id = module.loadbalancer.azure_backend_pool_id
}

модуль балансировки нагрузки файл main.tf

#rember when using this module to call the network module for the resource group name
############## load balancer section  ##############
resource "azurerm_public_ip" "azure_load_balancer_IP" {
  name                = "azure_load_balancer_IP"
  location            = var.resource_group_location
  resource_group_name = var.resource_group_name
  allocation_method   = "Static"
}

resource "azurerm_lb" "azure_load_balancer" {
  name                = "TestLoadBalancer"
  location            = var.resource_group_location
  resource_group_name = var.resource_group_name

  frontend_ip_configuration {
    name                 = "front_end_IP_configuration_for_azure_load_balancer"
    public_ip_address_id = azurerm_public_ip.azure_load_balancer_IP.id
  }
}

resource "azurerm_lb_backend_address_pool" "backend_address_pool" {
  resource_group_name = var.resource_group_name
  loadbalancer_id     = azurerm_lb.azure_load_balancer.id
  name                = "BackEndAddressPool"
}

resource "azurerm_lb_rule" "azure_lb_rule" {
  resource_group_name            = var.resource_group_name
  loadbalancer_id                = azurerm_lb.azure_load_balancer.id
  name                           = "LBRule"
  protocol                       = "Tcp"
  frontend_port                  = 80
  backend_port                   = 80
  frontend_ip_configuration_name = "front_end_IP_configuration_for_azure_load_balancer"
}

output.tf

output "azure_load_balancer_ip" {
  value = azurerm_public_ip.azure_load_balancer_IP.id
}

output "azure_backend_pool_id" {
  value = azurerm_lb_backend_address_pool.backend_address_pool.id
}

Дополнительная информация

* provider.azurerm: version = "~> 2.1"

main.tf

module "loadbalancer" {
 source = "./azure_load_balancer_module" #this may need to be a different git repo as we are not referencing branches here only the master
resource_group_name = module.network.azurerm_resource_group_client_name
  resource_group_location = var.resource_group_location
 }

person user3700919    schedule 15.03.2020    source источник
comment
Покопавшись, выяснилось, что это известная ошибка terraform github.com / терраформ-провайдеры / терраформ-провайдер-лазурь /   -  person user3700919    schedule 15.03.2020
comment
Как вы цитируете модуль балансировщика нагрузки в файле виртуальной машины? Я ничего не вижу в модуле.   -  person Charles Xu    schedule 16.03.2020
comment
подождите Как вы имеете в виду, поэтому я предположил, что на него есть ссылка через azurerm_network_interface_backend_address_pool_association ?, в идеале это будет module.loadbalancer. (ресурс, который необходимо вызвать из вывода), поэтому я предполагаю, что, возможно, что-то отсутствует в модуле балансировки нагрузки, который следует ссылаться?   -  person user3700919    schedule 16.03.2020
comment
Решаете проблему решением? Или еще вопросы?   -  person Charles Xu    schedule 18.03.2020
comment
На данный момент у меня не было возможности протестировать, я протестирую немного позже на этой неделе и вернусь к вам   -  person user3700919    schedule 18.03.2020
comment
@CharlesXu просто запустить код получил   -  person user3700919    schedule 21.03.2020
comment
Ошибка: код = VmIsNotInSameAvailabilitySetAsLb   -  person user3700919    schedule 21.03.2020
comment
Находится ли LB в том же регионе и в той же подписке клиента, что и виртуальная машина? Кроме того, пожалуйста, @ me, если вы отправите мне сообщение, я получу его как можно быстрее.   -  person Charles Xu    schedule 25.03.2020
comment
Есть еще вопросы? Решает ли это вашу проблему? Или чего еще ты хочешь?   -  person Charles Xu    schedule 31.03.2020
comment
Привет, @CharlesXu, так что виртуальные машины находятся в одном арендаторе и подписке, я не знаю, должны ли они быть набором доступности, чтобы добавить его в LB. Я подозреваю, что им может потребоваться расположение на юге Великобритании для всех ресурсов. Так что на самом деле просто смотрю, в чем ошибка, и пытаюсь понять, можно ли подключить виртуальные машины к балансировщику нагрузки Azure, желательно не как набор доступности.   -  person user3700919    schedule 01.04.2020
comment
Да, виртуальная машина должна находиться в том же регионе, что и балансировщик нагрузки, а также общедоступный IP-адрес виртуальной машины должен быть того же SKU с балансировщиком нагрузки.   -  person Charles Xu    schedule 02.04.2020


Ответы (2)


Ошибка означает, что имя конфигурации IP, которое вы установили для сетевого интерфейса, не совпадает с тем, которое вы установили для ресурса azurerm_network_interface_backend_address_pool_association. Вы можете ознакомиться с описанием ip_configuration_name здесь < / а>. И, как я вижу, вы хотите связать несколько интерфейсов с балансировщиком нагрузки.

Поэтому я рекомендую вам изменить сетевой интерфейс и ассоциацию следующим образом:

resource "azurerm_network_interface" "client_nics" {
    count                     = var.node_count
    name                      = "client_host_nic-${count.index}"
    location                  = var.resource_group_location
    resource_group_name       = module.network.azurerm_resource_group_client_name
#    network_security_group_id = module.network.bastion_host_network_security_group

    ip_configuration {
        name                          = "client_host_nic-${count.index}"
        subnet_id                     = module.network.client_subnet_id
        private_ip_address_allocation = "Dynamic"
#       public_ip_address_id          = module.network.bastion_host_puplic_ip_address #optional field we have a bastion host so no need for public IP also its vnet peered so this adds an extra layer of securit in a way
    }

    tags = {
        environment = "Production"
    }
}

resource "azurerm_network_interface_backend_address_pool_association" "network_interface_backend_address_pool_association" {
  count                 = var.node_count
  network_interface_id    = element(azurerm_network_interface.client_nics.*.id, count.index) #fixes interpolation issues
  ip_configuration_name   = "client_host_nic-${count.index}"
  backend_address_pool_id = module.loadbalancer.azure_backend_pool_id
}
person Charles Xu    schedule 17.03.2020

Я считаю, что это была ошибка поставщика terraform azure 2.1, и, похоже, она была исправлена ​​в версии 2.33 согласно upstream https://github.com/terraform-providers/terraform-provider-azurerm/issues/3794

person user3700919    schedule 19.11.2020