配置Lambda函数连接RDS Proxy遇权限及超时问题求助
问题解决方案
一、权限问题修复
你收到的警告明确指向Lambda执行角色缺少RDS Proxy的访问权限,当前附加的AWSLambdaSQSQueueExecutionRole和AWSLambdaVPCAccessExecutionRole不包含RDS Proxy相关权限,需要补充以下配置:
- 给Lambda执行角色(LambdaTest)添加自定义权限策略,核心权限如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["rds-db:connect"], "Resource": ["arn:aws:rds-db:你的区域:你的账号ID:dbuser:proxy-xxx/*"] } ] }
替换其中的你的区域、你的账号ID和proxy-xxx为实际的RDS Proxy标识符。
- 无需额外添加VPC相关权限,
AWSLambdaVPCAccessExecutionRole已包含ec2:CreateNetworkInterface等必要操作。
二、Lambda代码问题修复
你的代码存在两个关键问题,这也是超时的重要诱因:
- 全局连接复用风险:Lambda执行环境会被复用,但
createConnection在函数外部初始化,多次执行时易导致连接失效或异常。 - 异步操作未等待:
connection.connect()是异步操作,未用await等待连接建立就执行查询,会引发未预期的错误或超时。
修复后的代码:
var mysql = require('mysql'); const dbConfig = { host: 'RDS_PROXY_ENDPOINT', // 注意:这里必须填RDS Proxy的端点,而非RDS实例地址 user: 'user', password: 'password', port: XXXX, database: 'database', debug: false, }; exports.handler = async (event, context) => { let connection; try { // 在handler内部创建连接,避免复用异常 connection = mysql.createConnection(dbConfig); // 等待连接建立完成 await new Promise((resolve, reject) => { connection.connect((err) => err ? reject(err) : resolve()); }); const query = 'SELECT * FROM Therapists'; const results = await executeQuery(connection, query); return { statusCode: 200, body: JSON.stringify(results) }; } catch (err) { return { statusCode: 500, error: err.message }; } finally { // 确保无论成功失败都关闭连接 connection?.end(); } } // 传入当前连接,避免全局连接依赖 function executeQuery(connection, query) { return new Promise((resolve, reject) => { connection.query(query, (error, results) => { error ? reject(error) : resolve(results); }); }); }
三、额外检查项
- 确认
dbConfig.host使用的是RDS Proxy端点,而非RDS实例地址,否则未真正通过Proxy连接数据库。 - 检查RDS Proxy安全组是否允许Lambda所在安全组的入站连接(端口为数据库端口)。
- 延长Lambda超时时间至1分钟以上,同时确认RDS Proxy的连接超时配置合理。
- 验证RDS Proxy目标组已关联正常运行的RDS实例。
内容的提问来源于stack exchange,提问作者Gwen Blainbridge
相关产品推荐
相关产品推荐

