Terraform error: Error: creating Subnet: Original Error: Code="NetcfgInvalidSubnet" Message="Subnet 'internal' is not valid in virtual network

Terraform error: Error: creating Subnet: Original Error: Code="NetcfgInvalidSubnet" Message="Subnet 'internal' is not valid in virtual network

我正在尝试使用 terraform 在 Azure 中创建资源,一个 SQL 服务器数据库和一个虚拟 machine.I 得到错误。

│ Error: creating Subnet: (Name "db_subnetn" / Virtual Network Name "tf_dev-network" / Resource Group "terraform_youtube"): network.SubnetsClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="NetcfgInvalidSubnet" Message="Subnet 'db_subnetn' is not valid in virtual network 'tf_dev-network'." Details=[]

我做了什么?

在此处关注 link

我删除了使用相同 IP 范围的其他网络资源。

我对网络的了解非常基础,但根据我的研究,10.0.0.0/16 似乎是一个相当大的 IP 范围,可能会导致重叠。那么我做了什么,我将虚拟网络IP范围从10.0.0.0/16更改为10.0.1.0/24以限制范围,结果只是错误更改为

│ Error: creating Subnet: (Name "internal" / Virtual Network Name "tf_dev-network" / Resource Group "terraform_youtube"): network.SubnetsClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="NetcfgInvalidSubnet" Message="Subnet 'internal' is not valid in virtual network 'tf_dev-network'." Details=[]

在这个阶段,如果有人能解释这里出了什么问题以及需要做什么,我将不胜感激。提前致谢

我的文件如下

dbcode.tf

resource "azurerm_sql_server" "sqlserver" {
  name                         = "tom556sqlserver"
  resource_group_name          = azurerm_resource_group.resource_gp.name
  location                     = azurerm_resource_group.resource_gp.location
  version                      = "12.0"
  administrator_login          = "khdfd9898rerer"
  administrator_login_password = "4-v3ry-jlhdfdf89-p455w0rd"

  tags = {
    environment = "production"
  }
}

resource "azurerm_sql_virtual_network_rule" "sqlvnetrule" {
    name = "sql_vnet_rule"
    resource_group_name          = azurerm_resource_group.resource_gp.name
    server_name = azurerm_sql_server.sqlserver.name
    subnet_id = azurerm_subnet.db_subnet.id
  
}

resource "azurerm_subnet" "db_subnet" {
    name = "db_subnetn"
    resource_group_name     = azurerm_resource_group.resource_gp.name
    virtual_network_name    = azurerm_virtual_network.main.name
    address_prefixes        = ["10.0.2.0/24"]
    service_endpoints       = ["Microsoft.Sql"]
  
}

main.tf

resource "azurerm_resource_group" "resource_gp" {
  name="terraform_youtube"
  location = "UK South"

  tags = {
    "owner" = "Rahman"
    "purpose" = "Practice terraform"
  }
}


variable "prefix" {
  default = "tf_dev"
}


resource "azurerm_virtual_network" "main" {
  name                = "${var.prefix}-network"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.resource_gp.location
  resource_group_name = azurerm_resource_group.resource_gp.name
}

resource "azurerm_subnet" "internal" {
  name                 = "internal"
  resource_group_name  = azurerm_resource_group.resource_gp.name
  virtual_network_name = azurerm_virtual_network.main.name
  address_prefixes     = ["10.0.2.0/24"]
}

resource "azurerm_network_interface" "main" {
  name                = "${var.prefix}-nic"
  location            = azurerm_resource_group.resource_gp.location
  resource_group_name = azurerm_resource_group.resource_gp.name

  ip_configuration {
    name                          = "testconfiguration1"
    subnet_id                     = azurerm_subnet.internal.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_virtual_machine" "main" {
  name                  = "${var.prefix}-vm"
  location              = azurerm_resource_group.resource_gp.location
  resource_group_name   = azurerm_resource_group.resource_gp.name
  network_interface_ids = [azurerm_network_interface.main.id]
  vm_size               = "Standard_B1ls"

  # 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

  storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }
  storage_os_disk {
    name              = "myosdisk1"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }
  os_profile {
    computer_name  = "hostname"
    admin_username = "testadmin"
    admin_password = "Password1234!"
  }
  os_profile_linux_config {
    disable_password_authentication = false
  }
  tags = {
    environment = "staging"
  }
}

在我的环境中使用您的代码进行测试时出现了同样的错误。

要解决此问题,您需要将 db_subnetaddress_prefixes 更改为 ["10.0.3.0/24"],因为 ["10.0.2.0/24"] 地址范围已被您的 internal 子网使用main.tf 并检查 sqlvnetrule 的更新并在 dbcode.tf 文件中进行更改。

resource "azurerm_mssql_server" "sqlserver" {
  name                         = "tom556sqlserver"
  resource_group_name          = azurerm_resource_group.resource_gp.name
  location                     = azurerm_resource_group.resource_gp.location
  version                      = "12.0"
  administrator_login          = "khdfd9898rerer"
  administrator_login_password = "4-v3ry-jlhdfdf89-p455w0rd"

  tags = {
    environment = "production"
  }
}

resource "azurerm_subnet" "db_subnet" {
    name = "db_subnetn"
    resource_group_name     = azurerm_resource_group.resource_gp.name
    virtual_network_name    = azurerm_virtual_network.main.name
    address_prefixes        = ["10.0.3.0/24"]
    service_endpoints       = ["Microsoft.Sql"]
  
}

resource "azurerm_mssql_virtual_network_rule" "sqlvnetrule" {
    name = "sql_vnet_rule"
    #resource_group_name          = azurerm_resource_group.resource_gp.name
    #server_name = azurerm_sql_server.sqlserver.name
    server_id = azurerm_mssql_server.sqlserver.id
    subnet_id = azurerm_subnet.db_subnet.id
  
}