无法从Vercel Edge Runtime访问Google Cloud VM API的问题求助
问题排查与解决方案
可能原因及对应排查步骤
1. API应用层的访问控制限制
GCP外部防火墙开放0.0.0.0/0不代表API服务本身没有访问限制:
- 登录VM查看API服务的访问日志,确认Vercel的请求是否到达服务端,以及日志中记录的403触发原因(比如IP被拦截、缺少特定请求头)。
- 在API服务中添加日志打印所有请求头,对比本地请求与Vercel请求的头信息差异,检查是否存在服务端要求的头字段(如
Host、Referer)未被Vercel携带的情况。
2. Vercel Edge Runtime的出站端口限制
Vercel Edge Runtime默认仅允许访问标准端口(80、443)及少数特定端口(587、465等),非标准端口(如9090)可能被拦截:
- 临时将API服务切换到80或443端口,重新部署后测试Vercel调用是否正常。
- 若必须使用9090端口,可通过
vercel.json配置出站规则(注:部分自定义规则仅适用于付费计划)。
3. VM本地防火墙拦截
GCP外部防火墙规则不覆盖VM内部的防火墙配置:
- 登录VM执行
ufw status或iptables -L,检查本地防火墙是否拦截了9090端口的入站请求。 - 若存在限制,执行
ufw allow 9090添加允许规则。
4. GCP额外安全服务拦截
GCP Cloud Armor或其他安全策略可能对非标准端口请求进行拦截:
- 检查VM是否关联了Cloud Armor策略,确认策略是否允许9090端口的请求。
- 临时关闭Cloud Armor策略(仅用于测试),验证请求是否恢复正常。
快速验证方法
- 在Vercel Edge函数中添加测试代码,验证对公开非标准端口服务的访问能力:
export default async function handler(req) { try { const res = await fetch('http://public-test-service:8080'); return new Response(JSON.stringify({ status: res.status }), { status: 200 }); } catch (e) { return new Response(JSON.stringify({ error: e.message }), { status: 500 }); } }
- 获取Vercel Edge Runtime的出站IP,将其添加到API服务的IP白名单中,测试是否解决403问题。
内容的提问来源于stack exchange,提问作者Louis Beaumont
相关产品推荐
相关产品推荐

