AWS Lambda(Node.js)连接EC2实例中MySQL的技术问询
问题描述
已创建EC2实例并在其上安装配置了MySQL(非RDS),创建了数据库airpollutiondata及表CO2。尝试编写Node.js环境的Lambda函数以连接该MySQL并执行SELECT查询拉取数据,但测试代码未成功,网上资源多针对RDS,寻求正确方向。
测试代码:
var con = mysql.createConnection({ host: "localhost", user: "yourusername", password: "yourpassword", database: 'airpollutiondata' }); con.connect(function(err) { if (err) throw err; console.log("Connected!"); });
解决方案
- 修正数据库连接地址:Lambda函数运行在AWS独立的容器环境中,
localhost指向Lambda自身容器,不是你的EC2实例。必须替换为EC2实例的公网IP(跨VPC访问时)或私有IP(Lambda与EC2同VPC时)。 - 配置网络与安全组:
- 公网访问场景:EC2安全组需开放3306端口的入站权限,允许Lambda所在IP段访问(测试阶段可临时放开0.0.0.0/0,生产环境严格限制IP范围);同时EC2需分配公网IP且网络可达。
- 内网访问场景:将Lambda配置到EC2所在的VPC、子网和安全组,确保VPC内安全组规则允许Lambda的安全组访问EC2的3306端口。
- 调整MySQL用户权限:默认MySQL用户仅允许本地连接,需修改权限让用户能从Lambda的IP或VPC网段访问。执行以下SQL:
测试时可临时允许所有IP访问(生产环境禁用):GRANT ALL PRIVILEGES ON airpollutiondata.* TO 'yourusername'@'lambda_ip_or_vpc_cidr' IDENTIFIED BY 'yourpassword'; FLUSH PRIVILEGES;GRANT ALL PRIVILEGES ON airpollutiondata.* TO 'yourusername'@'%' IDENTIFIED BY 'yourpassword'; FLUSH PRIVILEGES; - 打包Lambda依赖:Lambda默认不包含
mysql库,需在本地项目目录执行npm install mysql,将代码与node_modules目录一起打包上传,或使用Lambda层管理依赖包。 - 排查具体错误:查看Lambda的CloudWatch日志,根据错误信息定位问题——连接超时多为网络/安全组配置问题,权限拒绝则是MySQL用户权限或密码错误。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

