安装后 Cloud Run 服务到服务返回 403

CloudRun Service to Service returning 403 After Setup

我有使用 google 云教程 (https://cloud.google.com/run/docs/authenticating/service-to-service#nodejs)

完成的服务到服务设置
  1. 将 cloudrun 服务帐户更改为具有 roles/run.invoker(它们共享相同的角色)

  2. 请求获取访问令牌:http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://XXXX-XXXX-XXXX-xx.a.run.app'

  3. (failing) 使用该访问令牌在 https://XXXX-XXXX-XXXX-xx.a.run.app/my-endpoint 使用访问令牌发出请求:axios.post('https://XXXX-XXXX-XXXX-xx.a.run.app/my-endpoint', {myData}, {headers: {Authorization: 'Bearer eyJhbGciOiJSUz.....'}})

但是,在第 3 步调用我的服务时,我收到了一个 403 错误,请问我错过了什么?

注意:我尝试过使用 --allow-unauthenticated 和不使用它来部署调用的服务。我没有使用自定义域,我使用的是创建的 CloudRun url.

PS:如果我将入口从 internal and load balancer 更改为 all 它会起作用,但是我不确定这样做是否正确。

访问您的 Cloud 运行 服务时出现 HTTP 403 Forbidden 错误消息意味着您的客户端无权调用此服务。

您尚未授予服务帐户调用接收服务的权限。您的问题表明您添加了 roles/run.invoker 但错误消息表明您没有正确完成此步骤。

  1. 转到 Google 云控制台。
  2. Select 接收服务(这是您正在调用的 Cloud 运行 服务)。
  3. 单击右上角的“显示信息面板”以显示“权限”选项卡。
  4. 在“添加成员”字段中,输入调用服务的身份。
  5. Select Cloud 运行 Invoker 角色来自 Select 角色下拉菜单。
  6. 单击“添加”。

注意:请求身份令牌时,请勿指定自定义域。你问题的措辞在这一点上令人困惑。

[更新]

OP 已启用 internal and load balancer。这需要设置无服务器 VPC 访问。

Connecting to a VPC network

解决方案是添加一个 VPC 连接器并通过它路由所有流量。我将其添加到部署脚本 --vpc-egress all-traffic。最初我有 --vpc-egress private-ranges-only 连接到 redis MemoryStore,但是这不足以连接到我的其他服务(仅内部入口)。

感谢@JohnHanley 和@GuillaumeBlaquiere 的出色见解

关于 NodeJS 的有趣说明:当我将 --vpc-egress 切换为 all-traffic 时,我的容器无法启动,我不知道为什么因为那里没有日志。事实证明 运行 node v16.2 导致 --vpc-egress all-traffic 出现一些我无法调试的奇怪问题,因此降级到 14.7 允许容器启动。