将身份验证与 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 和第二代 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:调用目标服务所需的角色的名称。例如,roles/run.invoker 表示 Cloud Run 或第二代 Cloud Functions 目标。

    示例:

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

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

      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(ID 令牌),但 *.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:定义令牌类型。请注意,除了 *.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 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
      
    • 否则,请启用该 API(例如,如果您看到 Listed 0 items.):

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