使用 Terraform 安排和运行 Cron 作业

本快速入门介绍了如何使用 Terraform 创建 Cloud Scheduler cron 作业。Terraform 是一种基础设施即代码 (IaC) 工具,可让您使用代码以可预测的方式创建、更改和改进您的云基础设施。您可以详细了解如何使用 Terraform 在 Google Cloud上预配基础架构。

Cloud Scheduler 提供免费层级,运行此快速入门不应产生任何费用。如需了解详情,请参阅价格

在本快速入门中,您将执行以下操作:

  1. 使用 Terraform 为 Cloud Scheduler 创建 Cron 作业。
  2. 为作业设置周期性计划。
  3. 将 Pub/Sub 主题指定为作业目标。
  4. 运行该作业。
  5. 验证作业是否已成功运行。

准备工作

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. Install the Google Cloud CLI.

  3. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  4. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Install the Google Cloud CLI.

  7. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  8. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Cloud Shell 已集成 Terraform。如果您需要安装 Terraform,请参阅 HashiCorp Terraform 文档
  11. 创建 Terraform 配置文件

    如需将 Terraform 与 Cloud Scheduler 搭配使用,您需要创建一个配置文件来描述基础设施并创建执行计划。然后,您将配置文件应用于平台或服务,以执行预配基础架构的操作。

    完成以下步骤,以创建名为 main.tf 的 Terraform 配置文件:

    1. 打开终端并创建目录:

      mkdir terraform
    2. 转到 terraform 目录:

      cd terraform
    3. 向该目录添加一个新文件 main.tf

      nano main.tf
    4. 将以下 Terraform 提供程序(适用于 Google Cloud 资源)添加到 main.tf 文件中:

      1. 启用 Cloud Scheduler 和 Pub/Sub API:

        # Enable Cloud Scheduler API
        resource "google_project_service" "scheduler" {
          service            = "cloudscheduler.googleapis.com"
          disable_on_destroy = false
        }
        # Enable Pub/Sub API
        resource "google_project_service" "pubsub" {
          service            = "pubsub.googleapis.com"
          disable_on_destroy = false
        }
      2. 创建一个 Pub/Sub 主题作为资源,发布者可将消息发送到该资源:

        # Create Pub/Sub topic
        resource "google_pubsub_topic" "default" {
          name = "pubsub_topic"
        }

        这将创建一个名为 pubsub_topic 的主题。

      3. 创建订阅以接收发布到 Pub/Sub 主题的消息:

        # Create Pub/Sub subscription
        resource "google_pubsub_subscription" "default" {
          name  = "pubsub_subscription"
          topic = google_pubsub_topic.default.name
        }
      4. 使用 google_cloud_scheduler_job 资源创建 Cron 作业:

        # Create a cron job using Cloud Scheduler
        resource "google_cloud_scheduler_job" "default" {
          name        = "test-job"
          description = "test job"
          schedule    = "30 16 * * 7"
          region      = "us-central1"
        
          pubsub_target {
            topic_name = google_pubsub_topic.default.id
            data       = base64encode("Hello world!")
          }
        }

        示例中使用了以下实参:

        • name:作业的名称。
        • description:作业的说明。
        • schedule:作业的频率,使用基于 unix-cron 的格式。

          在此示例中,30 16 * * 7 表示作业将在周日 16:30 运行。如需了解详情,请参阅 Cron 作业格式和时区

        • region:作业所在的区域。

        • pubsub_target:Pub/Sub 主题目标,包括主题的完整资源名称 (topic_name),作业运行时消息载荷 (data) 会发布到该主题。

        支持其他实参。如需了解详情,请参阅 Terraform 注册表实参参考

    创建 Cron 作业

    部署 Terraform 资源以创建 Cron 作业。

    1. 打开终端,然后在 terraform 目录中初始化 Terraform:

      terraform init
    2. 检查您向 Terraform 建议的更改是否与预期方案匹配:

      terraform plan

      您可以忽略有关不使用 -out 选项的备注。

    3. 创建 Cron 作业:

      terraform apply
    4. 输入值提示符处,输入 yes 以继续创建资源。

    5. 确认已创建作业:

      gcloud scheduler jobs describe test-job --location=us-central1

      输出应类似如下所示:

      description: test job
      lastAttemptTime: '2024-04-04T13:56:00.669530Z'
      name: projects/PROJECT_ID/locations/us-central1/jobs/test-job
      pubsubTarget:
      data: dGVzdA==
      topicName: projects/PROJECT_ID/topics/pubsub_topic
      schedule: '30 16 * * 7'
      scheduleTime: '2024-04-04T13:58:00.737907Z'
      state: ENABLED

    您已创建一项作业,该作业会在周日 16:30 向 Pub/Sub 主题发送消息。您现在可以运行该作业了。

    运行作业

    除了按照指定的时间表执行作业之外,您还可以通过运行以下命令强制作业立即执行。

    gcloud scheduler jobs run test-job --location=us-central1

    请注意,由于需要进行一些初始配置,因此在项目中创建的第一项作业可能需要几分钟时间才能运行完毕。

    验证结果

    验证您的 Pub/Sub 主题是否将收到来自作业的消息。

    1. 从订阅中拉取 Pub/Sub 消息:

      gcloud pubsub subscriptions pull pubsub_subscription --limit 5
      

      如果一开始没有拉取到消息,请再次运行该命令。

    2. 查看运行作业的结果。输出应类似如下所示:

      DATA: Hello world!
      MESSAGE_ID: 5028933846601543
      ORDERING_KEY:
      ATTRIBUTES:
      DELIVERY_ATTEMPT:
      ACK_ID: RFAGFixdRkhRNxkIaFEOT14jPzUgKEUQAgVPAihdeTFXLkFacGhRDRlyfWB9[...]
      

    清理

    为避免因本页面中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的 Google Cloud 项目。

    1. 删除 Google Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。请注意,默认情况下,Cloud Shell 主目录中的所有文件(例如所有 Terraform 文件)都会在会话之间保持不变。

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID
    2. 或者,您也可以删除使用 Terraform 创建的所有资源。

      terraform destroy 命令会终止 Terraform 状态中指定的所有资源。它不会销毁当前 Terraform 项目未管理的资源。您的 Terraform 配置文件不会被销毁。如需了解详情,请参阅销毁基础架构

      terraform destroy

    后续步骤