按计划运行服务

您可以使用 Cloud Scheduler 以安全的方式按计划触发 Cloud Run 服务。这类似于使用 Cron 作业。

可能的使用场景包括:

  • 按时间执行备份
  • 执行周期性管理任务,例如:
    • 重新生成站点地图
    • 删除旧数据、内容、配置或修订版本
    • 在数据系统之间同步内容
    • 处理每日电子邮件通知
    • 验证并报告对下游服务的访问权限
  • 生成文档,如账单

此页面介绍如何在同一 Google Cloud 项目中以安全的方式将 Cloud Scheduler 与 Cloud Run 结合使用。

前期准备

在您使用的项目上启用 Cloud Scheduler API

创建和部署服务

如需创建和部署服务,请执行以下操作:

  1. 在您的服务中,实施要按计划运行的作业。

  2. 记下您的服务希望接收哪个请求类型的作业请求,例如 GETPOST。当您创建调用服务的预定作业时,您需要指定与此匹配的 HTTP 方法。

  3. 当您使用 Cloud Scheduler 部署要使用的服务时,请确保不允许未经身份验证的调用。

以下示例展示了如何使用 Terraform 部署 Cloud Run 服务:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-scheduled-service"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

us-docker.pkg.dev/cloudrun/container/hello 替换为对您自己的容器映像的引用。

为 Cloud Scheduler 创建服务账号

您需要创建一个服务账号才能与 Cloud Scheduler 相关联,并授予该服务账号调用 Cloud Run 服务的权限。您可以使用现有的服务账号代表 Cloud Scheduler,也可以创建新的账号。

如需创建服务账号并向其授予调用 Cloud Run 服务的权限,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  2. 选择一个项目。

  3. 输入要在 Google Cloud 控制台中显示的服务账号名称。

    Google Cloud 控制台会根据此名称生成服务账号 ID。如有必要,请修改 ID。此 ID 创建后便无法更改。

  4. 可选:输入服务账号的说明。

  5. 点击创建并继续

  6. 可选:点击选择角色字段。

  7. 选择 Cloud Run > Cloud Run Invoker

  8. 点击完成

命令行

  1. 创建服务账号:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
       --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"

    注意替换如下内容:

    • SERVICE_ACCOUNT_NAME 替换为 Google Cloud 项目中唯一的小写名称,例如 my-invoker-service-account-name
    • DISPLAYED_SERVICE_ACCOUNT_NAME 替换为您要在控制台等界面中为此服务账号显示的名称,例如 My Invoker Service Account
  2. 对于 Cloud Run,请向您的服务账号授予调用服务的权限:

    gcloud run services add-iam-policy-binding SERVICE \
       --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/run.invoker

    注意替换如下内容:

    • SERVICE 替换为您希望 Cloud Scheduler 调用的服务的名称。
    • SERVICE_ACCOUNT_NAME 替换为服务账号的名称。
    • PROJECT_ID 替换为 Google Cloud 项目 ID。
  3. 向服务账号授予对项目的访问权限,以便其能够完成对项目中资源的特定操作:

    gcloud projects add-iam-policy-binding RESOURCE_ID \
       --member=PRINCIPAL --role=roles/run.invoker

    替换

    • RESOURCE_ID:您的 Google Cloud 项目 ID。

    • PRINCIPAL:主账号(成员)的标识符,通常具有以下格式:PRINCIPAL_TYPE:ID,例如 user:my-user@example.com。如需查看 PRINCIPAL 可以采用的值的完整列表,请参阅政策绑定参考文档

Terraform

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

要使用 Terraform 创建服务账号,请执行以下命令:

resource "google_service_account" "default" {
  account_id   = "scheduler-sa"
  description  = "Cloud Scheduler service account; used to trigger scheduled Cloud Run jobs."
  display_name = "scheduler-sa"

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.iam_api
  ]
}

resource "google_cloud_run_service_iam_member" "default" {
  location = google_cloud_run_v2_service.default.location
  service  = google_cloud_run_v2_service.default.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:${google_service_account.default.email}"
}

创建 Cloud Scheduler 作业

您需要创建一个在指定时间调用您的服务的作业。您可以使用控制台或命令行:

如需创建作业,您可以使用控制台或 gcloud 命令行。点击相应标签页:

控制台

  1. 访问 Cloud Scheduler 控制台页面。

    转到 Cloud Scheduler

  2. 点击创建作业

    屏幕截图

  3. 为作业命名。

  4. 使用配置字符串指定作业运行的频率或作业间隔。例如,字符串 0 */3 * * * 每 3 小时运行一次作业。您在此处提供的字符串可以是任何与 Crontab 兼容的字符串。

    有关更多信息,请参阅配置作业时间表

  5. 从下拉列表中,选择要用于作业频率的时区。

  6. 指定 HTTP 作为目标:

    1. 指定服务的完全限定网址,例如 https://myservice-abcdef-uc.a.run.app。作业将向此网址发送请求。

    2. 指定 HTTP 方法:该方法必须符合先前部署的 Cloud Run 服务的预期。默认值为 POST

    3. 视需要指定要发送到目标的数据。当选择 POSTPUT HTTP 方法时,此数据将在请求正文中发送。

    4. 点击更多以显示身份验证设置。

    5. 从下拉菜单中选择添加 OIDC 令牌

    6. “服务账号”字段中,复制您之前创建的服务账号的电子邮件地址。

    7. 受众群体字段中,复制服务的完整网址。

  7. 点击创建以保存作业。

命令行

您需要使用 OIDC 身份验证从 Cloud Scheduler 访问经过身份验证的 Cloud Run 服务。OIDC 身份验证包括服务账号和受众群体标志。如需了解详情,请参阅对 HTTP 目标使用身份验证

若要创建 Cloud Scheduler 作业,请执行以下操作:

gcloud scheduler jobs create http test-job --schedule "5 * * * *" 
--http-method=HTTP-METHOD
--uri=SERVICE-URL
--oidc-service-account-email=SERVICE-ACCOUNT-EMAIL
--oidc-token-audience=SERVICE-URL

替换

  • HTTP-METHOD 替换为 HTTP 方法(即 GET、POST、PUT 等)。
  • SERVICE-URL 替换为您的服务网址。
  • SERVICE-ACCOUNT-EMAIL 替换为您的服务账号的电子邮件地址。

Terraform

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

要为 Cloud Run 服务创建 Cloud Scheduler 作业,请执行以下命令:

resource "google_cloud_scheduler_job" "default" {
  name             = "scheduled-cloud-run-job"
  region           = "us-central1"
  description      = "Invoke a Cloud Run container on a schedule."
  schedule         = "*/8 * * * *"
  time_zone        = "America/New_York"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "POST"
    uri         = google_cloud_run_v2_service.default.uri

    oidc_token {
      service_account_email = google_service_account.default.email
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.scheduler_api
  ]
}

您的 Cloud Run 服务将由 Cloud Scheduler 作业请求以您定义的频率触发。您可以通过检查此服务的日志来确认和监控该行为。

后续步骤