AWS Lambda连接互联网时出现超时问题求助
解决VPC内AWS Lambda访问互联网超时的问题
问题场景:
运行在VPC内的AWS Lambda函数尝试访问互联网(示例代码如下)时出现超时错误。该VPC包含1个公有子网、3个跨可用区的私有子网,对应2个路由表(公有子网关联公有路由表,私有子网关联私有路由表)。
import json import urllib.request def lambda_handler(event, context): url = "https://www.google.com" try: # Make HTTP GET request response = urllib.request.urlopen(url) # Read response data html = response.read().decode("utf-8") # Log response print("Response from", url, ":", html) return { 'statusCode': 200, 'body': json.dumps('Successfully accessed the internet!') } except Exception as e: # Log error print("Error:", str(e)) return { 'statusCode': 500, 'body': json.dumps('Failed to access the internet!') }
核心原因与修复方案
Lambda部署在VPC内时,需依赖正确的网络路由、网关配置才能访问互联网,以下是分场景的排查和修复步骤:
场景1:Lambda部署在私有子网(最常见情况)
私有子网无直接互联网访问路径,必须通过NAT Gateway中转,按以下步骤配置:
- 创建NAT Gateway:在公有子网中创建NAT Gateway,并分配弹性IP(确保公有子网有可用弹性IP配额)。
- 更新私有路由表:编辑私有子网关联的路由表,添加规则:
0.0.0.0/0指向刚创建的NAT Gateway。 - 验证公有子网路由:确保NAT Gateway所在的公有子网路由表已配置
0.0.0.0/0指向Internet Gateway(IGW),否则NAT Gateway自身无法访问外网。 - 检查安全组:Lambda的安全组需允许出站流量到目标端口(示例中为HTTPS的443端口,HTTP则为80端口)。
- 检查网络ACL:私有子网和公有子网的网络ACL需允许:
- 出站方向:TCP 443/80端口流量
- 入站方向:TCP 1024-65535端口的响应流量(外网返回数据包使用这些端口)
场景2:Lambda部署在公有子网
若Lambda部署在公有子网,按以下项排查:
- 验证公有路由表:确保公有路由表存在
0.0.0.0/0指向IGW的路由规则。 - 安全组/网络ACL检查:同私有子网要求,允许出站443/80流量及对应入站响应端口。
- 注意:Lambda在公有子网中的ENI不会自动分配公有IP,仍依赖VPC DNS解析能力,若DNS配置错误也会导致域名解析超时。
通用排查项
- Lambda执行角色权限:确保执行角色拥有
ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces、ec2:DeleteNetworkInterface权限,否则Lambda无法创建用于联网的弹性网络接口(ENI)。 - 调整超时时间:Lambda默认超时为3秒,若网络延迟较高,可在控制台“配置”→“常规配置”中将超时调高至10秒或更长。
- VPC DNS配置:确认VPC的
enableDnsSupport和enableDnsHostnames均设为true(VPC控制台→“编辑DNS属性”),否则Lambda无法解析域名导致超时。 - 基础网络测试:在私有子网启动EC2实例,使用与Lambda相同的安全组和路由表,执行
curl https://www.google.com测试,若EC2也无法访问,说明问题出在VPC网络配置而非Lambda本身。
内容的提问来源于stack exchange,提问作者Jana Maamari
相关产品推荐
相关产品推荐

