Kekeの日記

エンジニア、読書なんでも

Cloud Scheduler+Cloud FunctionでCloud SQLに保存してあるLine家計簿BotのデータにBatch処理をする

f:id:bobchan1915:20181003173459p:plain

本記事

私の家族は自分が作成したLineBotを使って家計簿を管理していて、毎月、だれがどのくらい使ったかを算出できる様になっています。

本記事ではGoogle Cloud PlatformのサービスであるCloud Schedulerを使ってCloud FuntionでBatch処理をしようとする記事です。

Google App EngineにホストされてあるLine BotがCloud SQLにデータを格納しているので、それを対象とします。

今回はLineBotの実装などは本質的でないため触れていません。

目次

アーキテクチャ

全体として以下のようなアーキテクチャになっています。

f:id:bobchan1915:20181003173459p:plain

仕様

BankAPIを通じて記録するとき

支出などは以下のように計算しています。

f:id:bobchan1915:20181003193215j:plain

データフロー的には以下のようになっています。

f:id:bobchan1915:20181003173122p:plain

月額の決算

Cloud Scheduler + Cloud Functionsを使った月末に行われる決算の算出方法は以下の通りです。

f:id:bobchan1915:20181003173403p:plain

どんどんデプロイしていく

Cloud SQLとGoogle App Engineはあらかじめデプロイされていることを想定しています。

Cloud Functionsのデプロイ

まず、試しにモックを作りました。

f:id:bobchan1915:20181003171544p:plain

以下のようにして作成した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ではこのようになっていました。

f:id:bobchan1915:20181003193604j:plain

このような感じで、あとはロジックを詰めたら完成です。

Cloud Funtionsの関数を実装してもう一回送ります。

curl -x POST https://us-central1-hoge-hoge.cloudfunctions.net/HogeFunction

=> Ok

以下のような結果になります。

f:id:bobchan1915:20181003231748j:plain

これで実装することができました。

Cloud Schedulerのデプロイ

f:id:bobchan1915:20181003171822p:plain

デプロイといっても何のオブジェクトでもないのです。ロゴも青の六角形で囲まれていません。

f:id:bobchan1915:20181003180436p:plain

以下のようにして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にトリガーを与える部分が簡単になりました

今後とも本プロダクトに取り込まれて欲しいと思っています。

参考文献

www.youtube.com