本記事
私の家族は自分が作成したLineBotを使って家計簿を管理していて、毎月、だれがどのくらい使ったかを算出できる様になっています。
本記事ではGoogle Cloud PlatformのサービスであるCloud Schedulerを使ってCloud FuntionでBatch処理をしようとする記事です。
Google App EngineにホストされてあるLine BotがCloud SQLにデータを格納しているので、それを対象とします。
今回はLineBotの実装などは本質的でないため触れていません。
目次
アーキテクチャ
全体として以下のようなアーキテクチャになっています。
仕様
BankAPIを通じて記録するとき
支出などは以下のように計算しています。
データフロー的には以下のようになっています。
月額の決算
Cloud Scheduler + Cloud Functionsを使った月末に行われる決算の算出方法は以下の通りです。
どんどんデプロイしていく
Cloud SQLとGoogle App Engineはあらかじめデプロイされていることを想定しています。
Cloud Functionsのデプロイ
まず、試しにモックを作りました。
以下のようにして作成したCloud Functionsをデプロイします。
gcloud beta functions deploy HogeFunction --env-vars-file .env.yml --runtime nodejs8 --trigger-http
すると以下のURLでAPIエンドポイントが作成されます。
https://us-central1-hoge-hoge.cloudfunctions.net/HogeFunction
詳細は以下のコマンドで取得できます。
$ gcloud functions describe HogeFunction availableMemoryMb: 256 entryPoint: MonthlyAmount environmentVariables: DB_CONNECTION_NAME: hoge-hoge-0220:asia-northeast1:hoge DB_NAME: hoge DB_PASS: '' DB_USER: hoge LINE_CHANNEL_ACCESS_TOKEN: hoge LINE_GROUP_ID: hoge httpsTrigger: url: https://us-northeast-hoge-hoge.cloudfunctions.net/HogeFunction ...
ここで環境変数を設定している人はプレーンテキストで保存されていることに留意してください。
このリクエストに以下のようにcurlで叩いて見ます。
curl -x POST https://us-central1-hoge-hoge.cloudfunctions.net/HogeFunction => Ok
Line Groupではこのようになっていました。
このような感じで、あとはロジックを詰めたら完成です。
Cloud Funtionsの関数を実装してもう一回送ります。
curl -x POST https://us-central1-hoge-hoge.cloudfunctions.net/HogeFunction => Ok
以下のような結果になります。
これで実装することができました。
Cloud Schedulerのデプロイ
デプロイといっても何のオブジェクトでもないのです。ロゴも青の六角形で囲まれていません。
以下のようにしてCloud Schedulerを設定します。ここではテストのために毎分送信するように設定します。
gcloud beta scheduler jobs create http monthly-report --uri=$(gcloud functions describe HogeFunction --format="value(httpsTrigger.url)") --schedule="*/1 * * * *"
ここではGAE APIとCloud SchedulerAPIが必要になります。
まとめ
そもそもCloud Functionsは必要なときにしか起動する必要がなくGoogle App Engineでも面倒に感じる小さなAPIを簡単にデプロイし、なおhttps
でスケジュールしてくれる最強さです。
課金プランもGoogleAppEngineなら常に起動しているので料金は取られますが、Cloud Functionsだとランタイム時だけです。
私のような毎日、支出をつけるようなAPIはGoogle App Engineで行って、毎月などトリガーベースでCrontabのようにつかうものはCloud functionsの方が効率がいいでしょう。
またCloud Schedulerがあるため、今まで面倒だったCloud Functionsにトリガーを与える部分が簡単になりました。
今後とも本プロダクトに取り込まれて欲しいと思っています。