目前我正在尝试使用 Terraform 在 Azure 中部署一些基础设施。到目前为止一切都很顺利。然而,当尝试将 Synapse Analytics 中的链接服务部署到 Key Vault 和 Azure Blob 存储(通用 v2)时,它们似乎可以工作,但存在一个问题:Synapse 是使用托管 Vnet 进行部署的,而链接服务是使用 Terraform 创建的请勿使用与 Synapse 默认创建的链接服务不同的专用端点。
resource "azurerm_synapse_linked_service" "blob_ls" {
name = "BLOBLinkedService${var.env_prefix}"
synapse_workspace_id = azurerm_synapse_workspace.compass-syn-ws.id
type = "AzureBlobStorage"
type_properties_json = <<JSON
{
"serviceEndpoint": "${azurerm_storage_account.compass_storage_account_blob.primary_blob_endpoint}",
"accountKind": "StorageV2"
}
JSON
depends_on = [azurerm_storage_account.compass_storage_account_blob, azurerm_synapse_workspace.compass-syn-ws, azapi_update_resource.approval_storage_blob]
}
我目前最好的猜测是,它不起作用,因为 Terraforms 的 Synapse 链接服务代码块没有选项来指定我在部署时创建附加链接服务时要使用 Synapse 的托管身份。如果我在这一点上错了,请告诉我。然而,我认为这是正确的,因为当我使用 Synapse 的托管标识而不是帐户密钥在 Terraform 外部手动重新创建链接服务时,链接服务将按预期使用托管专用端点。
问题有哪些可能的解决方案?我花了一整天的时间寻找答案。如有任何帮助,我们将不胜感激。
我尝试通过 Terraform 部署修改 JSON 结构,方法是尝试通过 Synapse 链接服务代码块的 type_properties_json 关键字将相关信息添加到链接服务 JSON 结构。这不起作用,但我不希望它按照我的理解只影响链接服务定义的 JSON 结构的 type.properties 部分。此外,我正在考虑使用 AzAPI 提供程序对链接服务定义的相关 JSON 结构进行手动更改。 对于这个问题有更优雅的解决方案吗?我想不出任何其他解决方案。
我似乎找不到有关使用 Terraform 的链接服务和托管身份主题的任何官方信息。既不在 Hashicorps Terraform 注册表上,也不在任何开放/已解决的 GitHub 问题上。然而,这个问题并不那么小众,以至于不应该有更多的人在寻找解决方案。
更新:我已经进行了更多测试,它似乎与托管身份和访问密钥的使用无关。 Terraform 只是不使用我创建和批准的专用端点。我认为这可能是一个排序错误,因此当创建并批准私有端点时,我在 Terraform 脚本的末尾创建了链接服务。然而,这并没有改变什么。 有没有办法在创建链接服务时强制 Terraform 使用专用端点?我似乎找不到这方面的信息。
我自己找到了解决方法。我保留了“错误的”链接服务部署,然后通过运行 az 命令的空资源更新了 JSON 结构的内容,该命令引用正确的 JSON 结构并相应地更新它。
resource "null_resource" "update_linked_service_blob" {
triggers = {
always_run = timestamp()
}
provisioner "local-exec" {
command = <<EOT
az synapse linked-service update --workspace-name enternamehere --name enterlsnamehere --file @${var.json_path_blob}
EOT
}
}