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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:01:05