Lambda连接同VPC内RDS PostgreSQL报错:no pg_hba.conf entry
Lambda连接RDS PostgreSQL失败排查与解决
问题背景
Lambda与RDS PostgreSQL实例处于同一VPC,已配置连接所需IAM权限,尝试密码认证和IAM认证两种方式连接数据库并查询数据,均报错。RDS已设置允许所有主机连接。
Lambda代码
export const handler = async (event) => { console.log("hereeeeee"); const dbConfig = { host: ENDPOINT_URL, port: 5432, database: DATABASE_NAME, user: USERNAME, }; const signer = new Signer({ region: MY_REGION, hostname: ENDPOINT_URL, port: dbConfig.port, username: dbConfig.user, }); try { const token = await signer.getAuthToken(); console.log("Generated token"); dbConfig.password = token; } catch (error) { console.log(error); } const client = new Client(dbConfig); try { await client.connect(); console.log("Connected"); const query = "SELECT * FROM your_table_name;"; const result = await client.query(query); console.log(result); return { statusCode: 200, body: JSON.stringify(result.rows), }; } catch (error) { console.log(error); return { statusCode: 500, body: JSON.stringify({ message: "Error fetching data from the database", }), }; } finally { await client.end(); } };
错误日志
error: no pg_hba.conf entry for host "49.43.242.150", user "username", database "databasename", no encryption . . . at TCP.onStreamRead (node:internal/stream_base_commons:190:23) { length: 162, severity: 'FATAL', code: '28000', detail: undefined, hint: undefined, position: undefined, internalPosition: undefined, internalQuery: undefined, where: undefined, schema: undefined, table: undefined, column: undefined, dataType: undefined, constraint: undefined, file: 'auth.c', line: '543', routine: 'ClientAuthentication' }
解决步骤
1. 强制启用SSL连接
错误提示明确指出no encryption,PostgreSQL默认要求SSL连接(尤其是IAM认证场景),需在数据库配置中添加SSL参数:
const dbConfig = { host: ENDPOINT_URL, port: 5432, database: DATABASE_NAME, user: USERNAME, ssl: { rejectUnauthorized: false } // 测试环境可临时关闭证书验证,生产环境建议配置CA证书 };
生产环境中,建议下载对应区域的RDS CA证书,配置
ca参数指向证书内容,保障连接安全性。
2. 验证RDS的IAM认证配置
- 确认RDS实例已启用IAM数据库认证:在RDS控制台实例详情的「连接」标签下,检查「IAM数据库认证」状态为启用。
- 为数据库用户赋予IAM认证权限:执行以下SQL语句:
GRANT rds_iam TO username;
3. 检查VPC安全组规则
- 确保Lambda所在安全组允许出站访问RDS的5432端口。
- 确保RDS实例安全组允许来自Lambda安全组的5432端口入站流量。
注:即使RDS设置允许所有主机连接,VPC内部安全组规则优先级更高,需保证双向流量放行。
4. 密码认证场景额外检查
若使用密码认证而非IAM令牌,需确认:
- 数据库用户密码正确且未过期。
- 避免IAM认证代码分支覆盖密码,可通过条件判断区分两种认证方式。
内容的提问来源于stack exchange,提问作者Ravi Ranjan Ojha
相关产品推荐
相关产品推荐

