Lambda无法连接同VPC内的RDS PostgreSQL实例问题求助
问题
部署了一款收集生产系统测试执行数据的服务,通过Lambda函数尝试连接同一VPC内的RDS PostgreSQL数据库。目前pgAdmin可正常连接数据库,但Lambda函数无论是使用IAM认证生成的token还是直接用密码认证,都报错:Exception: panic: pq: password authentication failed for user
Lambda连接数据库的代码如下:
func initDB(host, user, dbname string, port int) *sql.DB { dbHost := host var dbName string = dbname var dbUser string = user var dbPort int = port var dbEndpoint string = fmt.Sprintf("%s:%d", dbHost, dbPort) var region string = "us-east-1" cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region)) if err != nil { panic("configuration error: " + err.Error()) } authenticationToken, err := auth.BuildAuthToken( context.TODO(), dbEndpoint, region, dbUser, cfg.Credentials) if err != nil { panic("failed to create authentication token: " + err.Error()) } dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s", dbHost, dbPort, dbUser, authenticationToken, dbName, ) db, err := sql.Open("postgres", dsn) if err != nil { panic(err) } err = db.Ping() if err != nil { panic(err) // fails here } return db }
排查与解决步骤
1. 验证Lambda的VPC网络配置
- 确认Lambda已配置到RDS所在的VPC、子网和安全组,子网需与RDS实例在同一VPC且具备访问RDS的路径
- 检查安全组规则:RDS安全组需允许Lambda所在安全组的5432端口(PostgreSQL默认端口)入站;Lambda安全组需允许5432端口出站
- 确认网络ACL未限制Lambda与RDS之间的双向5432端口流量
2. IAM认证模式专属检查
如果用IAM token认证,需确认以下几点:
- RDS实例已启用IAM数据库认证:在RDS控制台实例详情的「配置」标签中,确认「IAM数据库认证」为开启状态
- Lambda执行角色拥有
rds-db:connect权限,示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rds-db:connect", "Resource": "arn:aws:rds-db:us-east-1:你的AWS账号ID:dbuser:你的RDS实例ID/目标数据库用户名" } ] }
- 数据库用户已关联IAM角色:通过pgAdmin连接数据库后执行SQL:
GRANT rds_iam TO 你的数据库用户名;
- 修正DSN的SSL配置:RDS PostgreSQL默认要求SSL连接,需在DSN中添加
sslmode=require,修改后的DSN代码:
dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=require", dbHost, dbPort, dbUser, authenticationToken, dbName, )
3. 密码认证模式专属检查
如果用密码认证,需确认:
- Lambda环境变量中的密码与pgAdmin使用的完全一致,注意大小写、特殊字符的转义问题
- 检查RDS参数组的
password_encryption配置:若设置为scram-sha-256,需确保PostgreSQL驱动支持该加密方式(建议升级github.com/lib/pq到最新版本,或改用github.com/jackc/pgx驱动) - 重置数据库用户密码后重新测试,排除密码输入错误的可能
4. 代码与凭证检查
- 确认代码中的
region参数与RDS实例所在区域完全匹配(代码中为us-east-1,需核对RDS实际区域) - Lambda运行时会自动注入IAM凭证,确保
config.LoadDefaultConfig正确加载了默认凭证,无额外配置错误
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

