You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:55:28