禁用公网访问的Azure Synapse Workspace防火墙及角色分配问题
问题情况
- 已通过Terraform创建禁用公网访问的Azure Synapse Workspace,多数资源部署完成。
- 尝试添加防火墙规则时,不管是Azure门户还是Terraform都失败,报错:
Failure sending request: StatusCode=400 -- Original Error: Code='PublicNetworkAccessDenied' Message='Unable to create or modify firewall rules when public network interface for the Synapse Workspace is disabled. To manage firewall rules, please enable the public network access.'
- 试过在门户开启公网访问,但部署失败,Workspace状态异常且找不到相关部署记录,只能重新创建禁用公网的Workspace。
- 移除防火墙规则相关代码后,Synapse角色分配操作又失败,报错:
│ Error: listing synapse role definitions accesscontrol.RoleDefinitionsClient#ListRoleDefinitions: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="PublicNetworkAccessDenied" Message="The public network interface on this Workspace is not accessible. To connect to this Workspace, use the Private Endpoint from inside your virtual network or enable public network access for this workspace."
│
│ with module.synapse.azurerm_synapse_role_assignment.this["synapse-administrator"],
│ on .terraform/modules/synapse/rbac.tf, in resource "azurerm_synapse_role_assignment" "this":
│ resource "azurerm_synapse_role_assignment" "this" {
推测问题出在运行Pipeline的自托管代理无法访问私有Synapse Workspace。
可行解决方案
1. 把自托管代理部署到Synapse所在的虚拟网络里
- 将运行Terraform的自托管代理虚拟机部署到Synapse Workspace关联的VNet中,让代理处于私有网络环境,就能通过私有端点访问Synapse资源。
- 这样Terraform执行角色分配、资源管理时,请求走私有网络路由,不会触发公网访问限制。
2. 临时开启公网访问完成部署后再禁用
- 在Terraform部署流程中,先设置
public_network_access_enabled = true,完成防火墙规则配置、角色分配等操作后,再改成public_network_access_enabled = false。 - 注意:临时开启公网访问要做好安全控制,比如加临时防火墙规则,只允许自托管代理的公网IP访问。
- 示例代码片段:
resource "azurerm_synapse_workspace" "example" { # 其他配置保持不变 public_network_access_enabled = true # 临时开启公网访问 } # 先部署防火墙规则、角色分配等依赖资源 # 后续更新配置禁用公网访问 resource "azurerm_synapse_workspace" "example" { # 其他配置不变 public_network_access_enabled = false }
3. 用Azure Private Link连接代理网络和Synapse VNet
- 如果自托管代理在另一个VNet里,可通过Azure Private Link建立两个VNet的私有连接,让代理能访问Synapse的私有端点。
- 配置Synapse的私有端点,然后在代理所在VNet创建私有链接端点,建立连接后就能实现私有网络内的访问。
4. 用Azure Cloud Shell执行Terraform部署
- Azure Cloud Shell运行在Azure内部网络,能直接访问启用私有端点的Synapse Workspace。
- 把Terraform代码上传到Cloud Shell或关联的存储账户,在Shell里执行
terraform init、terraform apply等命令,就能完成角色分配等操作。
内容的提问来源于stack exchange,提问作者Tito

