如何配置安全组让EC2仅接受同VPC内Lambda的HTTP请求?
解决方案
核心修复步骤
- 将Lambda代码中请求的EC2地址从公网IPv4改为EC2所在VPC的私有IPv4,同时修正URL格式错误(原代码中
http://1.2.3.4/post:80的端口位置不正确,HTTP默认端口80可省略,正确格式应为http://[私有IP]/post)。
修正后的代码示例:
const postRequestData = { key1: value1, key2: value2 }; return new Promise((resolve, reject) => { fetch('http://10.0.1.XX/post', { // 替换为EC2的私有IPv4地址 method: 'post', body: JSON.stringify(postRequestData), headers: {'Content-Type': 'application/json'} }) .then((response) => { console.log("Response: ", response); resolve(response); }) .catch(err => { console.log("ERROR: Could not fetch response: ", err); reject("EC2 unavailable."); }); });
问题原因分析
你当前的Lambda代码使用EC2公网IP发起请求,会导致流量从Lambda所在私有子网出发,经NAT网关绕至公网后再访问EC2公网IP。此时EC2收到的请求源IP是NAT网关的公网IP,而非Lambda安全组对应的内网IP,因此EC2安全组中允许Lambda安全组的规则无法匹配,请求被拦截超时。
当你将EC2安全组改为允许0.0.0.0/0时,公网来源的请求(包括经NAT网关转发的Lambda请求)会被放行,因此可以正常连接。
额外验证检查点
- 确认EC2与Lambda处于同一VPC的内网可达子网中(私有子网默认互通,只要路由表配置正确)
- 再次核对EC2安全组入站规则:
- HTTP(80):来源为Lambda关联的安全组ID
- SSH(22):来源为你的家庭IP
- Lambda安全组保持
AllTraffic-0.0.0.0/0的出站规则即可,无需额外入站规则(Lambda是主动发起请求的一方)
内容的提问来源于stack exchange,提问作者Philip H
相关产品推荐
相关产品推荐

