无法从AWS Lambda连接EC2上的MySQL实例,求安全连接方案
解决Lambda连接EC2上MySQL的VPC安全组配置问题
这种卡在VPC安全组规则上的问题真的让人头大,我之前做类似项目的时候也踩过同样的坑。咱们一步步拆解,把严格安全规则下的连接问题解决掉:
1. 核心:用安全组引用代替任意来源
Lambda在VPC中运行时,会被分配一个弹性网络接口(ENI),它的私有IP是动态变化的,所以你没法直接把固定IP加到EC2的安全组里。正确的做法是:
- 打开EC2控制台,找到MySQL实例对应的安全组,编辑入站规则
- 添加一条自定义TCP规则,端口填
3306,来源选择Lambda所使用的安全组ID(比如sg-abc12345) - 这样就只有这个安全组下的资源(也就是你的Lambda)能访问EC2的MySQL端口,比开放0.0.0.0/0安全多了
2. 确认MySQL的绑定地址
很多时候MySQL默认只绑定127.0.0.1,这意味着只能在EC2本地访问,Lambda根本连不上。你需要修改这个配置:
- 登录EC2实例,找到MySQL的配置文件(通常是
/etc/my.cnf或者/etc/mysql/my.cnf,取决于系统) - 找到
bind-address字段,把它改成0.0.0.0(允许所有私有IP访问)或者EC2的私有IP - 重启MySQL服务:
sudo systemctl restart mysqld(如果是Ubuntu的话用sudo systemctl restart mysql) - 验证监听状态:
netstat -tulpn | grep 3306,输出里应该看到0.0.0.0:3306或者你的EC2私有IP
3. 检查Serverless部署的VPC配置
因为你用Serverless框架部署Kotlin Lambda,要确保serverless.yml里的VPC配置完全正确:
provider: name: aws runtime: corretto17 # 对应你的Kotlin运行环境,比如java11也可以 vpc: securityGroupIds: - sg-xxxxxx # 这里填Lambda的安全组ID,要和你刚才在EC2安全组里引用的一致 subnetIds: - subnet-xxxxxx # 必须是EC2所在的同一私有子网ID
部署完成后,去Lambda控制台确认VPC配置是否生效——在"配置"->"VPC"里能看到关联的子网和安全组。
4. 验证Lambda的IAM角色与网络配置
- 确认你的Lambda IAM角色确实附加了
AWSLambdaVPCAccessExecutionRole策略,这个策略允许Lambda创建和管理ENI,是VPC内运行的必备权限 - 确保Lambda使用的是私有子网:如果用了公有子网,Lambda需要NAT网关才能访问外部,但这里是访问同一VPC内的EC2,用私有子网更安全,也不需要额外的NAT配置
5. 排查其他可能的卡点
- 子网NACL:虽然默认是允许所有流量,但如果你的子网NACL被修改过,要确保入站和出站规则都允许TCP 3306的流量(NACL是子网级的,安全组是实例级的,两者都要检查)
- Lambda超时设置:VPC内的Lambda冷启动时间会变长,建议把超时时间调整到10秒以上,避免因为超时误以为是连接失败
- 连接字符串正确性:Kotlin代码里的JDBC URL要用EC2的私有IP,不要用公网IP,比如:
val jdbcUrl = "jdbc:mysql://10.0.1.23:3306/your_database?useSSL=false&serverTimezone=UTC"
按照这些步骤排查下来,应该就能在严格的安全规则下让Lambda成功连接到EC2上的MySQL了。
内容的提问来源于stack exchange,提问作者Amit Nandan Periyapatna
相关产品推荐
相关产品推荐

