【问题标题】:CloudRun Service to Service returning 403 After Setup云运行服务到服务在设置后返回 403
【发布时间】:2021-09-18 09:47:02
【问题描述】:

我使用谷歌云教程 (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. 失败)使用该访问令牌在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 它可以工作,但是我不确定这样做是否正确。

【问题讨论】:

    标签: google-cloud-platform google-cloud-run google-iam


    【解决方案1】:
    推荐的答案 Google Cloud

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

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

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

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

    [更新]

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

    Connecting to a VPC network

    【讨论】:

    • 我让我的 GCP 顾问添加了它,并仔细检查了它是否已添加,所以我相信它肯定存在。但是,如果我将入口从 internal and load balancer 更改为 all 它可以工作。这有什么见解吗?另外,关于自定义域的好点,我打错了
    • @KevinDanikowski - 您在问题中遗漏的非常重要的细节。 Cloud Run 不属于您的 VPC。对于来自其他 Cloud Run 服务或来自同一项目中的 Cloud Functions 的请求,请将服务或函数连接到 VPC 网络并通过连接器路由所有出口,如连接到 VPC 网络中所述。请注意,IAM 调用者权限仍然有效。
    • @KevinDanikowski 看看这个答案是否有帮助stackoverflow.com/a/68271019/7031308
    • @KevinDanikowski,无服务器 VPC 连接器是您问题的关键。不要忘记将所有出口流量路由到它。 Cloud Run,即使入口设置为内部,也是公共资源,公共流量访问它。
    【解决方案2】:

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

    归功于@JohnHanley 和@GuillaumeBlaquiere 的出色洞察力

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

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2019-07-21
      • 2011-01-26
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多