はじめに

みなさん、システムのジョブスケジューラには何を使っていますか?お馴染みのタスクスケジューラやcron、流行りのAWSではAWS Batch など、単にジョブスケジューラといっても環境によって利用されるサービスは様々です。

今回、GCP上でのジョブスケジュール方法を検討するにあたって候補を探っているなかで、「Cloud Scheduler」なるものを発見!「フルマネージドスケジューラ」をキャッチフレーズとしたGCPが提供しているサービスのひとつで、どうやらサーバーレスなジョブスケジューリングが実現できるとのこと。クラウドでサーバーレスとあれば試してみない訳にはいかない、ということで、本稿では Cloud Scheduler の基礎から、実際にジョブを作成する手順に至るまでを紹介していきます。

なお、クラウドでのサーバーレス構成に関しては別の記事で詳しく紹介しているので、ぜひそちらもご参照ください。

そもそもCloud Schedulerとは?

冒頭でも紹介しましたが、Cloud SchedulerはGCPが提供するジョブスケジューラサービスです。フルマネージドを謳うとおり、バッチ処理、ビッグデータジョブ、クラウドインフラストラクチャ・オペレーションなど、あらゆるジョブをスケジューリングできます。

ジョブスケジューラというと、Windowsでは「タスクスケジューラ」、UNIX系OSでは「cron」などがよく知られています。従来のジョブ管理ではスケジューラ用に新しくサーバーをたてる必要がありましたが、Cloud SchedulerはGCP上でのサービスとして動くため、サーバーレスなジョブスケジューリングが実現できます。

操作性

ジョブの作成や管理には、GCPコンソールかgcloudコマンドラインツールを使用できます。すべてのジョブを一元管理でき、編集/削除や一時停止/再開のアクション、実行状況の確認なども簡単に行えるので、快適なジョブ管理が可能です。

サーバーレス ジョブスケジューラ AWS GCP クラウド Cloud Scheduler

3種類のターゲット

Cloud Schedulerは指定されたスケジュールに従ってジョブをターゲットへ送信しますが、ジョブ作成時に以下3種類のターゲットを指定できます。

  • HTTP/S エンドポイント
  • Pub/Sub トピック
  • App Engine アプリケーション

HTTP/S エンドポイント

エンドポイントの完全修飾URLとHTTPメソッドを指定することで、直接リクエストを送ることができます。HTTPメソッドはPOST・GET・HEAD・PUT・DELETE・PATCH・OPTIONSの7種類から選択でき、メソッドによってはターゲットに送信するデータを指定します。

このままではインターネット上のどこからでもHTTPエンドポイントを叩ける状態になっているため、必要に応じて認証の機能を設定しておく必要があります。HTTPターゲットでの認証には、認証に使用されるサービスアカウントの設定やトークンタイプの選択などを行います。

後ほど、実際にサービスアカウントを使用した認証方法についてご紹介します。

Pub/Sub トピック

Pub/Subは、メッセージの送信/受信処理を切り離した、非同期メッセージングサービスです。送信側であるパブリッシャーは送信先のトピックに対してメッセージを送信します。受信側であるサブスクライバーは、選択したエンドポイントに対してサービス側からメッセージをpushしてもらうか、自らサービス側にメッセージをpullすることで、メッセージを受け取ることができます。

Cloud SchedulerでPub/Subターゲットを用いる場合には、ジョブの公開先であるトピック作成、トピックに送信するメッセージのペイロードへの指定に加え、トピックをサブスクライブするためにCloud Functionsで関数を作成する必要があります。

App Engine アプリケーション

使用しているプロジェクトに関連付けられているApp Engineアプリケーションをターゲットに指定できます。エンドポイントの相対URL、App Engineサービス名、HTTPメソッドの指定のほか、必要に応じてバージョンやインスタンス、送信するデータの指定を行います。

ジョブスケジュールの書き方

実行されるジョブの頻度指定にはunix-cron形式を使用します。(*****)の文字列の中に5つの値を設定することで、特定の曜日や日にちの特定の時間にジョブを実行する、といったようなスケジューリングが可能です。

サーバーレス ジョブスケジューラ AWS GCP クラウド Cloud Scheduler

上記の形式に従い、以下のようなスケジュールが設定できます。

サーバーレス ジョブスケジューラ AWS GCP クラウド Cloud Scheduler

ログ確認

ジョブが正しく実行されず、結果に失敗と表示されていた…。そんな時には、ロギングのログエクスプローラで実行結果を確認できます。各ジョブの実行開始時と終了時にログを記録しており、ジョブの実行回数や時刻、HTTPステータスコードなど実行時の状況を詳細に確認できます。

サーバーレス ジョブスケジューラ AWS GCP クラウド Cloud Scheduler

料金体系

Cloud Scheduler の料金体系は、使用したジョブ数に応じて料金を支払う従量制となっています。毎月、無料枠として3ジョブまで無料で使用することができ、それ以降は1ジョブにつき$0.10 USDずつ加算されます。ただし無料枠はアカウントごとに設けられており、プロジェクト単位ではないのでご注意ください。

サービスアカウントを使用した認証

サービスアカウントを使用した認証では、HTTPリクエストのヘッダーにサービスアカウントの情報を含ませたID トークンを追加し、HTTPエンドポイントにリクエストを送ります。そうすることで、あたかもそのサービスアカウントがHTTPリクエストを送ってきたかのように振る舞うことができます。あとはヘッダーに追加したID トークンをもとに、自分が登録したサービスアカウントと一致するかどうかを検証することで、HTTPリクエストがCloud Schedulerから送られてきたものか確認することができます。

今回の作業環境では、GCPの認証サービスであるIdentity-Aware Proxy(以下、IAP)を使用しているので、サービスアカウントにIAPで保護されたリソースへのアクセスを許可するロールを付与することで、IAP側で自動認証することができます。

サービスアカウントの作成と設定

ここからは実際にサービスアカウントの作成・設定からジョブの作成手順までご紹介していきたいと思います。

使用するサービスアカウントは2つです。1つ目がCloud Schedulerにデフォルトで用意されている、「Cloud Scheduler サービス エージェント」のロールが付与されたサービスアカウント(以下、Cloud Schedulerサービスアカウント)、2つ目がジョブに紐づけるバッチジョブ用サービスアカウント(以下、バッチジョブサービスアカウント)です。

Cloud Schedulerサービスアカウントの設定

まず、はじめにCloud Schedulerサービスアカウントの設定を行います。この設定によって、バッチジョブサービスアカウントに代わって、認証に使用するID トークンを生成することができます。

1.GCPコンソールから「IAMと管理」-「IAM」を開きます。

[□Google提供のロール付与を含みます]にチェックを付け、「Cloud Scheduler サービス エージェント」のロールが付与されたサービスアカウントがあることを確認します。

※アカウントが表示されていない場合は、Cloud Scheduler APIが有効になっていない可能性があるので、有効にしてください。

2.1で確認したアカウントを編集していきます。

[+別のロールを追加]を押下し、「サービスアカウント トークン作成者」を選択します。

3.[保存]を押下し、Cloud Schedulerサービスアカウントにロールが追加されたことを確認します。

サーバーレス ジョブスケジューラ AWS GCP クラウド Cloud Scheduler

バッチジョブサービスアカウントの作成

次にバッチジョブサービスアカウントを作成します。

1.GCPコンソールから「IAMと管理」-「サービスアカウント」を開き、[サービスアカウントを作成]をクリックします。

2.サービスアカウント名を一意になるように設定します。

 サービスアカウントIDはサービスアカウント名を設定する際に自動で設定されます。

3.サービスアカウントの説明を任意で設定することができます。

 サービスアカウント名、サービスアカウントの説明を設定し終えたら、[作成]を押下します。

4.サービスアカウントに付与するロールを設定します。

 バッチジョブサービスアカウントがIAPでの認証を通過するように、「IAPで保護されたウェブアプリユーザー」のロールを選択し、[続行]を押下します。

5.ユーザーにこのサービスアカウントへのアクセスを許可するか設定します。

 ここでは何も設定せずに[完了]を押下します。

6.バッチジョブサービスアカウントが作成されたことを確認します。

サーバーレス ジョブスケジューラ AWS GCP クラウド Cloud Scheduler

バッチジョブサービスアカウントの設定

バッチジョブサービスアカウントをIAPのアクセスリストに追加します。

1.GCPコンソールから「セキュリティ」-「Identity-Aware Proxy」を開きます。

2.HTTPSのリソースから対象のバックエンドサービスを選択します。

3.画面右端に表示された情報パネルの[メンバーを追加]を押下します。

4.新しいメンバーにバッチジョブサービスアカウントのメールアドレスを設定します。

5.「IAP-secured Web App User」ロールを付与し、[保存]を押下します。

6.情報パネルのロール/メンバーにバッチジョブサービスアカウントが追加されたことを確認します。

サーバーレス ジョブスケジューラ AWS GCP クラウド Cloud Scheduler

ジョブの作成手順

実際のジョブを作成してみます。

1.GCPコンソールから「Cloud Scheduler」を開き、[ジョブの作成]を押下します。

2.ジョブの名前をプロジェクト内で一意になるように指定します。

3.ジョブの説明を任意で設定します。

4.ジョブの実行頻度を設定します。

5.タイムゾーンを指定します。

 ここでは日本標準時(JST)を選択します。

6.ターゲットのプルダウンメニューから[HTTP]を選択し、URLを記述する欄に

 ジョブが接続するエンドポイントの完全修飾URLを指定します。

7.HTTPメソッドのプルダウンメニューから[GET]を選択し、SHOW MOREを押下します。

8.Authヘッダーのプルダウンメニューから[OIDCトークンを追加]を選択します。

9.バッチジョブサービスアカウントのメールアドレスを指定します。

10.対象にはOAuthクライアントのクライアントIDを指定します。

11.OAuthクライアントのクライアントIDはGCPコンソールから「セキュリティ」-「Identity-Aware Proxy」画面を開き、使用しているバックエンドサービスの「OAuthクライアントを編集」をクリックすることで確認できます。

 最後に[作成]を押下し、ジョブの作成は完了です。

ここではGCPコンソールよりジョブの作成を行いましたが、gcloudコマンドラインツールを使用することによって、ジョブの再試行回数や再試行までの時間等、詳細まで設定することが可能です。

詳しくは以下の公式ドキュメントを参照してください。

https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/create/http

実際にジョブを実行してみましょう

実際に作成したジョブを実行します。

GCPコンソールから「Cloud Scheduler」を開き、対象のジョブの[今すぐ実行]を押下します。

おわりに

いかがでしたでしょうか。ここまでCloud Schedulerの概要と、実践としてジョブ作成の手順についてご紹介してきました。

Cloud Scheduler を使用するためには App Engine アプリケーションの作成が必須であり、ひと手間かかりますが、ボタン一つでジョブが実行できるGCPコンソールは、ジョブスケジューラを初めて触る方でも、直感的に操作できるので非常に使いやすいと思います。

毎日のメールの定時配信や、定期的な業務データのエクスポートなど、日々の業務の自動化には欠かせないジョブスケジュール。どのジョブスケジューラを利用するかお悩みの方、サーバーレスなジョブスケジューリングに興味をもった方は、ぜひ一度Cloud Schedulerの使用を検討してみてはいかがでしょうか。