对 HTTP 目标使用身份验证

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

设置服务账号

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

    • 该服务帐号必须属于在其中创建 Cloud Scheduler 作业的项目。

    • 请勿使用默认的 Cloud Scheduler 服务帐号 (service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com)。此 Google 代管式服务帐号(也称为服务代理)不能用于此目的。

    • 请勿从项目中移除默认的 Cloud Scheduler 服务帐号或其 Cloud Scheduler Service Agent (roles/cloudscheduler.serviceAgent) 角色。这样做会导致对需要身份验证的端点做出 403 响应,即使您作业的服务帐号具有适当的角色也是如此。

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

    请注意,如需使用用户代管式服务帐号部署资源,部署者必须拥有该服务帐号的 iam.serviceAccounts.actAs 权限。如果您创建了服务帐号,系统会自动为您授予此权限。否则,必须由拥有正确权限的人员授予您对服务帐号的此权限。

    最佳做法:在上一步中,如果您创建了专门用于调用 Cloud Scheduler 作业目标服务的服务帐号,请考虑将帐号及其调用方权限绑定到您的目标服务,遵循最小权限原则(安全性最佳实践)。您可以使用 Google Cloud 控制台或 gcloud CLI 执行此操作:

    控制台

    1. 打开 Google Cloud 控制台。

    前往控制台

    2. 选择您的项目。

    3. 导航到您要调用的资源类型的页面。例如,如果您要调用 Cloud Run 服务,请导航到列出 Cloud Run 服务的页面。

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

    5. 点击权限标签页。如果信息窗格不可见,您可能需要点击显示信息面板,然后点击权限

    6. 点击 添加主账号

    7. 在添加主账号下,输入您创建的服务帐号的电子邮件地址。

    8. 在分配角色下,从下拉列表中选择要授予的角色。 选择仅包含主账号所需权限的角色,遵循最小权限原则。

    9. 点击保存

    gcloud

    运行 add-iam-policy-binding 命令:

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

    您需要在其中:

    • RESOURCE_TYPE:目标的资源类型。例如,run 表示 Cloud Run 目标。
    • RESOURCE_ID:您的目标的标识符。例如,Cloud Run 目标的服务名称。
    • PRINCIPAL:您的服务帐号的标识符。其格式如下:serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS。例如,serviceAccount:my-service-account@my-project.iam.gserviceaccount.com
    • ROLE:您的目标服务调用时所需的角色名称。例如,对于 Cloud Run 或第二代 Cloud Functions 目标,请使用 roles/run.invoker

    示例:

    • Cloud Run 目标:以下命令将 Cloud Run Invoker 角色授予 Cloud Run 服务 my-service 的服务帐号 my-service-account@my-project.iam.gserviceaccount.com

      gcloud run add-iam-policy-binding my-service \
      --member=my-service-account@my-project.iam.gserviceaccount.com \
      --role=roles/run.invoker
      
    • Cloud Functions 目标:以下命令将第二代 Cloud Functions 函数所需的 Cloud Run Invoker 角色授予第二代 Cloud Functions 函数 my-gen2-function 的服务帐号 my-service-account@my-project.iam.gserviceaccount.com

      gcloud functions add-iam-policy-binding my-gen2-function \
      --member=my-service-account@my-project.iam.gserviceaccount.com \
      --role=roles/run.invoker --gen2
      
  3. 如果您的目标不在 Google Cloud 中,则接收方服务必须手动验证令牌

  4. 默认的 Cloud Scheduler 服务帐号会在您启用 Cloud Scheduler API 时自动设置,除非您在 2019 年 3 月 19 日之前启用,在这种情况下,您必须手动添加 Cloud Scheduler Service Agent 角色。这样,它就可以代表您的客户端服务帐号生成标头令牌,以针对您的目标进行身份验证。

    您可以通过查看项目的当前访问权限来验证项目中是否设置了默认的 Cloud Scheduler 服务帐号,以及该帐号是否已被授予 Cloud Scheduler Service Agent 角色。请注意,如果您使用 Google Cloud 控制台查看项目的访问权限,请务必选中包括 Google 提供的角色授权复选框。

创建具有身份验证的调度器作业

如需创建使用身份验证的作业,您需要在 create-job 请求中添加令牌类型和用于标识客户端服务帐号的电子邮件地址:

控制台

  1. 照常指定频率。
  2. 指定 HTTP 作为目标类型。
  3. 像往常一样添加网址和 HTTP 方法。
  4. Auth 标头列表中,选择令牌类型。请注意,OIDC(ID 令牌)通常使用,托管在 *.googleapis.com 上的 Google API 除外,因为这些 API 需要 OAuth 访问令牌。
  5. 对于服务帐号,请指定客户端服务帐号的电子邮件地址。
  6. Audience 是可选项,用于限制 OIDC 令牌的接收者;通常是作业的目标网址(不带任何网址参数)。如果未指定,默认情况下,系统会将整个网址(包括请求参数)用作受众群体。

gcloud

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

替换以下内容:

  • JOB_ID:作业的名称。它在项目中必须是唯一的。请注意,即使删除了项目中的作业名称,您也无法重复使用该作业的名称。
  • FREQUENCY:作业间隔是指作业运行的频率,例如 every 3 hoursevery 10 mins。您在此处提供的字符串可以是任何与 Crontab 兼容的字符串。 (尽管我们不再建议使用旧版 App Engine cron 语法,但现有作业仍然支持旧版)。
  • URI:端点的完全限定网址。
  • --oidc-service-account-email--oauth-service-account-email:定义令牌类型。请注意,除了 *.googleapis.com 上托管的 Google API 之外,我们通常会使用 OIDC,因为这些 API 需要使用 OAuth 令牌。
  • CLIENT_SERVICE_ACCOUNT_EMAIL:客户端服务帐号的电子邮件地址。
  • 另外还提供了其他可选参数,gcloud 命令行参考文档中介绍了这些参数。

选择令牌类型

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

手动将 Cloud Scheduler Service Agent 角色添加到您的 Cloud Scheduler 服务帐号

只有满足以下任一条件时才需要执行此操作:

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

Cloud Scheduler 服务帐号需要 Cloud Scheduler Service Agent 角色。如果没有此角色,Cloud Scheduler 作业将失败。您可以通过 Google Cloud 控制台或使用 gcloud CLI 将 Cloud Scheduler Service Agent 角色添加到您的 Cloud Scheduler 服务帐号:

控制台

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

    转到 Cloud Scheduler API

    如果存在 Status 字段且状态被列为 Enabled,请继续。如果未启用,请点击启用

  2. 在 Google Cloud 控制台中,前往设置页面。

    转到“设置”

  3. 查找并复制您的项目编号。

  4. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  5. 点击授予访问权限授予访问权限窗格随即会打开。

  6. 新的主账号字段中,添加采用以下格式的电子邮件地址:

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

    PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。

  7. 选择角色列表中,搜索并选择 Cloud Scheduler 服务代理

  8. 点击保存

gcloud

  1. 确认您的项目已启用 Cloud Scheduler API:

    gcloud services list --enabled \
     --filter=cloudscheduler.googleapis.com
    
    • 如果您看到以下输出,则表明该 API 已启用:

      NAME: cloudscheduler.googleapis.com
      TITLE: Cloud Scheduler API
      
    • 否则(例如,如果您看到 Listed 0 items.),请启用该 API:

      gcloud services enable cloudscheduler.googleapis.com
      
  2. 找到您的项目编号:

    gcloud projects describe PROJECT_ID --format='table(projectNumber)'
    

    PROJECT_ID 替换为您的项目 ID。

  3. 复制该号码。

  4. 向 Cloud Scheduler 服务帐号授予 Cloud Scheduler Service Agent 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com \
       --role roles/cloudscheduler.serviceAgent
    

    替换以下内容:

    • PROJECT_ID:您的项目 ID
    • PROJECT_NUMBER:您之前复制的项目编号