hashicorp / terraform-provider-azurerm

Terraform provider for Azure Resource Manager
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs
Mozilla Public License 2.0
4.48k stars 4.56k forks source link

mysql_flexible_server FQDN not as expected when using privateDNS #22633

Open joris-weijters opened 1 year ago

joris-weijters commented 1 year ago

Is there an existing issue for this?

Community Note

Terraform Version

1.3.4

AzureRM Provider Version

3.29.0

Affected Resource(s)/Data Source(s)

azurerm_mysql_flexible_server

Terraform Configuration Files

# in this code I follow the example of https://learn.microsoft.com/en-us/azure/mysql/flexible-server/quickstart-create-terraform?tabs=azure-cli#implement-the-terraform-code

resource "azurerm_resource_group" "rg" {
  name     = "rg-example-test-mysql"
  location = "West Europe"

  tags = {
    "Author" = "JW"
    "Owner"  = "JW"
  }
}

# Generate random value for the name
resource "random_string" "name" {
  length  = 8
  lower   = true
  numeric = false
  special = false
  upper   = false
}

# Generate random value for the login password
resource "random_password" "password" {
  length           = 8
  lower            = true
  min_lower        = 1
  min_numeric      = 1
  min_special      = 1
  min_upper        = 1
  numeric          = true
  override_special = "_"
  special          = true
  upper            = true
}

# Create VNET
resource "azurerm_virtual_network" "mysql-vnet" {
  name                = "mysql-network"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  address_space       = ["10.0.0.0/16"]
  dns_servers         = ["10.0.0.4", "10.0.0.5"]

  tags = {
    environment = "test"
    author : "JW"
  }
}

# Manages the Subnet
resource "azurerm_subnet" "sn_mysql" {
  address_prefixes     = ["10.0.1.0/24"]
  name                 = "subnet_mysql"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.mysql-vnet.name
  service_endpoints    = ["Microsoft.Storage"]

  delegation {
    name = "fs"

    service_delegation {
      name = "Microsoft.DBforMySQL/flexibleServers"
      actions = [
        "Microsoft.Network/virtualNetworks/subnets/join/action",
      ]
    }
  }
}

# Enables you to manage Private DNS zones within Azure DNS
resource "azurerm_private_dns_zone" "mysqldns" {
  name                = "privatelink.mysql.database.azure.com"
  resource_group_name = azurerm_resource_group.rg.name
}

# Enables you to manage Private DNS zones within Azure DNS
resource "azurerm_private_dns_zone" "exampledns" {
  name                = "example.mysql.database.azure.com"
  resource_group_name = azurerm_resource_group.rg.name
}

# Enables you to manage Private DNS zone Virtual Network Links
resource "azurerm_private_dns_zone_virtual_network_link" "mysqldnslink" {
  name                  = "mysqlfsVnetZone.com"
  private_dns_zone_name = azurerm_private_dns_zone.mysqldns.name
  resource_group_name   = azurerm_resource_group.rg.name
  virtual_network_id    = azurerm_virtual_network.mysql-vnet.id
}

# Enables you to manage Private DNS zone Virtual Network Links
resource "azurerm_private_dns_zone_virtual_network_link" "examplednslink" {
  name                  = "examplefsVnetZone.com"
  private_dns_zone_name = azurerm_private_dns_zone.exampledns.name
  resource_group_name   = azurerm_resource_group.rg.name
  virtual_network_id    = azurerm_virtual_network.mysql-vnet.id
}

# Manages the MySQL Flexible Server
resource "azurerm_mysql_flexible_server" "test_mysql" {
  location                     = azurerm_resource_group.rg.location
  name                         = "mysql-mconsole-accept-003"
  resource_group_name          = azurerm_resource_group.rg.name
  administrator_login          = random_string.name.result
  administrator_password       = random_password.password.result
  backup_retention_days        = 7
  delegated_subnet_id          = azurerm_subnet.sn_mysql.id
  geo_redundant_backup_enabled = false
  private_dns_zone_id          = azurerm_private_dns_zone.exampledns.id
  sku_name                     = "GP_Standard_D4ds_v4"
  version                      = "8.0.21"
  zone                         = "2"

  high_availability {
    mode                      = "ZoneRedundant"
    standby_availability_zone = "3"
  }
  maintenance_window {
    day_of_week  = 0
    start_hour   = 8
    start_minute = 0
  }
  storage {
    iops    = 360
    size_gb = 20
  }

  depends_on = [azurerm_private_dns_zone_virtual_network_link.mysqldnslink]
}

output "mysql_example_fqdn" {
  value = azurerm_mysql_flexible_server.test_mysql.fqdn
}

Debug Output/Panic Output

run was successful however unexpected result

Expected Behaviour

I expected the output to be: mysql-mconsole-accept-003.example.mysql.database.azure.com

Actual Behaviour

The output is: mysql-mconsole-accept-003.mysql.database.azure.com

Steps to Reproduce

No response

Important Factoids

No response

References

https://learn.microsoft.com/en-us/azure/mysql/flexible-server/quickstart-create-terraform?tabs=azure-cli#implement-the-terraform-code

neil-yechenwei commented 1 year ago

Thanks for raising this issue. Seems it's by service API design since Terraform doesn't change that value returned by azure rest api.