如何搭建AWS与本地网络VPN实现Lambda调用本地API?
嘿,这个需求我刚好实操过,给你梳理下可行的实现思路和步骤,亲测能搞定Lambda访问本地API的问题!
核心逻辑
Lambda默认跑在AWS的公有VPC环境里,没法直接访问你本地私有网络的API。所以我们要做的就是:把Lambda放到一个能和本地网络打通的AWS VPC里,再通过AWS的Site-to-Site VPN把这个VPC和你的本地网络连起来,让两边的网络能互相通信。
具体实现步骤
1. 准备AWS侧的VPC资源
- 如果你没有现成的VPC,先创建一个新VPC,至少包含1个私有子网(把Lambda放私有子网更安全,避免暴露到公网)。
- 创建并配置Virtual Private Gateway (VGW),然后把它附加到你的VPC上——这是AWS侧的VPN接入点。
2. 配置本地侧的Customer Gateway
- 在AWS控制台创建Customer Gateway (CGW),填写你本地网络的公网IP地址,以及本地的子网段(比如你的本地API所在的
192.168.1.0/24)。 - 这一步相当于告诉AWS:你的本地网络入口在哪里,要和哪个网段通信。
3. 创建Site-to-Site VPN连接
- 在AWS控制台创建VPN连接,关联刚才的CGW和VGW。
- 路由方式选静态路由就行(配置简单,适合小规模场景),直接添加本地子网段
192.168.1.0/24作为目标路由。 - 完成后,下载AWS生成的VPN配置文件(里面有IPsec隧道的参数,比如预共享密钥、隧道端点IP等)。
4. 配置本地VPN设备
- 把下载的配置文件导入到你的本地VPN设备(比如家用路由器、企业防火墙,像PFSense、华硕梅林、华为防火墙都支持)。
- 关键要确保:
- 本地设备开放UDP 500和4500端口(IPsec VPN的标准端口),允许AWS VPN端点的IP访问这些端口。
- 本地网络的防火墙规则允许来自AWS VPC子网的流量访问你的本地API(比如允许
10.0.0.0/16(假设你的AWS VPC网段是这个)访问192.168.1.5的对应端口)。
5. 配置VPC路由表
- 找到你VPC里的私有子网对应的路由表,添加一条路由:目标网段是
192.168.1.0/24,下一跳指向刚才创建的VGW。 - 这一步是告诉AWS VPC里的流量:要去本地网络的话,走VPN隧道。
6. 调整Lambda函数的配置
- 编辑Lambda函数的网络设置,把它部署到刚才的私有子网里。
- 给Lambda的IAM角色添加VPC相关的权限(比如
ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces等,控制台配置时会自动生成推荐的权限)。 - 配置Lambda的安全组:允许出站访问本地API的端口(比如TCP 80/443)。
- 最后测试Lambda代码,比如用Python的
requests库调用http://192.168.1.5/api/mymethod,应该就能成功访问了。
注意事项&排坑
- 如果VPN隧道一直处于Down状态,先检查本地设备的公网IP是否正确,以及端口是否开放。
- Lambda放在私有子网后,如果需要同时访问公网资源(比如调用AWS其他服务),需要给子网配置NAT网关——否则Lambda只能访问本地和VPC内的资源。
- 静态路由一定要配置正确,两边的子网段不能冲突(比如AWS VPC网段别用
192.168.1.0/24,避免和本地网段重复)。
替代方案(可选)
如果只是临时测试,不想折腾VPN,也可以用反向代理工具(比如ngrok)把本地API暴露到公网,Lambda直接调用公网地址。但这种方式安全性差,不适合生产环境。
内容的提问来源于stack exchange,提问作者VAAA
相关产品推荐
相关产品推荐

