将身份验证与 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 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 Invoker 角色 my-service-account@my-project.iam.gserviceaccount.com - Cloud Run 服务 my-service

      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 Run Invoker 角色 将 Cloud Functions 函数应用于服务账号 my-service-account@my-project.iam.gserviceaccount.com - 第 2 个 代 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 服务账号 启动 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,Google API 除外 托管在 *.googleapis.com 上,因为这些 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 作业失败。您可以将 您的 Cloud Scheduler 的 Cloud Scheduler Service Agent 角色 Google Cloud 控制台服务账号,或使用 gcloud CLI:

控制台

  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:您要创建的项目编号 先前已复制