🌩️

Cloud SchedulerとCloud Tasksを活用したサーバーレスアーキテクチャ

2020/12/25に公開

本日は12月25日ですが、21日目が空いていたので埋めたいと思います。

はじめに

GCP は仕事でもプライベートでも大変お世話になっています 🙏
今回はプライベートで Cloud Scheduler と Cloud Tasks を使ってみて大変有用でしたので、僭越ながら紹介させていただきます。

サービスの紹介

※ 2020年12月時点での情報です。

Cloud Scheduler

https://cloud.google.com/scheduler?hl=ja

料金: https://cloud.google.com/scheduler/pricing

cron のようにジョブの定時実行を行うことのできるサービスです。
任意のHTTPエンドポイントにリクエストを投げることや、Cloud Pub/Sub の Topic にメッセージを publish することもできます。

具体的には、定期的にスクレイピングしたり API を呼び出す際の、トリガーとして利用できます。

API を呼び出す際は直接 API のエンドポイントにリクエストを投げるというよりは、Cloud Run や Cloud Functions の HTTP エンドポイントを呼び出し、そのアプリケーションの中で実際に API にリクエストを投げてレスポンスを処理し、Cloud Datastore や GCS 等に保存するといった形になると思います。

Cloud Tasks

https://cloud.google.com/tasks?hl=ja

料金: https://cloud.google.com/tasks/docs/pricing

続いて、Cloud Tasks は一言で表すとタスクキューです。
Cloud Pub/Sub を使ったことがある方は、何が違うの?と思うかもしれませんが、Cloud Pub/Sub はリアルタイムメッセージングです。
具体的な機能の違いとしては、Cloud Tasks では送信側で詳細な配信日時、レートの制御が可能で、Cloud Pub/Sub では受信側からメッセージを Pull することが可能です。

公式ドキュメントでは、次のページで Cloud Pub/Sub との違いが説明されています。
https://cloud.google.com/tasks/docs/comp-pub-sub?hl=ja

Cloud Scheduler と Cloud Tasks の活用

ここまでの紹介の中に登場した GCP のマネージドサービスを組み合わせて、家電操作のオートメーションが実現できます。

アーキテクチャ

Google Calendar に登録したスケジュールを基に、自動で照明のON/OFFを行います。

  1. Cloud Scheduler をトリガーとして10分おきに Cloud Run (一番左)が起動され、Google Calendar のスケジュールを取得します。
  2. 取得したスケジュールから、Cloud Tasks に配信日時を指定してタスクを予約します。
  3. 配信日時になると Cloud Tasks によって Cloud Run (中央下)が起動され、Cloud Pub/Sub (Topic) にメッセージを publish します。
  4. 自宅の Raspberry Pi が Cloud Pub/Sub (Subscription) からメッセージを pull し赤外線リモコンの API を呼び出します
  5. 照明が点灯 (or 消灯)します。

Cloud Scheduler は API 呼び出しの定時実行に、Cloud Tasks はタスクの予約実行に、Cloud Pub/Sub はリアルタイムにクラウドから自宅へイベントを伝送するために使用しています。

赤外線リモコンの実装については、こちらで紹介しています。
https://qiita.com/ww24/items/32d2a78c20e6dcc2e68c

実装について

3つのコンポーネントで構成されます。

  • calendar-notifier
    • 定時実行され Google Calendar からスケジュールを取得し Cloud Tasks への登録を担う
  • pubsub-gateway
    • Cloud Tasks から呼び出され、Cloud Pub/Sub Topic へのメッセージの publish を担う
  • pubsub-gateway (receiver mode)
    • Cloud Pub/Sub Subscriber からメッセージを pull し、赤外線リモコンの API リクエストを担う

実のところ、calendar-notifier には常駐モードと HTTP エンドポイントを呼び出す機能が備わっているので、これを自宅で動かすだけでも Google Calendar を用いた自動化は可能です。当初はこの方法で稼働させていました。

説明を省略しましたが、アーキテクチャ図の中央にある Cloud Endpoints 経由で、インターネットから Cloud Run で稼働している pubsub-gateway を呼び出せるようにしています。インターネットから家電操作するために中央から右側は必要なコンポーネントになります。

あとは calendar-notifier を Cloud Run でステートレスに稼働させるか、自宅で常駐させるかの違いなのですが、コストが無料枠に収まること、クラウド上の方がデプロイやメンテナンス性の面で優位なことから、Cloud Run で稼働させることにしました。

使用感

次のように、Google Calendar で専用に用意したカレンダーにスケジュールを登録して使います。設定次第ですが、この場合は朝8時に照明が点灯し、9時に消灯します。

これで、朝8時に照明の眩しさで起きることができます。9時に自動で消灯するので、家を出る際に照明を消し忘れても大丈夫です。

Cloud Scheduler

10分おきに Cloud Run を起動させる設定です。

scheduler

Cloud Tasks

Google Calendar のスケジュールに沿ってタスクが登録されています。
タスクの名前で一意に管理されているので、タスクが重複して登録されることはありません。

tasks

費用

この程度であれば無料枠に収まります。
Cloud Run は必要な時にしか起動していないので、コストが抑えられます。
加えて、デプロイ時のオプションで --max-instances=1, --memory=128Mi と必要最小限のリソースに制限しています。

cost

まとめ

アーキテクチャを考えるのは楽しいですね。
Cloud Scheduler, Cloud Tasks はユースケースに合えばかなり便利なので、今後も積極的に活用していきたいと思います。

ただし、現状どちらも SLA が提供されていないようなので、ミッションクリティカルなシステムでの採用はまだ様子を見た方が良さそうです。

Discussion