对 HTTP 目标使用身份验证

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

设置服务账号

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

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

    • 请勿使用 Cloud Scheduler 服务代理 (service-YOUR_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 和第 2 代 Cloud Run 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:目标的资源类型。例如,对于 Cloud Run 目标,请使用 run
    • RESOURCE_ID:目标的标识符。例如,Cloud Run 目标的服务名称。
    • PRINCIPAL:服务账号的标识符。其格式如下:serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS。例如 serviceAccount:my-service-account@my-project.iam.gserviceaccount.com
    • ROLE:目标服务调用所需的角色的名称。例如,对于 Cloud Run 或第 2 代 Cloud Run functions 目标,请使用 roles/run.invoker

    示例:

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

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

      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 Service Agent 角色。这样它就可以代表您的客户端服务账号生成标头令牌,以便对您的目标执行身份验证。

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

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

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

控制台

  1. 照常指定频率。
  2. HTTP 指定为目标类型。
  3. 照常添加网址和 HTTP 方法。
  4. Auth header 列表中,选择令牌类型。请注意,我们一般会使用 OIDC(身份令牌),但 *.googleapis.com 上托管的 Google API 除外,因为这些 API 需要使用 OAuth 访问令牌。
  5. 对于服务账号,请指定客户端服务账号电子邮件地址。
  6. 目标对象是可选的,用于限制 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:定义令牌类型。请注意,我们一般会使用 OIDC 令牌,但 *.googleapis.com 上托管的 Google API 除外,因为这些 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

    如果有状态字段,并且状态列为已启用,请继续操作。如果未启用,请点击启用

  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 Service Agent

  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:您之前复制的项目编号