如何用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
相关产品推荐
相关产品推荐

