如何通过Lambda函数与私有子网内无公网IP的EC2实例通信
Lambda访问私有子网无公网IP EC2的实现方案
要实现Lambda与私有子网内无公网IP的EC2通信,核心是保证两者的网络链路在内网可达,不需要经过公网路由,以下是3种生产环境常用的可行方案:
方案1:将Lambda部署到与EC2同VPC的私有子网(最常用)
这是成本最低、配置最简单的方案,适合同账号同VPC的场景:
- 进入Lambda控制台的配置页,开启「VPC访问」,选择和目标EC2实例相同的VPC,选择至少2个可用区的私有子网(保障高可用)
- 配置Lambda的安全组:出站规则允许访问EC2的服务端口
- 配置EC2的安全组:入站规则允许Lambda的安全组ID访问对应服务端口,无需开放公网入口
- 给Lambda执行角色添加
AWSLambdaVPCAccessExecutionRole托管权限,保证Lambda有权限在VPC内创建弹性网卡(ENI)完成网络挂载 - 注意:部署到VPC内的Lambda默认无法访问公网,若同时需要公网访问能力,需要为VPC私有子网配置NAT网关
方案2:通过AWS PrivateLink访问(适合跨账号/跨VPC场景)
如果不想将Lambda部署到VPC,或者需要跨账号、跨VPC访问的场景可以使用该方案,网络链路全程走AWS内部骨干网,安全性更高:
- 在EC2所在的VPC内部署内网应用负载均衡器(ALB),将目标EC2实例注册到ALB的目标组,验证ALB到EC2的连通性正常
- 为该内网ALB创建PrivateLink端点服务,配置允许访问的账号白名单
- 在Lambda侧配置对应PrivateLink的VPC端点,Lambda无需挂载到VPC即可通过该端点访问EC2上的服务
方案3:通过公网跳板转发(仅适合临时调试场景)
该方案需要暴露公网入口,仅建议调试时临时使用,不推荐生产环境长期部署:
- 在EC2所在VPC的公有子网部署带公网IP的EC2跳板机,或者配置NAT网关,设置端口转发规则,将跳板机指定端口的请求转发到私有EC2的服务端口
- 配置跳板机的安全组入站规则,仅允许Lambda的公网出口IP段访问转发端口
- Lambda通过跳板机的公网IP+转发端口访问EC2的服务
连通性验证
配置完成后可以在Lambda中编写简单的测试代码验证连通性,示例代码参考:
import urllib3 def lambda_handler(event, context): http = urllib3.PoolManager() # 替换为EC2的私有IP+服务端口,或者PrivateLink端点地址 resp = http.request('GET', 'http://10.0.1.100:8080/health') print(f"响应状态码:{resp.status}, 响应内容:{resp.data.decode('utf-8')}") return resp.status
如果出现访问失败的情况,可以查看VPC流日志排查安全组、网络ACL的规则是否存在拦截。
内容的提问来源于stack exchange,提问作者Thiwanka Wickramage
相关产品推荐
相关产品推荐

