安装后 Cloud Run 服务到服务返回 403
CloudRun Service to Service returning 403 After Setup
我有使用 google 云教程 (https://cloud.google.com/run/docs/authenticating/service-to-service#nodejs)
完成的服务到服务设置
将 cloudrun 服务帐户更改为具有 roles/run.invoker
(它们共享相同的角色)
请求获取访问令牌:http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://XXXX-XXXX-XXXX-xx.a.run.app'
(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
但错误消息表明您没有正确完成此步骤。
- 转到 Google 云控制台。
- Select 接收服务(这是您正在调用的 Cloud 运行 服务)。
- 单击右上角的“显示信息面板”以显示“权限”选项卡。
- 在“添加成员”字段中,输入调用服务的身份。
- Select Cloud 运行 Invoker 角色来自 Select 角色下拉菜单。
- 单击“添加”。
注意:请求身份令牌时,请勿指定自定义域。你问题的措辞在这一点上令人困惑。
[更新]
OP 已启用 internal and load balancer
。这需要设置无服务器 VPC 访问。
解决方案是添加一个 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
允许容器启动。
我有使用 google 云教程 (https://cloud.google.com/run/docs/authenticating/service-to-service#nodejs)
完成的服务到服务设置将 cloudrun 服务帐户更改为具有
roles/run.invoker
(它们共享相同的角色)请求获取访问令牌:
http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://XXXX-XXXX-XXXX-xx.a.run.app'
(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
但错误消息表明您没有正确完成此步骤。
- 转到 Google 云控制台。
- Select 接收服务(这是您正在调用的 Cloud 运行 服务)。
- 单击右上角的“显示信息面板”以显示“权限”选项卡。
- 在“添加成员”字段中,输入调用服务的身份。
- Select Cloud 运行 Invoker 角色来自 Select 角色下拉菜单。
- 单击“添加”。
注意:请求身份令牌时,请勿指定自定义域。你问题的措辞在这一点上令人困惑。
[更新]
OP 已启用 internal and load balancer
。这需要设置无服务器 VPC 访问。
解决方案是添加一个 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
允许容器启动。