如何从Lambda连接Aurora MySQL V3.01.0并查询数据?
从Lambda连接Aurora MySQL V3.01.0的可行方案(Typescript)
直接通过VPC网络连接(替代废弃的Data API)
现在Data API已不再推荐使用,直接通过VPC网络连接是当前适配Aurora MySQL V3的标准方案:
- 将Lambda部署到Aurora所在的VPC(或通过VPC peering打通网络),确保网络可达。
- 配置安全组:
- Aurora安全组开放3306端口,允许Lambda所在安全组的入站流量。
- Lambda安全组允许出站到3306端口。
- 给Lambda添加
AWSLambdaVPCAccessExecutionRole权限策略,确保它能访问VPC内的网络资源。
Typescript代码示例(使用mysql2库)
用mysql2这个活跃维护的MySQL客户端库,支持Promise和Typescript,代码如下:
import * as mysql from 'mysql2/promise'; // 从环境变量读取配置,避免硬编码敏感信息 const dbConfig = { host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, port: 3306, // 适配Burstable实例的连接配置 connectTimeout: 10000, waitForConnections: true, connectionLimit: 2, // 控制连接数,避免Burstable实例CPU过载 queueLimit: 0 }; // 创建连接池,复用连接提升Lambda执行效率 const pool = mysql.createPool(dbConfig); export const handler = async (event: any) => { let connection; try { connection = await pool.getConnection(); // 替换成你的目标查询语句 const [rows] = await connection.execute('SELECT * FROM your_target_table LIMIT 10'); return { statusCode: 200, body: JSON.stringify({ data: rows }) }; } catch (error) { console.error('数据库查询出错:', error); return { statusCode: 500, body: JSON.stringify({ error: '查询数据库失败' }) }; } finally { // 释放连接回池,避免资源泄漏 if (connection) connection.release(); } };
关键注意事项
- 敏感信息管理:不要把数据库密码硬编码在代码里,优先用Lambda环境变量存储,或者用AWS Secrets Manager动态获取(需给Lambda添加对应权限)。
- Burstable实例优化:这类实例CPU有积分限制,连接池的
connectionLimit不要设太高,避免瞬间高并发导致CPU耗尽、连接超时。 - 冷启动优化:VPC内的Lambda冷启动时间会更长,如果对延迟敏感,可以开启Lambda预留并发。
- 权限检查:Lambda执行角色除了VPC访问权限,若用Secrets Manager,还需要
secretsmanager:GetSecretValue权限;同时要有logs:CreateLogStream、logs:PutLogEvents权限用于日志输出。
内容的提问来源于stack exchange,提问作者Karim Fayed
相关产品推荐
相关产品推荐

