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. ジョブが正常に実行されていることを確認します。

始める前に

組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud CLI をインストールします。

  3. 外部 ID プロバイダ(IdP)を使用している場合は、まず フェデレーション ID を使用して gcloud CLI にログインする必要があります。

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

    gcloud init
  5. Google Cloud プロジェクトを作成または選択します。

    プロジェクトの選択または作成に必要なロール

    • プロジェクトを選択する: プロジェクトを選択する際に、特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、resourcemanager.projects.create 権限を含むプロジェクト作成者のロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
    • Google Cloud プロジェクトを作成します。

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、 Google Cloud プロジェクトの名前に置き換えます。

  6. このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。

  7. Resource Manager API と Service Usage API が有効になっていない場合は、有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を確認する。

    gcloud services enable cloudresourcemanager.googleapis.com serviceusage.googleapis.com
  8. Google Cloud CLI をインストールします。

  9. 外部 ID プロバイダ(IdP)を使用している場合は、まず フェデレーション ID を使用して gcloud CLI にログインする必要があります。

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

    gcloud init
  11. Google Cloud プロジェクトを作成または選択します。

    プロジェクトの選択または作成に必要なロール

    • プロジェクトを選択する: プロジェクトを選択する際に、特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、resourcemanager.projects.create 権限を含むプロジェクト作成者のロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
    • Google Cloud プロジェクトを作成します。

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、 Google Cloud プロジェクトの名前に置き換えます。

  12. このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。

  13. Resource Manager API と Service Usage API が有効になっていない場合は、有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を確認する。

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

必要なロール

このクイックスタートを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

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

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

次の手順に沿って、main.tf という Terraform 構成ファイルを作成します。

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

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

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

    nano main.tf
  4. 作成した main.tf ファイルに次の Terraform プロバイダ( Google Cloud) リソースを追加します。

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

Cloud Scheduler で Terraform を使用する別の例については、スケジュールに沿って Cloud Run サービスを実行するをご覧ください。

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-east1

    出力例を以下に示します。

    description: test job
    lastAttemptTime: '2024-04-04T13:56:00.669530Z'
    name: projects/PROJECT_ID/locations/us-east1/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-east1

初期構成によっては、プロジェクトで作成された最初のジョブの実行に数分かかることがあります。

結果を確認する

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 ファイルなど)は、セッション間で保持されます。

    Google Cloud プロジェクトを削除する:

    gcloud projects delete PROJECT_ID
  2. または、Terraform で作成したすべてのリソースを削除することもできます。

    terraform destroy コマンドは、Terraform の状態で指定されたすべてのリソースを終了します。現在の Terraform プロジェクトで管理されていないリソースは破棄されません。Terraform 構成ファイルは破棄されません。詳細については、インフラストラクチャを破棄するをご覧ください。

    terraform destroy

次のステップ