You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Terraform将Azure SQL数据库部署至非Terraform托管SQL Server实例

问题

在Azure上使用Terraform进行基础设施即代码(IaC)部署新服务时,需将数据库部署到非Terraform托管的SQL Server实例,执行terraform plan时出现以下错误:

parsing "" as an Server ID: parsing Azure ID: parse "": invalid URI for request

尝试过以下格式引用现有服务器,均无效:

  • server-name
  • /server-name
  • resource-group/server-name
  • /resource-group/server-name
  • Azure对象ID(guid)

当前数据库声明代码如下:

resource "azurerm_mssql_database" "xxxxxxxxxxx-dev" {
  name         = "xxxxxxxxxxx-dev"
  server_id    = "?????????"
  collation    = "SQL_Latin1_General_CP1_CI_AS"
  license_type = "LicenseIncluded"
  max_size_gb  = 2
  sku_name     = "S1"
  zone_redundant = false
  storage_account_type = "Local"
  
  # entra admin is on the server level only

  tags = {
    servicename = "xxx"
  }

  # prevent the possibility of accidental data loss
  lifecycle {
    prevent_destroy = true
  }
}

解决方案

方式一:直接填写完整Azure资源ID

server_id字段必须传入SQL Server实例的完整Azure资源URI,格式为:

/subscriptions/<订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.Sql/servers/<SQL Server名称>

你可以通过两种途径获取该ID:

  • 登录Azure门户,进入目标SQL Server实例的「概述」页面,复制「资源ID」字段内容
  • 执行Azure CLI命令:
az sql server show --name <你的SQL Server名称> --resource-group <资源组名称> --query id --output tsv

将获取到的完整ID填入代码,示例:

server_id = "/subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-dev-rg/providers/Microsoft.Sql/servers/my-existing-sql-server"

方式二:使用Terraform数据源引用(推荐)

若不想硬编码资源ID,可通过azurerm_mssql_server数据源自动读取现有服务器的ID,提升配置的可维护性:

# 定义数据源获取现有SQL Server信息
data "azurerm_mssql_server" "existing_sql_server" {
  name                = "<你的SQL Server名称>"
  resource_group_name = "<资源组名称>"
}

resource "azurerm_mssql_database" "xxxxxxxxxxx-dev" {
  name         = "xxxxxxxxxxx-dev"
  server_id    = data.azurerm_mssql_server.existing_sql_server.id # 引用数据源的ID
  collation    = "SQL_Latin1_General_CP1_CI_AS"
  license_type = "LicenseIncluded"
  max_size_gb  = 2
  sku_name     = "S1"
  zone_redundant = false
  storage_account_type = "Local"
  
  tags = {
    servicename = "xxx"
  }

  lifecycle {
    prevent_destroy = true
  }
}

这种方式无需手动复制资源ID,Terraform会自动查询并关联现有服务器,适合多环境部署场景。

内容的提问来源于stack exchange,提问作者DaveDean1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:13:12