如何使用Azure备份库备份仅通过专用端点访问的Azure PostgreSQL单服务器实例?
看起来你遇到的核心问题不是凭证错误(毕竟你的业务服务能正常用这套凭证连接数据库,而且备份尝试时数据库日志连认证失败的记录都没有),而是Azure备份库的私有端点和你的PostgreSQL单服务器的私有网络之间没有打通网络连接——备份请求根本没到达数据库,自然不会产生认证日志,反而抛出了“认证失败”的误导性错误。
下面是一步步排查和解决的方法:
1. 确认网络连通性基础
首先要保证备份库的私有端点所在的虚拟网络,和PostgreSQL单服务器的私有端点/所在VNet满足以下条件之一:
- 两者在同一个虚拟网络内
- 两个VNet之间配置了VNet对等连接
- 两者通过VPN网关或ExpressRoute连通
如果网络根本没打通,备份库连数据库的IP都访问不到,自然无法完成认证步骤。
2. 检查PostgreSQL的私有DNS配置
Azure PostgreSQL单服务器用私有端点时,需要依赖Azure专用DNS区域来解析FQDN到私有IP。你需要:
- 确认已经创建了
postgres.database.azure.com的专用DNS区域 - 把备份库私有端点所在的VNet关联到这个DNS区域
- 可以在备份库VNet内的一台测试VM上,用
nslookup <server-name>.postgres.database.azure.com验证解析结果,确保返回的是PostgreSQL的私有IP,而不是公共IP
如果DNS解析错误,备份库会尝试连接公共IP,但你的PostgreSQL只开放私有端点,这就会导致连接失败,且数据库日志无记录。
3. 排查NSG和网络安全规则
检查以下几处的网络安全组(NSG)规则:
- PostgreSQL私有端点所在子网的NSG:允许来自备份库私有端点所在子网的5432端口入站流量
- 备份库私有端点所在子网的NSG:允许向PostgreSQL私有端点所在子网的5432端口出站流量
很多时候连接失败都是NSG规则阻挡了端口流量,尤其是默认的出站规则可能不允许自定义端口的访问。
4. 验证备份库的网络访问策略
进入你的Azure备份库,检查它的网络访问设置:
- 确认设置为“仅允许通过专用端点访问”(如果你的备份库是私有端点部署的话)
- 确保已经正确关联了对应的私有端点,没有遗漏配置
5. 模拟备份库的网络环境测试
在备份库私有端点所在的VNet里部署一台临时VM,安装psql客户端,用你存在Key Vault里的连接字符串尝试连接PostgreSQL:
psql "Server=<server-name>.postgres.database.azure.com;Database=<database>;Port=5432;User Id=<database>@<server-name>.postgres.database.azure.com;Password=<password>;Ssl Mode=Require;"
如果这个测试也连接失败,那就能确定是网络问题;如果测试成功,再排查Terraform配置或者备份库的身份权限(比如备份库的托管身份是否有权限读取Key Vault里的凭证)。
6. 确认Terraform配置细节
虽然你说连接字符串正确,但还是要检查Terraform中data_protection_backup_policy_postgresql资源的配置:
- 确认
database_credential引用的Key Vault secret确实是正确的连接字符串 - 检查备份实例是否关联了正确的备份库,且备份库的私有端点配置无误
按照这个流程排查,应该能解决网络连通的问题,让备份请求顺利到达数据库完成认证和备份操作。
备注:内容来源于stack exchange,提问作者Nagy Vilmos

