服务身份简介

本页面介绍了这两个 Cloud Run 身份,以及 Cloud Run 如何使用服务身份来调用 Cloud 客户端库。Cloud 客户端库的示例包括 Cloud Storage、Firestore、Cloud SQL、Pub/Sub 和 Cloud Tasks。本页面适用于管理组织政策和用户访问权限的管理员、运维人员或开发者,或希望了解此类主题的任何人员。

Cloud Run 身份

为了使用 Cloud Run,Google Cloud 要求每个 Cloud Run 用户和 Cloud Run 实例都具有身份。

  • Cloud Run 用户的身份称为“Cloud Run 部署者账号”。管理修订版本或作业时,您可以使用此身份向 Cloud Run Admin API 发出请求。
  • Cloud Run 实例的身份称为 Cloud Run 服务身份。当 Cloud Run 服务或作业与 Cloud 客户端库交互时,您可以使用此身份从 Cloud Run 向 Google Cloud API 发出请求。

如需访问 Google Cloud API 并向其发出请求,每个身份都必须在 Identity and Access Management (IAM) 中被授予适当的权限。

使用部署者账号调用 Cloud Run Admin API

您可以使用 Cloud Run 部署者账号从 Cloud Run 调用 Cloud Run Admin API。部署者账号可以是用户账号,也可以是服务账号,代表登录 Google Cloud 环境的账号。

当部署者账号使用 Cloud Run 时,IAM 会检查部署者账号是否具有执行 Cloud Run 操作所需的权限。下图展示了用户账号如何调用 Cloud Run Admin API 以从 Google Cloud 控制台部署新修订版本:

从 Google Cloud 控制台调用 Cloud Run Admin API。
图 1:用户使用 Google Cloud 控制台通过向 Cloud Run Admin API 发送带有访问令牌的请求来部署新修订版本。在执行此操作之前,IAM 使用该访问令牌来验证用户账号是否已经过身份验证,可以访问 Cloud Run Admin API。

使用服务身份调用 Google Cloud API

当 Cloud Run 实例通过应用代码或内置功能(例如 Cloud Run 集成Cloud Storage 卷装载)与 Cloud 客户端库交互时,Google Cloud 环境会使用应用默认凭据 (ADC) 自动检测 Cloud Run 服务身份是否已经过身份验证,可以执行 API 操作。Cloud Run 服务身份是在部署修订版本或执行作业时被分配为 Cloud Run 实例身份的服务账号。

仅当您在 Cloud Run 配置中配置了同一服务账号时,用作部署者账号的服务账号才会用作服务身份。

本指南的其余部分介绍了 Cloud Run 服务或作业如何使用服务身份来调用和访问 Google 服务和 API。如需详细了解服务身份配置,请参阅服务作业的服务身份配置页面。

服务身份的服务账号类型

当您的 Cloud Run 实例调用 Google Cloud API 以执行其所需的操作时,Cloud Run 会自动使用服务账号作为服务身份。可用作服务身份的两种服务账号如下所示:

  • 用户管理的服务账号(推荐):您手动创建此服务账号并确定该服务账号访问特定 Google Cloud 资源所需的最小权限集。用户管理的服务账号遵循 SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com 格式。
  • Compute Engine 默认服务账号:Cloud Run 自动提供 Compute Engine 默认服务账号作为默认服务身份。Compute Engine 默认服务账号遵循 PROJECT_NUMBER-compute@developer.gserviceaccount.com 格式。

配置服务身份时避免使用默认服务账号

默认情况下,系统会自动创建 Compute Engine 默认服务账号。如果您在创建 Cloud Run 服务或作业时未指定服务账号,则 Cloud Run 会使用此服务账号。

默认服务账号的目的是帮助您的 Cloud Run 实例启动并运行,而不会出现权限错误。此主账号会被授予 Editor 角色,该角色可授予对 Google Cloud 项目中所有资源的读取和写入权限。为了遵循最小权限原则,Google 建议您创建新的服务账号,并向该服务账号授予访问特定 Google Cloud 资源所需的一组最低权限。

服务身份的工作原理

当您的代码调用 Cloud 客户端库或向 Cloud 客户端库发出请求时,会发生以下情况:

  1. 客户端库检测到向 Google Cloud API 或 Cloud 客户端库发出请求,并从实例元数据服务器请求服务身份的 OAuth 2.0 访问令牌。
  2. 实例元数据服务器会为配置为服务身份的服务账号提供 IAM 访问令牌。
  3. 向 Google Cloud API 发出的请求随 OAuth 2.0 访问令牌一起发送。
  4. IAM 会验证访问令牌中引用的服务身份是否具备必要的权限,并在将调用转发到 API 端点之前检查政策绑定。
  5. Google Cloud API 会执行操作。
从 Cloud Run 调用 Google Cloud API。
图 1:Cloud Run 从元数据服务器生成访问令牌,IAM 使用该访问令牌来验证分配的 Cloud Run 服务身份是否已通过身份验证,以访问 Google Cloud API。

为 Cloud Run 请求生成访问令牌以调用 Google Cloud API

如果您的 Cloud Run 代码使用 Cloud 客户端库,您可以在部署或执行时分配服务账号,从而在 Cloud Run 中配置服务身份。这样,库即可自动获取访问令牌,以便对代码的请求进行身份验证。如需将服务账号分配为服务身份,请参阅以下指南:

不过,如果您使用自己的自定义代码或需要以编程方式发出请求,则可以直接使用元数据服务器手动提取下一部分所述的身份令牌和访问令牌。注意,您无法直接从本地机器查询此服务器,因为元数据服务器仅适用于在 Google Cloud 上运行的工作负载。

使用元数据服务器提取 ID 和访问令牌

您可以使用元数据服务器提取的两种类型的令牌如下所示:

如需提取令牌,请按照您使用的令牌类型的相应标签页中的说明操作:

访问令牌

例如,如果要创建 Pub/Sub 主题,请使用 projects.topics.create 方法。

  1. 使用计算元数据服务器来提取访问令牌

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
        --header "Metadata-Flavor: Google"
    

    此端点会返回一个带有 access_token 属性的 JSON 响应。

  2. 在 HTTP 协议请求中,您必须使用 Authorization 标头中的访问令牌对请求进行身份验证:

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_TOKEN
    

    其中:

    • PROJECT_ID 是项目 ID。
    • TOPIC_ID 是主题 ID。
    • ACCESS_TOKEN 是您在上一步中提取的访问令牌。

    响应:

    {
        "name": "projects/PROJECT_ID/topics/TOPIC_ID"
    }
    

ID 令牌

使用计算元数据服务器提取具有特定目标设备的身份令牌

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
    --header "Metadata-Flavor: Google"

其中,AUDIENCE 是请求的 JWT 目标设备。

对于 Cloud Run 服务,受众群体应该是您要调用的服务的网址或为该服务配置的自定义受众群体(例如自定义网域)。

https://service.domain.com

对于其他资源,则可能是受 IAP 保护的资源的 OAuth 客户端 ID:

1234567890.apps.googleusercontent.com

后续步骤