Cloud Schedulerの定期バッチをスマホから実行する


概要

私のPJではCloud Schedulerを使用して、定期バッチを実行している。
流れとしてはCloud Scheduler=>Pub/Sub=>Cloud Functionsと、よくあるパターン。
これをたまに任意のタイミングで外出先から実行したい場合がある。
一番いいのはslackのSlash Commandだが、今回は工数をかけずに簡単かつslackが使えない場合の代替案として用意しておきたい。

ブラウザを使ってGCPのポータルで実行する案からスマホアプリのCloudConsoleを使うに至った経緯を残しておく。
GCP初心者向けのコンテンツなので、意味が分からない方のみお進みください。

slackの名誉のために可用性に言及しておくと、slackのSLAは99.99%と十分なレベルを誇っている。
とはいえ保証といっても、ダウンタイム分を返金(slackはポイントの模様)してくれるだけで、1つに依存することはリスクがあることに変わりはない。
https://slack.com/intl/ja-jp/terms/service-level-agreement

スラッシュコマンドの作成手順はこちら。
https://api.slack.com/interactivity/slash-commands

Prerequisites

  • GCPを簡単に触ったことがある初心者
  • slackによるChatOpsのみで運用している方

経緯

ブラウザを使ってGCPのポータルからSchedulerを実行する

Cloud Schedulerを設定したなら誰しもが触っただろう、「今すぐ実行する」ボタンを使うことを考える。
結論から言うと、これはなしと判断した。
バッチ処理が複数のモードを持っており、手動で動かす場合、Schedulerから送るペイロードのJSONを変更する必要があるという事情がある。
しかしSchedulerはペイロードを変更するには変更後にアップデートが必要。手順としては、

  1. ペイロードの修正&更新
  2. 実行
  3. ペイロードを元に戻す&更新

こうなるわけだが、3を忘れると結構面倒なことになる。
外出先から手間のかかる操作は事故が起こる未来しか見えない。
事故の未来が見えるならこいつは不適切という判断。

ブラウザを使ってGCPのポータルからPub/Subを実行する

当時トピックにメッセージを設定するメニューが見つけられなくて、これを実行したことはない。
今回あたらめてみてみるとメッセージを設定できそうなので、推定の手順を載せておく。
(GCPはスマホからだとレイアウトがはみ出して、見れない部分が出てきて本能的に回避してしまう

  1. ポータルのDrawerを開いてPub/Subのトピックを選択
  2. 該当のトピックIDを選択
  3. Pub/Subのタイトルメニューからメッセージをパブリッシュを選択
  4. メッセージ本文にJSONを記入して公開ボタンを押下
  5. メッセージを元に戻す必要がある?ない?

一つ疑問に思ったのが、SchedulerのペイロードとPub/Subのメッセージの両方にJSONを設定したどうなるんだろう?
SchedulerはPub/SubにJSONを渡しているだけだろうから上書き?
それならPub/Subのメッセージは手動専用に設定しておけば、公開ボタン押下のみで済むが…
機会があれば検証してこちらを採用するかも?

Cloud Shellから実行する

何かいいやり方はないかと模索して、ようやくスマホアプリにあるCloud Shellに目を付ける。
gcloudコマンドが実行できる頼もしいやつ。(要求あってからプロビジョニングするから起動が遅めなのがちょっと不満だけど)

まずはSchedulerのコマンドを実行しようとしたが、どうもGUIで操作するのと同様、いったんアップデートを挟む必要がありそう。
これではブラウザで実行するのと同様なので不採用。

本来であれば自動実行時と同じようにSchedulerからスタートしたかったが、手間がかかるためこれは断念。
実際のところ、SchedulerにセットするペイロードはPub/Subにそのまま渡すようなので、Pub/Subからスタートすることに方針変更。

pubsubコマンドのドキュメントはこちら。
https://cloud.google.com/sdk/gcloud/reference/pubsub/topics/publish

基本的にはドキュメントに沿って、messageの内容がJSONというだけ。トピックIDはplaygroundとしている。
Functionsの方では常にペイロードのJSONを解釈しており、manualがfalseなら時間によってモードが決まり、manualがtrueならburstModeの指定に従うようにしている。
これを実行すると、任意のタイミングで指定のモードを実行することができる。

cloudshell

$ gcloud pubsub topics publish playground --message '{"manual":true,"burstMode":true}'

ちなみにエラーの場合が気になるかもしれないが、Functionsが実行されるとslackに通知を出すようにしているので、あとはslackで状況を見ればよくなる。

Conclusion

Cloud Schedulerの定期バッチをslackから実行できない状況の代替案として、スマホから実行できるようになった話でした。
slackからの実行とCloud Shellからという2通りの実行方法があれば十分でしょう。(ブラウザからでも行けるから3通りか
ただし、Cloud Shellへの文字入力はしづらいので、コマンドを保存しておくか、前回実行済みなら↑キーを使って履歴から呼び出したほうがやりやすいです。