Go Lambda查询Aurora Serverless实例执行SQL时出现超时如何解决?
核心问题排查方向
- 首先检查DSN必填参数缺失:你当前的DSN没有加
sslmode=require参数,AWS RDS PostgreSQL默认要求SSL连接,缺少该参数会导致握手直接失败,表现为超时。修改DSN构造代码即可:
dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=require", dbHost, dbPort, dbUser, authToken, dbName, )
另外sql.Open方法仅初始化数据库驱动实例,不会实际建立连接,建议调用后主动加Ping()验证建联状态,提前暴露问题:
db, err := sql.Open("postgres", dsn) if err != nil { return nil, err } if err = db.Ping(); err != nil { return nil, err } return db, nil
网络配置校验
- 确认Lambda是否配置了和Aurora Serverless相同VPC下的子网,且子网路由可以访问Aurora的地址
- 确认Lambda安全组的出站规则开放了5432端口的TCP访问,Aurora的安全组入站规则允许来自Lambda安全组的5432端口TCP访问
- 如果Aurora未开启公网访问,不要把Lambda放到公网子网,否则会出现路由不通的情况
IAM认证相关配置校验
- 确认你的Aurora集群已经开启了IAM数据库认证功能,该配置默认关闭
- 确认Lambda的执行角色已经附加了
rds-db:connect权限,权限对应的资源需匹配你的集群ID、区域、账号和用户名,示例策略如下:
{ "Effect": "Allow", "Action": "rds-db:connect", "Resource": "arn:aws:rds-db:us-east-2:<你的AWS账号ID>:dbuser:<你的Aurora集群资源ID>/app_user" }
- 超时时间配置校验
- 如果你使用的是Aurora Serverless v1,集群长时间无访问会自动暂停,首次唤醒需要10~30秒,需将Lambda的超时时间调整到30秒以上,避免唤醒过程中触发Lambda超时
- 可以给数据库操作加显式的上下文超时,避免无限制等待:
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() err = db.QueryRowContext(ctx, "Select 1").Scan(&result)
内容的提问来源于stack exchange,提问作者Mike Nishizawa
相关产品推荐
相关产品推荐

