对 HTTP 目标使用身份验证

如果您设置了具有适当凭据的关联服务账号,则 Cloud Scheduler 可以调用需要身份验证的 HTTP 目标。

设置服务账号

服务账号通常由应用或计算工作负载使用,并由其电子邮件地址(对该账号是唯一的)标识。

应用可以使用服务账号来执行已获授权的 API 调用(以服务账号本身的身份进行身份验证),并访问该服务账号有权访问的所有资源。

若要让应用使用服务账号证明其身份,最常见的方法是将服务账号关联到运行该应用的资源。然后,您可以向服务账号授予 Identity and Access Management (IAM) 角色,让该服务账号可以访问相应的 Google Cloud 资源。

  1. 如果您还没有要用于具有 HTTP 目标的 Cloud Scheduler 作业的服务账号,请创建新的服务账号。请注意以下几点:

    • 该服务账号必须属于创建 Cloud Scheduler 作业的项目。

    • 请勿使用 Cloud Scheduler 服务代理 (service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com)。它不能用于此目的。

    • 请勿撤消项目中的 Cloud Scheduler 服务代理的 Cloud Scheduler Service Agent 角色 (roles/cloudscheduler.serviceAgent)。这样做会导致 403 响应发送到需要身份验证的端点,即使作业的服务账号具有适当的角色也是如此。

  2. 如果您的目标位于 Google Cloud内,请向您的服务账号授予必要的 IAM 角色。 Google Cloud 中的每项服务都需要特定角色,并且接收服务会自动验证生成的令牌。例如,对于 Cloud Run 和第二代 Cloud Run functions,您必须授予 Cloud Run Invoker 角色。

    如需获得将服务账号关联到资源所需的权限,请让您的管理员为您授予服务账号的 Service Account User (roles/iam.serviceAccountUser) IAM 角色。此预定义角色包含将服务账号关联到资源所需的 iam.serviceAccounts.actAs 权限。(如果您创建了服务账号,系统会自动为您授予此权限。)

    在上一步中,如果您专门创建了一个服务账号来调用 Cloud Scheduler 作业的目标服务,则可以遵循最小权限原则,将该账号及其调用者权限绑定到目标服务:

    控制台

    1. 在 Google Cloud 控制台的项目选择器页面上,选择一个Google Cloud 项目。

      转到“项目选择器”

    2. 前往您要调用的资源类型对应的页面。例如,如果您要调用 Cloud Run 服务,请前往列出 Cloud Run 服务的页面。

    3. 选中要调用的服务左侧的复选框。 (请勿点击服务本身。)

    4. 点击 权限标签页。

      如果未显示信息窗格,您可能需要依次点击显示信息面板 > 权限

    5. 点击 添加主账号

    6. 新的主账号字段中,输入您创建的服务账号的电子邮件地址。

    7. 选择角色列表中,选择要授予的角色。

      请遵循最小权限原则,选择仅包含主账号所需权限的角色。

    8. 点击保存

    gcloud

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
        --member=PRINCIPAL \
        --role=ROLE
    

    替换以下内容:

    • RESOURCE_TYPE:目标资源的类型。 例如,对于 Cloud Run 目标,值为 run
    • RESOURCE_ID:目标的标识符。例如,Cloud Run 目标的服务的名称。
    • PRINCIPAL:您的服务账号的标识符。该值采用以下格式:serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS。例如,serviceAccount:my-service-account@my-project.iam.gserviceaccount.com
    • ROLE:目标服务在调用时所需的角色名称。例如,roles/run.invoker 适用于 Cloud Run 或第二代 Cloud Run 函数目标。
    • 如需了解其他可选参数,请参阅 gcloud 命令行参考

    示例:

    • 向 Cloud Run 服务 my-service 上的服务账号 my-service-account@my-project.iam.gserviceaccount.com 授予 Cloud Run Invoker (roles/run.invoker) IAM 角色:

      gcloud run add-iam-policy-binding my-service \
          --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
          --role=roles/run.invoker
      
    • 向 Cloud Run 函数 my-gen2-function 上的服务账号 my-service-account@my-project.iam.gserviceaccount.com 授予第二代 Cloud Run 函数所需的 Cloud Run Invoker (roles/run.invoker) IAM 角色:

      gcloud functions add-iam-policy-binding my-gen2-function \
          --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
          --role=roles/run.invoker \
          --gen2
      
  3. 如果目标位于 Google Cloud之外,则接收服务必须手动验证令牌

  4. 在您启用 Cloud Scheduler API 时,系统会自动设置默认的 Cloud Scheduler 服务代理,除非您在 2019 年 3 月 19 日之前启用该 API,在这种情况下,您必须授予 Cloud Scheduler 服务代理角色。这样,它就可以代表您的服务账号生成标头令牌,以便针对您的目标执行身份验证。

创建使用身份验证的 Cloud Scheduler 作业

为了在 Cloud Scheduler 与 HTTP 目标之间执行身份验证,Cloud Scheduler 会根据您的客户端服务账号(由其电子邮件地址标识)创建一个标头令牌,并通过 HTTPS 将其发送至目标。 您可以使用 ID (OIDC) 令牌或 OAuth(访问)令牌。我们一般会使用 OIDC 令牌,但 *.googleapis.com 上托管的 Google API 除外,因为这些 API 需要使用 OAuth 令牌。

如需创建使用身份验证的 Cloud Scheduler 作业,您必须在创建作业时添加令牌类型和用于标识客户端服务账号的电子邮件地址:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Scheduler 页面。

    前往 Cloud Scheduler

  2. 点击 创建作业

  3. 名称字段中,输入一个在项目中唯一的作业名称。请注意,即使删除项目关联的作业后,您也不可在其中重新使用作业名称。

  4. 区域列表中,为您的作业选择一个区域。

  5. 为作业指定频率时区。 您在此处提供的字符串可以是任何与 unix-cron 兼容的字符串。

  6. 点击继续

  7. 目标类型列表中,选择 HTTP

  8. 指定 网址HTTP 方法

  9. 身份验证标头列表中,选择令牌类型。我们一般会使用 OIDC 令牌,但 *.googleapis.com 上托管的 Google API 除外,因为这些 API 需要使用 OAuth 令牌。

  10. 服务账号列表中,选择您的服务账号电子邮件地址。

  11. 您可以选择指定一个目标对象,以限制 OIDC 令牌的接收者;通常是指作业的目标网址(不带任何网址参数)。如果未指定,则整个网址(包括请求参数)都将用作目标对象。

  12. 配置任何可选设置。

  13. 点击创建

gcloud

gcloud scheduler jobs create http JOB_ID \
    --schedule="FREQUENCY" \
    --uri=URI \
    --oidc-service-account-email=SERVICE_ACCOUNT_EMAIL

替换以下内容:

  • JOB_ID:作业的名称,在相应项目中必须是唯一的。请注意,即使删除项目关联的作业后,您也不可在其中重新使用作业名称。
  • FREQUENCY:作业的运行间隔或频率;例如 every 3 hoursevery 10 mins。 您在此处提供的字符串可以是任何与 unix-cron 兼容的字符串。
  • URI:端点的完全限定网址。
  • SERVICE_ACCOUNT_EMAIL:服务账号的电子邮件地址。我们一般会使用 OIDC 令牌,但 *.googleapis.com 上托管的 Google API 除外,因为这些 API 需要使用 OAuth 令牌。(请改用 --oauth-service-account-email 标志来定义 OAuth 令牌类型。)
  • 如需了解其他可选参数,请参阅 gcloud 命令行参考

授予 Cloud Scheduler Service Agent 角色

某些 Google Cloud 服务需要访问您的资源才能代表您执行操作。为了满足这一需求, Google Cloud 会创建和管理称为服务代理的服务账号。当您启用和使用 Google Cloud服务时,系统会自动创建这些服务账号并授予相应角色。

Cloud Scheduler 服务代理需要 Cloud Scheduler Service Agent (roles/cloudscheduler.serviceAgent) 角色。如果没有此角色,Cloud Scheduler 作业会失败。您可以手动向 Cloud Scheduler 服务代理授予该角色,该服务代理的电子邮件地址具有以下格式:

service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com

仅当满足以下任一条件时,您才需要手动授予该角色:

  • 您在 2019 年 3 月 19 日之前启用了 Cloud Scheduler API
  • 您已从服务代理中移除了 Cloud Scheduler Service Agent 角色

您可以查看项目的当前访问权限,验证 Cloud Scheduler 服务代理是否已在项目中设置,以及是否已向其授予 Cloud Scheduler Service Agent 角色。请注意,如果您使用 Google Cloud 控制台查看项目的访问权限,请务必选中包括 Google 提供的角色授予复选框。

如需了解如何向服务代理授予角色,请参阅创建服务代理并授予角色

后续步骤

了解如何以编程方式向 Cloud Scheduler 进行身份验证