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

如何用Bicep创建带专用终结点的Azure PostgreSQL灵活服务器

部署带专用终结点且禁用公网访问的Azure PostgreSQL灵活服务器

Azure PostgreSQL灵活服务器的publicNetworkAccess设为Disabled时,有硬性要求:服务器必须已配置VNet集成(指定委托子网),或者已关联至少一个专用终结点。这就是你遇到的核心问题——直接禁用公网时专用终结点还没创建,而先启用公网后需确保专用终结点就绪才能修改状态。下面提供两种可行的部署方案:

方案一:一步部署(含VNet集成+专用终结点)

这种方式直接满足publicNetworkAccess: 'Disabled'的强制要求,同时配置专用终结点,无需分步骤操作。

核心步骤

  1. 创建已委托给Microsoft.DBforPostgreSQL/flexibleServers的子网(用于VNet集成)
  2. 创建禁用公网访问的PostgreSQL服务器,指定委托子网ID
  3. 创建专用终结点关联到服务器

Bicep代码示例

// 基础参数定义
param location string = resourceGroup().location
param serverName string = 'postgres-flex-${uniqueString(resourceGroup().id)}'
param adminLogin string = 'pgadmin'
@secure()
param adminPassword string
param vnetName string = 'postgres-vnet'
param delegatedSubnetName string = 'postgres-delegated-subnet'
param privateEndpointSubnetName string = 'pe-subnet'
param privateEndpointName string = 'postgres-pe'

// 创建虚拟网络(包含两个子网:一个用于VNet集成,一个用于专用终结点)
resource vnet 'Microsoft.Network/virtualNetworks@2023-09-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: ['10.0.0.0/16']
    }
    subnets: [
      // 委托子网:用于服务器VNet集成
      {
        name: delegatedSubnetName
        properties: {
          addressPrefix: '10.0.0.0/24'
          delegations: [
            {
              name: 'postgresql-delegation'
              properties: {
                serviceName: 'Microsoft.DBforPostgreSQL/flexibleServers'
              }
            }
          ]
        }
      }
      // 专用终结点子网:无需委托,但需禁用网络策略
      {
        name: privateEndpointSubnetName
        properties: {
          addressPrefix: '10.0.1.0/24'
          privateEndpointNetworkPolicies: 'Disabled'
        }
      }
    ]
  }
}

// 创建PostgreSQL灵活服务器(禁用公网访问)
resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2023-12-01' = {
  name: serverName
  location: location
  sku: {
    name: 'Standard_D2s_v3'
    tier: 'GeneralPurpose'
    capacity: 2
  }
  properties: {
    administratorLogin: adminLogin
    administratorLoginPassword: adminPassword
    version: '14'
    storage: {
      storageSizeGB: 32
    }
    network: {
      publicNetworkAccess: 'Disabled'
      delegatedSubnetResourceId: vnet.subnets[0].id
    }
  }
}

// 创建专用终结点
resource privateEndpoint 'Microsoft.Network/privateEndpoints@2023-09-01' = {
  name: privateEndpointName
  location: location
  properties: {
    subnet: {
      id: vnet.subnets[1].id
    }
    privateLinkServiceConnections: [
      {
        name: 'postgres-pe-connection'
        properties: {
          privateLinkServiceId: postgresServer.id
          groupIds: ['postgresqlServer']
        }
      }
    ]
  }
  dependsOn: [postgresServer]
}

方案二:分两步部署(仅用专用终结点,无VNet集成)

如果不需要VNet集成,仅靠专用终结点实现禁用公网访问,可分两次部署:

第一步:创建服务器(启用公网)+ 专用终结点

// 基础参数定义
param location string = resourceGroup().location
param serverName string = 'postgres-flex-${uniqueString(resourceGroup().id)}'
param adminLogin string = 'pgadmin'
@secure()
param adminPassword string
param vnetName string = 'postgres-vnet'
param privateEndpointSubnetName string = 'pe-subnet'
param privateEndpointName string = 'postgres-pe'

// 创建虚拟网络和专用终结点子网
resource vnet 'Microsoft.Network/virtualNetworks@2023-09-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: ['10.0.0.0/16']
    }
    subnets: [
      {
        name: privateEndpointSubnetName
        properties: {
          addressPrefix: '10.0.0.0/24'
          privateEndpointNetworkPolicies: 'Disabled'
        }
      }
    ]
  }
}

// 创建启用公网访问的PostgreSQL服务器
resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2023-12-01' = {
  name: serverName
  location: location
  sku: {
    name: 'Standard_D2s_v3'
    tier: 'GeneralPurpose'
    capacity: 2
  }
  properties: {
    administratorLogin: adminLogin
    administratorLoginPassword: adminPassword
    version: '14'
    storage: {
      storageSizeGB: 32
    }
    network: {
      publicNetworkAccess: 'Enabled'
    }
  }
}

// 创建专用终结点
resource privateEndpoint 'Microsoft.Network/privateEndpoints@2023-09-01' = {
  name: privateEndpointName
  location: location
  properties: {
    subnet: {
      id: vnet.subnets[0].id
    }
    privateLinkServiceConnections: [
      {
        name: 'postgres-pe-connection'
        properties: {
          privateLinkServiceId: postgresServer.id
          groupIds: ['postgresqlServer']
        }
      }
    ]
  }
  dependsOn: [postgresServer]
}

第二步:更新服务器,禁用公网访问

等专用终结点完全创建就绪后,部署以下代码修改服务器网络配置:

param serverName string
param location string = resourceGroup().location

// 引用已存在的服务器
resource postgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2023-12-01' existing = {
  name: serverName
  location: location
}

// 更新服务器网络配置,禁用公网访问
resource updatedPostgresServer 'Microsoft.DBforPostgreSQL/flexibleServers@2023-12-01' = {
  name: serverName
  location: location
  sku: postgresServer.sku
  properties: {
    administratorLogin: postgresServer.properties.administratorLogin
    version: postgresServer.properties.version
    storage: postgresServer.properties.storage
    network: {
      publicNetworkAccess: 'Disabled'
    }
  }
}

关键注意事项

  • 方案一中的委托子网和专用终结点子网必须为不同的子网
  • 方案二的第二步必须等待专用终结点状态变为Available后再执行,否则会触发Azure的校验错误
  • 专用终结点所在的子网必须设置privateEndpointNetworkPolicies: 'Disabled',否则无法创建专用终结点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:15:58