如何在不影响Lambda互联网访问的前提下从本地连接RDS数据库?
问题场景
我在VPC中部署了一个Lambda函数,该函数需同时访问互联网和RDS数据库。现有配置如下:
- 6个RDS默认私有子网 + 1个公有子网
- 两张路由表:
- 公有路由表:关联公有子网,
0.0.0.0/0路由至Internet Gateway(IGW) - 私有路由表:关联6个私有子网,
0.0.0.0/0路由至NAT网关
当前状态:
- 公有路由表:关联公有子网,
- Lambda可正常访问RDS和互联网
- 本地机器无法连接RDS;仅当将私有路由表的
0.0.0.0/0路由目标改为IGW时才能连接,但会导致Lambda失去互联网访问权限 - 已针对本地IP和NAT网关IP配置RDS安全组入站规则
解决方案(不影响Lambda互联网访问)
方法1:部署公有子网跳板机(Bastion Host)
- 在公有子网创建一台小型EC2实例(跳板机),安全组配置:
- 入站规则:允许你的本地IP访问SSH端口(22)
- 出站规则:允许访问RDS的数据库端口(如3306、5432等)
- 配置RDS的安全组入站规则:允许跳板机的安全组访问数据库端口
- 本地操作:先通过SSH连接跳板机,再从跳板机内部使用RDS私有IP/端点连接数据库
- 优势:配置简单成本低,私有路由表无需修改,Lambda互联网访问不受影响
方法2:使用AWS Systems Manager(SSM)端口转发
- 确保本地机器已安装并配置AWS CLI,且拥有SSM相关操作权限
- 在VPC内任选一台EC2实例(无需公网IP),给其附加包含SSM访问权限的IAM角色
- 配置EC2实例安全组:允许访问RDS的数据库端口;配置RDS安全组:允许该EC2实例的安全组访问数据库端口
- 本地执行端口转发命令(以MySQL为例):
aws ssm start-session --target <EC2实例ID> --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<RDS私有端点>"], "portNumber":["3306"], "localPortNumber":["3306"]}' - 之后直接用本地数据库客户端连接
localhost:3306即可访问RDS - 优势:无需暴露公网IP,安全性高;无需维护跳板机的公网访问
方法3:建立VPC VPN连接(适合长期访问需求)
- 配置AWS Client VPN或Site-to-Site VPN,将本地网络与目标VPC打通
- 连接VPN后,本地机器即可直接使用RDS私有IP/端点连接数据库
- 优势:本地可直接访问VPC内所有私有资源,无需中转;安全性高
- 注意:需要配置VPN的路由和安全组规则,确保本地流量能到达RDS子网
不推荐的方法:将RDS暴露到公网
- 不建议修改RDS子网组添加公有子网并分配弹性公网IP,这会将RDS直接暴露到互联网,存在明显安全风险
内容的提问来源于stack exchange,提问作者Youssef Elkhayami
相关产品推荐
相关产品推荐

