我的云 运行 服务如何调用其他云 运行 服务?

How can my cloud run service call other cloud run services?

我有一个服务在 'https://myapp.a.run.app/dosomething' 上侦听,但我想利用 Cloud 运行 的可扩展性功能,因此在 'dosomething' 的控制器中,我发送了 10 个请求到'https://myapp.a.run.app/smalltask';我的应用程序配置为每个实例只允许服务一个请求,我希望有 10 个实例启动,全部执行它们的小任务,并且 return(全部在超时期限内)。

但我不知道如何正确验证请求,所以这 10 个请求都导致了 403。对于 Cloud 运行 服务,我在初始请求中手动传递了一个不记名令牌,尽管我希望在某个时候添加一些 api 代理。但是没有说 API 代理,发送请求以使其被接受的正确方法是什么?该应用程序是 运行 作为有权访问端点的用户。

正在验证 service-to-service

如果您的架构使用多个服务,这些服务可能需要相互通信。

您可以使用同步或异步service-to-service通信:

异步通信,使用

用于同步通信

一项服务使用其端点 URL 通过 HTTP 调用另一项服务。在此用例中,确保每个服务只能向特定服务发出请求是个好主意。例如,如果您有登录服务,它应该可以访问 user-profiles 服务,但它可能不能访问搜索服务。

首先,您需要配置接收服务以接受来自调用服务的请求:

  1. 将 Cloud 运行 Invoker (roles/run.invoker) 角色授予接收服务上的调用服务身份。默认情况下,此标识为 PROJECT_NUMBER-compute@developer.gserviceaccount.com.

在调用服务中,您需要:

  1. 创建一个 Google-signed OAuth ID 令牌,并将受众 (aud) 设置为接收服务的 URL。此值必须包含架构前缀(http://https://),并且 aud 值目前不支持自定义域。

  2. Authorization: Bearer ID_TOKEN header 中包含 ID 令牌。您可以从元数据服务器获取此令牌,而容器在云 运行 上 运行(完全托管)。如果应用程序 运行 在 Google 云之外,您可以从服务帐户密钥文件生成 ID 令牌。

有关 Node/Python/Go/Java 和其他文章中的完整指南和示例,请参阅:Authenticating service-to-service