AWS部署Serverless函数无法连接同VPC内Prisma Postgres RDS
AWS Lambda 连接同VPC私有子网RDS失败排查方案
报错核心为Prisma客户端无法连通RDS的5432端口,结合描述的网络架构,按以下优先级逐一排查即可定位问题:
1. 安全组规则(占此类问题80%以上)
- RDS绑定的安全组入站规则:必须放通Lambda所绑定安全组的5432端口TCP访问。当前能通过公网EC2跳板连接RDS,仅代表RDS安全组放通了EC2的IP或对应安全组,和Lambda的访问权限无关。
- Lambda绑定的安全组出站规则:若未做过自定义出站限制,默认全放通规则可满足需求;如果做过出站白名单配置,必须放通到RDS安全组的5432端口TCP出站权限。
注意:安全组授权时优先指定安全组ID作为源/目标,不要写死IP段,避免VPC内IP变动导致规则失效。
2. Lambda VPC配置校验
- 子网配置校验:同VPC访问RDS的最优实践是将Lambda部署到和RDS相同可用区的私有子网。如果Lambda部署在公有子网,必须开启Lambda的公网IP自动分配并绑定弹性IP,否则公有子网内的Lambda没有网络转发能力,无法访问同VPC其他子网资源。
- 路由表校验:Lambda所在子网关联的路由表中,目标为当前VPC网段的路由必须指向
local(VPC默认路由),确保VPC内网流量不经过NAT网关、互联网网关转发,避免内网流量被路由到公网导致不通。
3. RDS网络配置校验
- 子网组校验:确认RDS关联的数据库子网组确实覆盖Lambda部署的可用区,避免跨可用区路由缺失。可在和Lambda同子网的EC2实例上执行
nslookup xxxx.yyyy.us-east-1.rds.amazonaws.com,核对返回的IP地址是否属于RDS所在私有子网的CIDR段,确认RDS域名解析到内网地址。 - 访问控制校验:如果自定义过RDS的PostgreSQL参数组,需要核对
pg_hba.conf对应的访问规则没有拦截VPC内网段的数据库连接请求,默认RDS配置是放通整个VPC内网访问的。
4. Lambda执行权限校验
Lambda接入VPC需要通过创建弹性网卡实现网络挂载,如果执行角色缺少对应的VPC操作权限,会出现弹性网卡创建失败、网络隐性不通的问题,需确保执行角色附带以下权限:
{ "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": "*" }
5. 连通性验证(排除应用层问题)
完成以上配置检查后,先部署测试函数验证底层网络连通性,排除Prisma配置、数据库账号密码等应用层问题,测试代码如下:
const net = require('net'); exports.handler = async () => { const socket = net.createConnection({ host: 'xxxx.yyyy.us-east-1.rds.amazonaws.com', port: 5432 }); return new Promise((resolve) => { socket.on('connect', () => { socket.end(); resolve('数据库5432端口连通成功'); }); socket.on('error', (err) => { resolve(`连通失败: ${err.message}`); }); setTimeout(() => resolve('连接超时,网络层不通'), 5000); }) }
如果测试函数返回连通失败,可确定问题出在网络层,和Prisma客户端、数据库业务配置无关;如果连通成功,再排查Prisma的数据库连接串配置、数据库账号权限即可。
内容的提问来源于stack exchange,提问作者agusgambina
相关产品推荐
相关产品推荐

