AWS Lambda关联VPC后无法访问互联网问题求助
问题解决方案
核心原因分析
169.254.x.x是AWS Lambda弹性网络接口(ENI)的链路本地地址,出现这种情况说明Lambda没有成功获取到VPC的私有IP地址,通常和VPC配置、Lambda的网络分配逻辑相关;而无法访问互联网则是因为关联VPC后的Lambda需要通过NAT网关/实例才能访问公网,默认VPC的公有子网配置可能不满足要求。
分步解决方案
1. 检查VPC子网配置与Lambda的子网选择
- 确保Lambda关联的是私有子网(不要直接用公有子网,除非有特殊配置)
- 私有子网的路由表中必须包含指向NAT网关的路由(目标
0.0.0.0/0指向NAT网关的ID) - 确认NAT网关部署在公有子网中,且公有子网有指向Internet网关(IGW)的路由(目标
0.0.0.0/0指向IGW)
2. 验证Lambda的ENI状态与IP分配
- 进入AWS控制台的Lambda函数页面,查看「配置」->「VPC」选项卡,确认已关联的子网和安全组
- 到EC2控制台的「网络接口」页面,找到Lambda对应的ENI,检查是否已分配到VPC私有IP地址:
- 如果ENI没有私有IP,删除Lambda的VPC关联后重新配置
- 确保VPC的可用IP地址充足,没有耗尽
3. 检查安全组与网络ACL规则
- Lambda的安全组需允许出站流量(目标
0.0.0.0/0,端口53用于DNS,以及其他需要的公网端口) - 私有子网的网络ACL需允许出站流量(所有协议,目标
0.0.0.0/0)和入站流量(对应出站流量的响应,比如Ephemeral端口范围) - NAT网关所在的公有子网网络ACL需允许入站的Ephemeral端口流量和出站的公网流量
4. 修正测试代码(可选,用于更精准排查)
可以修改测试代码,同时打印当前IP地址,方便确认网络状态:
import socket def lambda_handler(event, context): try: # 获取本地IP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) local_ip = s.getsockname()[0] s.close() # 测试互联网连接 socket.create_connection(("8.8.8.8", 53), timeout=1) return f"Success!!! Local IP: {local_ip}" except OSError as e: return f"No internet. Error: {str(e)}. Local IP: {local_ip if 'local_ip' in locals() else 'Unknown'}"
5. 确认VPC端点配置(如果使用)
如果VPC中配置了Lambda的VPC端点,确保端点的策略允许Lambda的相关操作,且不会影响公网路由
内容的提问来源于stack exchange,提问作者Андрей Вербицкий
相关产品推荐
相关产品推荐

