Terraform Azure - 将现有的 Azure SQL 数据库移动到弹性池中

Terraform Azure - Move an existing Azure SQL Database into an Elastic Pool

我有一个现有的 Azure SQL 服务器和 1 个最初未创建到弹性池中的数据库。 Terraform 已部署它并保持状态。

# Define SQL Server 1
resource "azurerm_mssql_server" "go-1" {
  name                          = "sql-sandbox-server01
  resource_group_name           = data.azurerm_resource_group.env-resourcegroup.name
  location                      = data.azurerm_resource_group.env-resourcegroup.location
  version                       = var.azsqlserver1version
  administrator_login           = var.azsqlserver1sauser
  administrator_login_password  = random_password.sql-password.result
  public_network_access_enabled = "true" # set to false with vNet integration
}
# Define SQL Database 1 - non-ElasticPool
resource "azurerm_mssql_database" "go-1" {
  name                = "sqldb-sandbox-01"
  server_id           = azurerm_mssql_server.go-1.id
  sku_name            = "Basic"
}

由于现在已经决定使用弹性池(对于这个单一数据库和其他数据库),数据库“sqldb-sandbox-01”现在已经有了表和数据。

我已将其添加到我的 main.tf 文件中...它工作正常,创建了弹性池...

resource "azurerm_sql_elasticpool" "go-1" {
  name                = "sqlep-sandbox-pool01
  resource_group_name = data.azurerm_resource_group.env-resourcegroup.name
  location            = data.azurerm_resource_group.env-resourcegroup.location
  server_name         = azurerm_mssql_server.go-1.name
  edition             = "Basic"
  dtu                 = 50
  db_dtu_min          = 0
  db_dtu_max          = 5
  pool_size           = 5000
}

我的问题是...如何将现有的“sqldb-sandbox-01”移动到 Terraform 中的弹性池中而不破坏数据库并重新创建它?

我试过了,只是添加了一行 elastic_pool_id,但正如文档所述,它将再次 destroy/create 数据库...

# Define SQL Database 1 - non-ElasticPool
resource "azurerm_mssql_database" "go-1" {
  name                = var.azsqldb1name
  server_id           = azurerm_mssql_server.go-1.id
  sku_name            = var.azsqldb1sku
  elastic_pool_id     = azurerm_sql_elasticpool.go-1.id
}

如果收到任何处于相同位置并设法找到方法的人的来信,我将不胜感激。

在 Azure 门户 GUI 中可以轻松实现将现有的同一服务器数据库移动到弹性池中,所以我希望这里有类似的东西。我四处搜索了一下,但没有找到与这个简单任务相关的任何内容。

提前致谢

对于现有的 Azure SQL 数据库和弹性池。在块中直接添加单行 elastic_pool_id 将强制创建新资源。甚至这种显示在 Azure 门户中也不明显。

您可以使用本地 PowerShell 脚本将现有数据库添加到新的弹性池中,而不是这样做。 local-exec provisioner 在创建资源后调用本地可执行文件。

这是我这边的工作示例。

resource "null_resource" "add_pool" {
 
  provisioner "local-exec" {

  command = <<-EOT
   Set-AzSqlDatabase `
   -ResourceGroupName "${azurerm_resource_group.example.name}" `
   -ServerName "${azurerm_mssql_server.example.name}" `
   -DatabaseName "${azurerm_mssql_database.test.name}" `
   -ElasticPoolName "${azurerm_sql_elasticpool.go-1.name}"
  EOT
    
  interpreter = ["PowerShell", "-Command"]

 }

}

经过大量测试,这实际上比预期的要容易。

我原来的数据库段是这样的...

# Define SQL Database 1 - non-ElasticPool
resource "azurerm_mssql_database" "go-1" {
  name                = var.azsqldb1name
  server_id           = azurerm_mssql_server.go-1.id
  sku_name            = "Basic"
}

手动将数据库移动到弹性池是有意义的,而不是尝试在代码中进行。

将数据库移动到弹性池后,我注意到数据库后面的 Azure ID 没有改变。

然后我更新了 Terraform,更改了 sku_name,并添加了 elastic_pool_id...

resource "azurerm_mssql_database" "go-1" {
  name                = var.azsqldb1name
  server_id           = azurerm_mssql_server.go-1.id
  sku_name            = "ElasticPool"
  elastic_pool_id     = azurerm_sql_elasticpool.go-1.id
}

运行 再次进行 Terraform 计划,未检测到基础架构更改,它已经运行并且不想破坏任何东西。

总结:手动将单机数据库迁移到弹性池

为有问题的数据库更新 Terraform,更改为...sku_name...并添加 elastic_pool_id

感谢所有帮助我解决这个问题的人