Nginx 使用GCP计算引擎作为经过身份验证的云运行服务的代理

Nginx 使用GCP计算引擎作为经过身份验证的云运行服务的代理,nginx,networking,google-cloud-platform,google-cloud-run,Nginx,Networking,Google Cloud Platform,Google Cloud Run,我目前有一个停靠的web应用程序,托管在Google云计算实例上,只能从我们公司的专用网络访问。这一设置在过去一年中运行良好,但随着开发需求的增加和使用率的提高,我发现自己不断修改实例大小,并且必须用新的更新重新启动服务器。此外,团队中的其他开发人员在部署此代码方面的经验较少,这使得此应用程序成为我的责任 我希望将此应用程序迁移到云运行,以实现可扩展性、易于维护和部署,但仍然只能在我们公司的网络上访问。我的想法是将应用程序移动到经过身份验证的云运行服务,并将原始服务器用作nginx代理,该代理将

我目前有一个停靠的web应用程序,托管在Google云计算实例上,只能从我们公司的专用网络访问。这一设置在过去一年中运行良好,但随着开发需求的增加和使用率的提高,我发现自己不断修改实例大小,并且必须用新的更新重新启动服务器。此外,团队中的其他开发人员在部署此代码方面的经验较少,这使得此应用程序成为我的责任

我希望将此应用程序迁移到云运行,以实现可扩展性、易于维护和部署,但仍然只能在我们公司的网络上访问。我的想法是将应用程序移动到经过身份验证的云运行服务,并将原始服务器用作nginx代理,该代理将添加身份验证头并将请求转发到云运行服务

我的问题是如何使用nginx获取令牌(服务器将拥有必要的权限),并在将令牌传递到应用程序之前将其添加到请求中。这是我目前的想法,但不确定从这里走到哪里

location / {
    proxy_set_header Authentication "Bearer $ID_TOKEN";
    proxy_pass https://the-library-clwysxi3sq-ue.a.run.app;
}

你在正确的轨道上

在此,我建议您考虑使用代理代理代替NGIX。特使必须从外部源获取动态数据,如$ID_令牌

无论您选择何种解决方案,请确保最终将“主机”标题重新写入您的
[…].run.app
主机名,因为如果您将主机名保持原样(
somedomain.com
),Cloud run的负载平衡器将不知道路由哪个应用程序

剩下的任务是找出如何动态获取$ID_令牌

Google Compute VM实例需要通过查询实例元数据服务来检索标识令牌(JWT):

curl -H "Metadata-Flavor: Google" \
  http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://hello-2wvlk7vg3a-uc.a.run.app
确保用目标服务的URL替换
?访问者=
的值


此调用的响应主体返回一个在一小时内过期的JWT令牌。您应该缓存此响应(基于访问群体,TTL基本上,您可能希望运行脚本或命令,特别是
gcloud auth print access token
,并将其传递给nginx如果我理解正确,您希望部署私有云运行(我指需要验证的云运行),只授予您的计算引擎安全访问云运行的权限,不在计算引擎上设置身份验证,但计算引擎仅在内部为您的公司网络打开(您有一个VPN和您的专用网络来访问它).对吗?就像这样,你的云运行实例是安全的,你的计算引擎没有暴露在互联网上。很好,这正是我需要的信息。看起来nginx不是最好的选择,但Proxy会更容易。非常感谢你的帮助。
Authorization: Bearer <TOKEN>