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. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  4. gcloud CLI を初期化するには、次のコマンドを実行します。

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  8. gcloud CLI を初期化するには、次のコマンドを実行します。

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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. main.tf ファイルに次の Google Cloud リソースの Terraform プロバイダを追加します。

      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 レジストリ引数リファレンスをご覧ください。

    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

    次のステップ