如何配置公有子网中的AWS Lambda无需NAT即可访问互联网?
问题分析与解决方法
问题场景
- 拥有3个公有子网(每个可用区各1个),子网关联的路由表已连接互联网网关,子网内的EC2实例可正常访问互联网
- 部署在相同公有子网中的AWS Lambda调用互联网API时全部超时
- Lambda安全组规则:
- 入站:无任何规则
- 出站:
IPv4 所有流量 所有 所有 0.0.0.0/0(出站规则)
- Lambda已配置关联上述3个公有子网及对应安全组
排查与解决步骤
检查子网的自动分配公网IP设置
Lambda在VPC内运行时,依赖弹性网络接口(ENI)获取公网IP才能直接访问互联网。如果公有子网未开启自动分配公有IPv4地址,Lambda的ENI只会拿到私有IP,即使在公有子网也无法联网。- 操作路径:VPC控制台→子网→选中目标公有子网→查看“自动分配IPv4地址”状态,若未启用则开启后重新测试Lambda。
验证路由表的默认路由配置
确认子网绑定的路由表中,存在指向互联网网关(IGW)的默认路由条目(0.0.0.0/0 → igw-xxxx),且该规则未被更具体的路由覆盖。- 操作路径:VPC控制台→路由表→选中子网关联的路由表→检查路由条目,确保默认路由正确指向IGW。
检查网络ACL(NACL)规则
网络ACL的优先级高于安全组,若公有子网关联的NACL存在出站拒绝规则,会直接拦截Lambda的网络请求。- 操作路径:VPC控制台→网络ACL→选中子网关联的NACL→确认出站规则允许所有TCP/UDP/ICMP流量到
0.0.0.0/0,且无优先级更高的拒绝规则。
- 操作路径:VPC控制台→网络ACL→选中子网关联的NACL→确认出站规则允许所有TCP/UDP/ICMP流量到
确认Lambda执行角色的EC2权限
Lambda在VPC内运行需要创建、管理弹性网络接口,若执行角色缺少相关权限,会导致ENI创建失败,进而无法联网。- 操作路径:IAM控制台→角色→选中Lambda执行角色→检查权限策略,确保包含
ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces、ec2:DeleteNetworkInterface权限。
- 操作路径:IAM控制台→角色→选中Lambda执行角色→检查权限策略,确保包含
测试基础网络连通性
在Lambda中添加简单测试代码,排查是特定API的问题还是整体网络不通:import requests def lambda_handler(event, context): try: response = requests.get("http://icanhazip.com", timeout=5) return {"status": "success", "ip": response.text.strip()} except Exception as e: return {"status": "failed", "error": str(e)}
内容的提问来源于stack exchange,提问作者Kristi Jorgji
相关产品推荐
相关产品推荐

