Cloud Schedulerへの期待とマネージドジョブ実行基盤の今後

Author
かめなし
Lv:7 Exp:3586

2017年12月より現職。SREエンジニア目指してIaC、Kubernetesを勉強中。好きな言語はJavascript。好きなGCPプロダクトはCloud Build。好きなOCGカードは《破壊剣士融合》。

葉桜が陽気を連れてくる初夏、いかがお過ごしでしょうか。クラウドエースSREチームの亀梨です。アルルとウィンは自引き出来ました。(RISING RAMPAGE BOX)

元オンプレの運用屋としては、「すっごいcron」を名乗っているCloud Schedulerが気になります。

昨年11月に出た、「フルマネージドなcron」です。まだBetaですが。

そのお題目はというと。

Cloud Scheduler は、エンタープライズ クラスのフルマネージド cron ジョブ スケジューラです。バッチ処理、ビッグデータ ジョブ、クラウド インフラストラクチャ オペレーションなど、実質的にほぼすべてのジョブをスケジューリングできます。
Cloud Scheduler | Google Cloud

「実質的にほぼすべてのジョブをスケジューリングできます。」🤔ほぼ。ほぼとは。

  • 実行はどこで、誰がどうやってするのか?
  • 結果の判定と再試行は、どうなっているのか?
  • ジョブの実行状況と結果をどうモニターするのか?

既にApp Engine SEをお使いの方々には今更かと思いますが、App Engine cronをまだ使っていない人の視点で考察してみました。

Cloud Schedulerのご紹介です。

順に見ていきましょう。

従来のジョブ管理の課題

コンピューター(というかUNIX)の黎明期から、cronには以下のような問題がありました。(VM・IaaSは装置・ラック・DCなりに読み替えてください)

cron「ジョブ実行するで (するだけ)」
systemd「cronをちゃんと1分に1回動作させるために起動させとくで(するだけ)」
VM「カーネルの指示にそれなりに忠実に動くで」
IaaS「人間さんがちゃんと面倒見てくれな困りますわ」

つまり、

  • 「ジョブ自体は機械が実行してくれるが、ジョブの前提になる全てのお世話を人間がしなければならない」
  • 「ジョブを実行しない間、ジョブを実行するために用意したリソースが、まるっきり無駄になる」

ということです。

しかも、

  • 「異常が発生していた場合、気付くために必要な処理を、各ジョブの中全てに作り込まなければならない」
  • 「スケジュールを司るマシンに異常が起きると、ジョブが実行されない」

のです。

具体的に例えば、「一日に一回、PD(Persistent Disks)のsnapshotをひとつ取るだけのAPIをcallするcronジョブ」というものがあったとします。(※scheduled snapshotが実装されたので、今後はこれをする必要はなくなりましたが ^^;)

凡そ、これを動かすために、「cronが動くためだけのVM」をひとつ追加で立て、それを運用するという雑用が発生すると思います。

使うツールがcronでなく、Jenkinsでも、Apache Airflowでも、JP1でも、Systemwalkerでも結局は同じことです。

  • 集中管理サーバを操作するAPI、独自のお作法を覚えて
  • 管理サーバを対象サイトごとに構築して
  • 管理サーバが壊れたら直して
  • 管理サーバのお作法にツールの方を合わせて
  • 管理サーバの提供する操作ツールを使ってバッチを実行する

ことに代わりはありません。

ただ「cronが動いてくれるだけのマネージドサービス」、ずっと欲しかったと思います。私は欲しかったです。

Cloud Schedulerは、何をしてくれるのか?

と、ここまで語っておいて、実は、Cloud SchedulerはUNIX cron相当をそのまんま動かしてくれるサービスではありません

旧来のUNIX cronというミクロ視点から離れて、マクロ視点で他サービスのAPIを呼び出す機能を、フルマネージドで提供します。

これは、cron互換の実行周期指定ができ、フルマネージドで、

  1. Pub/Sub
  2. App Engine HTTP
  3. 汎用HTTP/S

の3種類のターゲットに対して、リクエストを発行させるサービスなのです。

なので、これらのAPIを持たないジョブは、実行できません。

(Cloud Functions、App Engine等でwrapperを書けばできますが)

「APIのトリガーを引く部分だけ」をマネージドにしてくれるサービスだ、といえるでしょう。

分離できる部分は極力分離してmicroservice化する、GCPらしいサービスです。

どのくらいマネージドなのか?

ログはちゃんと出るのか?

もう、shellscriptとloggerコマンドを駆使して賽の河原の石積みをする必要はありません。(ホントか?)

というか、「ジョブのトリガー」と「ジョブの実行」を分離することで管理をシンプルにしています。

schedulerのログは、stackdriver loggingに出力されます。

schedulerの呼び出すジョブのログは、そのジョブをホストするサービスのログとして出力されるわけです。

サービス間の疎結合の恩恵ですね。

失敗判定と再試行について

gcloud beta scheduler jobs createコマンド--max-backoff オプション、 --max-retry-attempts オプション等を指定することで、App Engine cron.yamlと同様に再試行(リトライ)の挙動を制御できます。
失敗判定については、App Engine cron側の資料によると、HTTPについては

  • 2XX番台以外のステータスコードが返る
  • timeout

いずれかの状況の場合、リトライ動作となるようです。(※Cloud Schedulerについては明言しているドキュメントが見付かりませんでした)

Cloud Console(Web)からの設定については、現時点ではできないように見えます。

異常の検知については、呼び出される側の、例えばGKE、App Engine等のログをstackdriver loggingのログベース指標であらかじめ定義しておき、Stackdriver MonitoringのAlerting機能でslack通知、Email通知といった手段で実装できるでしょう。

実行状況のモニター

Cloud Consoleから、直近のジョブの成否の確認、ならびにstackdriver loggingの「そのジョブに関連するエントリーを抽出した画面」へ遷移することができます。

おいくら?

プロジェクトに関係なく、課金アカウントごとに、合計で月に3ジョブまで無料。

それ以降は $0.10 USD/ジョブ ずつ加算されます。(2019/04時点)

Cloud Schedulerの制約

動作させるプロジェクトにApp Engineアプリの存在が必要

App Engine cronの仕組みを流用しているのか、「App Engineアプリがプロジェクト内に含まれている」ことを要求します。

動作するコードが無い、空の「アプリ設定」だけでよいのですが、以下をよく読んでください。

Cloud Scheduler を使用するには、サポートされているリージョンのいずれかに配置されている App Engine アプリがプロジェクトに含まれている必要があります。プロジェクトに App Engine アプリが含まれていない場合は、App Engine アプリを作成する必要があります。
概要

App Engine固有の制約として、 「一度App Engineアプリケーションを作成すると、そのプロジェクトでアプリを配置するリージョンは変更できなくなる」 点があるため、プロジェクト自体の運用設計時に考慮する必要があります。

処理は羃等(べきとう)性の担保が必要

「at-least-one」(少なくとも1回の実行)を保証するため、一度の処理で複数回発動する可能性があります。
日次バッチなら24時間ごとに実行済フラグをクリア、等すればよさそうですが、短いスパンでの実行は要検討です。

おわりに

これまでのインフラ運用、つまりサーバー以上のレイヤーの運用に於ては、「個々のサーバー(インスタンス)」に状態を持たせ、その状態を保持するように「サーバー単位で管理する」という考え方でした。

今後、コンテナ運用、コンテナオーケストレーション(Kubernetes等)運用、そしてハイブリッドクラウドと進化していくアプリケーション基盤としてのインフラ運用の最適化。

これらの取り組みを進めるにつれ、これまでのミクロな視点を極力排し、サービス同士をAPIで疎に結合し、マクロな粒度で運用していく、という思想が見えてきます。

Cloud Schedulerは、単純なUNIX cronの置換にはなりませんが、Cloud Schedulerを前提としたバッチ実行・運用を考えることで、木よりも森を見る設計のヒントになるのではないでしょうか。

クラウドエースでは、コンテナオーケストレーションやインフラの抽象化、IaC、immutable infrastructure、CI/CDを前提としたSIを一緒に進めていく仲間を募集しております。

↓ ↓ ↓ ↓ ↓ ↓ ご応募はこちらからどうぞ! ↓ ↓ ↓ ↓ ↓ ↓

👉 https://www.cloud-ace.jp/recruit/ 👈

↑ ↑ ↑ ↑ ↑ ↑

次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます