对 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 Service Agent (roles/cloudscheduler.serviceAgent) 角色中移除默认的 Cloud Scheduler 服务帐号。这样做会导致对需要身份验证的端点进行 403 响应,即使您作业的服务帐号具有适当的角色也是如此。

  2. 如果您的目标在 Google Cloud 内,向您的服务帐号授予必要的 IAM 角色。Google Cloud 中的每项服务都需要不同的角色,而接收服务会自动验证生成的令牌。例如,对于 Cloud Run,您必须添加 Cloud Run Invoker 角色。

    请注意,要使用用户管理的服务帐号部署资源,部署者必须具有该服务帐号的 iam.serviceAccounts.actAs 权限。如果您创建了服务帐号,系统会自动为您授予此权限。如果不是,则具有正确权限的人必须向您授予服务帐号的此权限。

  3. 如果您的目标是 Google Cloud 外部人员,则接收服务必须手动验证令牌

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

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

使用身份验证创建调度程序作业

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

控制台

  1. 照常指定频率。
  2. HTTP 指定为目标类型。
  3. 照常添加网址和 HTTP 方法。
  4. 身份验证标头列表中,选择令牌类型。请注意,除了在 *.googleapis.com 上托管的 Google API 之外,通常使用 OIDC(ID 令牌),因为这些 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(托管在 *.googleapis.com 上的 Google API 除外),因为这些 API 需要 OAuth 令牌。

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

当您在 2019 年 3 月 19 日之前启用 Cloud Scheduler API 的情况下,才需要执行此操作。

控制台

  1. 在控制台中,转到设置页面。

    转到“设置”

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

  3. 在控制台中,转到 IAM 页面。

    转到 IAM

  4. 点击 Add。系统会打开添加主帐号窗格。

  5. 新的主帐号字段中,添加以下格式的电子邮件地址:

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

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

  6. 选择角色列表中,选择 Service Management > Cloud Scheduler Service Agent

  7. 点击保存

gcloud

  1. 找到您的项目编号:

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

    PROJECT_ID 替换为您的项目 ID。

  2. 复制该电话号码。

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