繁体   English   中英

使用 GCP Compute Engine 作为 Authenticated Cloud Run Service 的代理

[英]Use GCP Compute Engine as proxy for Authenticated Cloud Run Service

我目前有一个托管在 Google Cloud Compute Instance 上的 dockerized Web 应用程序,该应用程序只能从我们公司的专用网络访问。 这种设置在过去一年中运行良好,但随着额外的开发要求和使用量的增加,我发现自己不断修改实例大小,并且不得不用新的更新重新启动服务器。 此外,团队中的其他开发人员在部署此代码方面的经验较少,这使我对这个应用程序负责。

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

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

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

你在正确的轨道上。

此时,我建议您考虑使用 Envoy Proxy 而不是 NGINX。 Envoy 有一个有据可查的协议来从外部来源获取动态数据,例如 $ID_TOKEN。

无论您选择哪种解决方案,请确保您最终将“主机”标头重写为[...].run.app主机名,因为如果您按原样保留主机名 ( somedomain.com ),Cloud Run 的负载均衡器将不会不知道要路由哪个应用程序。

剩下的任务是弄清楚如何动态获取 $ID_TOKEN。

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

确保将?audience=的值替换为目标服务的 URL。

此调用的响应正文返回一个在一小时内过期的 JWT 令牌。 您应该缓存此响应(基于受众,并且 TTL <60 分钟),或者每次都获得一个新响应。

请注意,在 Cloud Run 上,您目前每秒只能生成50 个身份令牌 但是,您在 GCE 上运行( 我在这里重复一遍)我认为 GCE 上的元数据服务没有记录的速率限制。 可能会更高

然后,您需要将其作为 HTTP 标头添加到传出请求(到 Cloud Run)中:

Authorization: Bearer <TOKEN>

此过程在服务到服务身份验证文档中进行了说明。

您可以在 Stack Overflow 或 Google 上搜索如何在 NGINX 中为每个请求执行 Lua 或 Bash 脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM