Terraform を使用して cron ジョブをスケジュールして実行する

このクイックスタートでは、Terraform を使用して Cloud Scheduler cron ジョブを作成する方法について説明します。Terraform は、コードを使用してクラウド インフラストラクチャを予想どおりに作成、変更、改善できる Infrastructure as Code(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. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. 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.

  8. Cloud Shell には Terraform がすでに統合されています。Terraform をインストールする必要がある場合は、HashiCorp Terraform のドキュメントをご覧ください。

Terraform 構成ファイルを作成する

Terraform を Cloud Scheduler で使用するには、構成ファイルを作成してインフラストラクチャを記述し、実行プランを作成する必要があります。次に、構成ファイルをプラットフォームまたはサービスに適用して、インフラストラクチャをプロビジョニングするオペレーションを実行します。

次の手順で main.tf という Terraform 構成ファイルを作成します。

  1. ターミナルを開いてディレクトリを作成します。

    mkdir terraform
  2. terraform ディレクトリに移動します。

    cd terraform
  3. 新しいファイル main.tf をディレクトリに追加します。

    nano main.tf
  4. 次の Google Cloud 用の Terraform プロバイダ リソースを 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: ジョブの実行時にメッセージ ペイロード(data)が公開されるトピック(topic_name)の完全なリソース名を含む Pub/Sub トピック ターゲット。

      その他の引数もサポートされています。詳細については、Terraform Registry 引数リファレンスをご覧ください。

cron ジョブを作成します。

Terraform リソースをデプロイして cron ジョブを作成します。

  1. ターミナルを開き、terraform ディレクトリで Terraform を初期化します。

    terraform init
  2. Terraform で示した変更が、想定されているプランと一致していることを確認します。

    terraform plan

    -out オプションを使用しないという注意事項は無視できます。

  3. cron ジョブを作成します。

    terraform apply
  4. [Enter a value] プロンプトで、「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 メッセージを pull する

    gcloud pubsub subscriptions pull pubsub_subscription --limit 5
    

    最初に pull されたメッセージがない場合は、コマンドを再実行します。

  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

次のステップ