将身份验证与 HTTP 目标搭配使用

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

设置服务账号

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

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

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

    • 请勿撤消 Cloud Scheduler Service Agent 角色 (roles/cloudscheduler.serviceAgent) 来自 Cloud Scheduler 服务代理这样做会导致403 对要求身份验证的端点的响应,即使作业的服务 拥有适当的角色。

  2. 如果您的目标是在 Google Cloud 中,请授予必要的权限 向您的服务授予 IAM 角色 。Google Cloud 中的每项服务都需要特定的角色, 接收方服务会自动验证生成的令牌。对于 适用于 Cloud Run 和第二代 Cloud Run 函数,您必须添加 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 函数目标:以下命令会将第 2 代 Cloud Run 函数 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 服务账号 启动 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 header 列表中,选择令牌类型。请注意,OIDC (ID 令牌)通常用于除以下网站上运行的 Google API: *.googleapis.com,因为这些 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:您之前复制的项目编号