如果您已设置具有适当凭据的关联服务帐号,则 Cloud Scheduler 可以调用需要身份验证的 HTTP 目标。
设置服务帐号
服务账号通常供 应用或计算工作负载使用,并由其电子邮件地址(对该账号是 唯一的)标识。
应用可以使用服务账号来执行已获授权的 API 调用(以服务帐号本身的身份进行身份验证),并访问服务帐号有权访问的所有资源。
若要让应用使用服务帐号证明其身份,最常见的方法是将服务帐号关联到运行该应用的资源。然后,您可以向服务帐号授予 Identity and Access Management (IAM) 角色,让该 服务帐号可以访问相应的 Google Cloud 资源。
如果您还没有要用于 Cloud Scheduler 作业(具有 HTTP 目标)的服务帐号, 请创建一个新服务账号。请注意以下几点:
服务帐号必须属于创建 Cloud Scheduler 作业的项目。
请勿使用 Cloud Scheduler 服务代理 (
service-PROJECT_NUMBER@gcp-sa-cloudscheduler.)。 它不能用于此目的。请勿从项目中的 Cloud Scheduler 服务代理撤消 Cloud Scheduler Service Agent 角色 (
roles/cloudscheduler.serviceAgent)。这样做会导致403响应发送到需要身份验证的端点,即使作业的服务账号具有适当的角色也是如此。
如果您的目标位于内 Google Cloud, 请向您的服务帐号授予必要的 IAM 角色 。内的每项服务都需要特定的角色,并且接收服务会自动验证生成的令牌。 Google Cloud
例如,对于 Cloud Run 和最新版本的 Cloud Run functions,您必须授予 Cloud Run Invoker (
roles/run.invoker) 角色,而对于 Cloud Run functions(第 1 代),您 必须授予 Cloud Functions Invoker (roles/cloudfunctions.invoker) 角色。如需获得将服务帐号关联到资源所需的权限,请让您的管理员为您授予服务帐号的 Service Account User () IAM 角色。
roles/iam.serviceAccountUser此预定义角色可提供将服务帐号关联到资源所需的iam.serviceAccounts.actAs权限。(创建服务帐号后,系统会自动为您授予此权限。)在上一步中,如果您专门创建了一个服务帐号来调用 Cloud Scheduler 作业所面向的服务,则可以通过将该账号及其调用方权限绑定到目标服务来遵循最小权限原则:
控制台
在 Google Cloud 控制台的项目选择器页面上,选择一个 Google Cloud 项目。
前往您要调用的资源类型的页面。例如,如果您要调用 Cloud Run 服务,请前往列出 Cloud Run 服务的页面。
选中要调用的服务左侧的复选框。 (请勿点击服务本身。)
点击 权限 标签页。
如果未显示信息窗格,您可能需要点击 显示信息面板 > 权限。
点击 添加主账号。
在新的主账号 字段中,输入您创建的服务帐号的电子邮件地址。
从选择角色 列表中,选择要授予的角色。
遵循最小权限原则,选择仅包含主账号所需权限的角色。
点击保存 。
gcloud
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \ --member=PRINCIPAL \ --role=ROLE替换以下内容:
RESOURCE_TYPE:目标的资源类型。 例如,Cloud Run 服务目标的run services。RESOURCE_ID:目标的标识符。例如,Cloud Run 服务的名称。PRINCIPAL:服务账号的标识符。其格式如下:serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS。例如,serviceAccount:my-service-account@my-project.。ROLE:目标服务调用所需的角色的名称。例如,Cloud Run 服务目标的roles/run.invoker。对于 Cloud Run functions 目标,我们建议使用add-invoker-policy-binding命令。
示例:
使用
gcloud run services add-iam-policy-binding命令向 Cloud Run 服务my-service上的服务帐号my-service-account@my-project.授予 Cloud Run Invoker (roles/run.invoker) IAM 角色:gcloud run services add-iam-policy-binding my-service \ --member=serviceAccount:my-service-account@my-project. \ --role=roles/run.invoker使用
gcloud functions add-invoker-policy-binding命令向 Cloud Run functionmy-cloud-function上的服务帐号my-service-account@my-project.授予适当的角色。对于最新版本的 Cloud Run functions,此命令会将 Cloud Run Invoker (
roles/run.invoker) 绑定添加到 指定函数底层 Cloud Run 服务的 IAM 政策。对于 Cloud Run functions(第 1 代),此命令会将 Cloud Functions Invoker (roles/cloudfunctions.invoker)绑定添加到指定函数的 IAM 政策:gcloud functions add-invoker-policy-binding my-cloud-function \ --member=serviceAccount:my-service-account@my-project.
如需查看使用 Terraform 创建有权调用 Cloud Run 服务的服务帐号的示例,请参阅 为 Cloud Scheduler 创建服务帐号。
如果您的目标位于之外 Google Cloud,接收服务必须 手动验证令牌。
在您启用 Cloud Scheduler API 时,系统会自动创建默认的 Cloud Scheduler 服务代理,除非您在 2019 年 3 月 19 日之前启用该 API,在这种情况下,您必须 授予 Cloud Scheduler Service Agent 角色。这样,它就可以代表您的服务帐号生成标头令牌,以便对您的目标进行身份验证。
创建使用身份验证的 Cloud Scheduler 作业
为了在 Cloud Scheduler 与 HTTP 目标之间执行身份验证,Cloud Scheduler 会根据您的客户端服务账号(由其电子邮件地址标识)创建一个标头令牌,并通过 HTTPS 将其发送至目标。
您可以使用
ID (OIDC) 令牌
也可以使用 OAuth(访问)令牌。我们一般会使用 OIDC 令牌,但 *.googleapis.com 上托管的 Google API 除外 ,因为这些 API 需要使用 OAuth 令牌。
如需创建使用身份验证的 Cloud Scheduler 作业,您必须在创建作业时添加令牌类型和用于标识客户端服务帐号的电子邮件地址:
控制台
在 Google Cloud 控制台中,前往 Cloud Scheduler 页面。
点击 创建作业。
在名称 字段中,为您的作业输入一个在项目中唯一的名称。请注意,即使删除项目关联的作业后,您也不可在其中重新使用作业名称。
在区域 列表中,为您的作业选择一个区域。
为您的作业指定频率 和时区 。 您在此处提供的字符串可以是任何 与 unix-cron 兼容的 字符串。
点击继续 。
在目标类型 列表中,选择 HTTP 。
指定 网址 和 HTTP 方法 。
在身份验证标头 列表中,选择令牌类型。我们一般会使用 OIDC 令牌,但
*.googleapis.com上托管的 Google API 除外 ,因为这些 API 需要使用 OAuth 令牌。在服务账号 列表中,选择您的服务帐号电子邮件地址。
(可选)指定目标设备 ,以限制 OIDC 令牌的接收者;通常是指作业的目标网址(不带任何网址参数)。如果未指定,那么系统会使用整个网址(包括请求参数)作为目标设备。
配置任何可选设置。
点击创建 。
gcloud
gcloud scheduler jobs create http JOB_ID \ --schedule="FREQUENCY" \ --uri=URI \ --oidc-service-account-email=SERVICE_ACCOUNT_EMAIL
替换以下内容:
JOB_ID:作业的名称,在项目中必须是唯一的。请注意,即使删除项目关联的作业后,您也不可在其中重新使用作业名称。FREQUENCY:作业的运行间隔或运行频率;例如,every 3 hours或every 10 mins。 您在此处提供的字符串可以是任何 与 unix-cron 兼容的 字符串。URI:端点的完全限定网址。SERVICE_ACCOUNT_EMAIL:您的服务账号的电子邮件地址。我们一般会使用 OIDC 令牌,但*.googleapis.com上托管的 Google API 除外 ,因为这些 API 需要使用 OAuth 令牌。(请改用--oauth-service-account-email标志来定义 OAuth 令牌类型。)- 如需了解其他可选参数,请参阅 gcloud 命令行参考。
授予 Cloud Scheduler Service Agent 角色
某些 Google Cloud 服务需要访问您的资源才能 代表您执行操作。为了满足这一需求, Google Cloud 会创建和管理 服务账号(称为 服务代理),并且在您启用和使用 Google Cloud 服务时自动创建这些服务账号并向其授予角色。
Cloud Scheduler 服务代理需要
Cloud Scheduler Service Agent
(roles/cloudscheduler.serviceAgent) 角色。如果没有此角色,Cloud Scheduler 作业会失败。您可以手动向 Cloud Scheduler 服务代理授予此角色,该服务代理的电子邮件地址格式如下:
service-PROJECT_NUMBER@gcp-sa-cloudscheduler.
仅当 符合以下条件之一时,您才需要手动授予此角色:
- 您在 2019 年 3 月 19 日之前启用了 Cloud Scheduler API
- 您从服务代理中移除了 Cloud Scheduler Service Agent 角色
您可以通过 查看项目的当前访问权限,验证 Cloud Scheduler 服务代理是否已在 项目中设置,以及是否已向其授予 Cloud Scheduler Service Agent 角色。 请注意,如果您使用 Google Cloud 控制台查看项目的访问权限, 请务必选中包括 Google 提供的角色授权复选框。
如需了解如何向服务代理授予角色,请参阅 创建服务代理并授予角色。