如何用Bicep创建带专用终结点的Azure PostgreSQL灵活服务器
部署带专用终结点且禁用公网访问的Azure PostgreSQL灵活服务器
Azure PostgreSQL灵活服务器的publicNetworkAccess设为Disabled时,有硬性要求:服务器必须已配置VNet集成(指定委托子网),或者已关联至少一个专用终结点。这就是你遇到的核心问题——直接禁用公网时专用终结点还没创建,而先启用公网后需确保专用终结点就绪才能修改状态。下面提供两种可行的部署方案:
方案一:一步部署(含VNet集成+专用终结点)
这种方式直接满足publicNetworkAccess: 'Disabled'的强制要求,同时配置专用终结点,无需分步骤操作。
核心步骤
- 创建已委托给
Microsoft.DBforPostgreSQL/flexibleServers的子网(用于VNet集成) - 创建禁用公网访问的PostgreSQL服务器,指定委托子网ID
- 创建专用终结点关联到服务器
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
相关产品推荐
相关产品推荐

