使用 GCP Compute Engine 作为 Authenticated Cloud 运行 服务的代理

Use GCP Compute Engine as proxy for Authenticated Cloud Run Service

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

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

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

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

你走在正确的轨道上。

此时,我建议您考虑使用 Envoy Proxy 而不是 NGINX。 Envoy 有 a well-documented protocol 从外部源获取动态数据,例如 $ID_TOKEN。

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

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

Google 计算 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。

此调用的响应 body returns 一个 JWT 令牌将在一小时内过期。您应该缓存此响应(基于受众,TTL<60 分钟),或者每次都获取一个新响应。

请注意,在云 运行 上,您只能生成 50 identity tokens per second currently. However you are running on GCE (and I'm repeating myself here) 我认为 GCE 上没有记录元数据服务的速率限制。可能 更高

然后,您需要将其作为 HTTP header:

添加到传出请求(到云 运行)
Authorization: Bearer <TOKEN>

此过程在 Service-to-service authentication 文档中有说明。

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