如何限制同GCP项目下仅App Engine的Node服务访问CloudSQL及前端访问API?
问题1:限制仅Node API服务访问CloudSQL
- 关闭CloudSQL的公网访问入口,仅保留私有IP配置,划入与App Engine API服务同VPC的子网,生产环境不要开启公网访问。
- 配置CloudSQL IAM权限,仅给你的Node API对应的App Engine服务账号授予
roles/cloudsql.client权限,删除所有其他无关账号的CloudSQL访问权限。App Engine默认服务账号格式为[项目ID]@appspot.gserviceaccount.com,若使用自定义服务账号替换为对应账号即可。 - 数据库的账号密码等敏感信息存储在Secret Manager中,仅给API服务的服务账号授予Secret Manager的秘密读取权限,禁止硬编码到代码或配置文件中。
- 数据库连接统一使用Cloud SQL Auth Proxy,App Engine部署时只需在
app.yaml中添加配置即可自动集成,无需额外部署服务,配置示例:
beta_settings: cloud_sql_instances: "[项目ID]:[区域]:[CloudSQL实例名]=tcp:[数据库端口,PostgreSQL填5432、MySQL填3306]"
问题2:限制仅React前端应用调用API服务
- 第一层配置CORS规则:在Node Express服务中配置CORS白名单,仅允许你的React前端的App Engine域名作为合法来源,示例代码:
const cors = require('cors'); const allowedOrigin = 'https://[你的React前端App Engine域名]'; app.use(cors({ origin: (origin, callback) => { // !origin兼容本地调试场景,生产环境可删除该判断 if (origin === allowedOrigin || !origin) { callback(null, true); return; } callback(new Error('Not allowed by CORS')); }, credentials: true }));
- 第二层搭配Auth0做接口鉴权:所有API接口要求请求头携带Auth0颁发的有效JWT令牌,Node API侧校验JWT的签名、有效期、受众等信息,只有校验通过的请求才处理,避免未授权用户绕过CORS直接调用接口。
- 无登录要求的公开接口可额外配置App Engine入站流量控制:开启API服务的App Engine入站规则,仅允许同项目内的App Engine服务访问,标准环境还可配置Identity-Aware Proxy(IAP),给前端服务账号授予IAP访问权限,非项目内请求会直接被GCP拦截,不会到达API服务层。
额外优化建议
- 两个App Engine服务建议放在同一GCP项目下,无需额外配置跨项目权限,也不会产生跨项目VPC流量费用。
- Auth0配置中需将你的React前端域名加入允许的回调地址、登出地址、Web Origin列表,避免鉴权跳转出现异常。
内容的提问来源于stack exchange,提问作者Neil Celeste Rara
相关产品推荐
相关产品推荐

