2020/05/11

サーバーレスを使い倒して月額 4 円 の Web サービスを構築中

昨年末以来、空いた時間に Web アプリを開発中です。

タニタの体組成計 RD-800 を購入して毎日体重とか体脂肪率とかを図り、それを Fitbit に手動で入力しているのが面倒なので、これを自動化することを狙っています。ネットで調べるとちゃちゃっと作っている人とかもいるのですが、せっかくなのでこれを機会に新しいものを学びながら作ることにします。ということで開発言語は go 言語にします。昨年末に仕事で簡単なでもアプリを作ってみたので、これを機会に新しい言語でもう少し凝ったものを作って学習したいと思います。

万が一多くの人が使いたいという希望が出ることを想定し、ある程度は勝手にスケールする仕組みにします。でも1日の間でそんなに稼働する仕組みでもないので、基本的にはサーバーレスのコンポーネントを最大限に活用し、ランニングコストを下げることにします。
構成は以下の通り。
  • Firebase Web Hosting
  • Cloud Firestore
  • Cloud Functions
  • Cloud Run
  • Cloud Scheduler
  • Cloud Tasks
基本は Web アプリで、各ユーザーがそれぞれの HealthPlanet と Fitbit それぞれの API アクセスのための Client ID と Secret を登録したら、日に1回 HealthPlanet からデータを取ってきて、Firestore に格納しつつ、Fitbit に体重と体脂肪を登録する、というだけのもの。

まずは認証情報の登録処理ですが、Web ベースのクライアントということで Firebase を使って、Firebase の Web Hosting に静的ファイル類を配置しています。HealthPlanet や Fitbit からのコールバック URL を処理するところで Cloud Run を Firebase の後ろ側で動かします。Cloud Run では Firestore に後に AccessToken などに変換するための Code を格納し、Firestore の書き込みをトリガーに Cloud Function が Access Token に変換する処理を行います。

あとは Cloud Scheduler で定期的に URL をキックして、HealthPlanet からデータを取得し、Firestore に履歴用に保存しつつ Fitbit に登録するための HTTP Post リクエストを Cloud Tasks に登録します。Cloud Tasks から Fitbit に登録するための Post 処理が呼ばれるので、それを Cloud Run が処理して Fitbit に体重と体脂肪を登録します。

Cloud Tasks を使うのは、Fitbit API をコールする頻度を調整し、万が一大量のデータをアップロードするような場合でも Fitbit API 側の単位時間あたりお呼び出し上限を超えないようにするためです。

認証情報の登録、Access Token への交換処理、HealthPlanet からのデータの取得、Cloud Tasks への登録処理までは完了していて、あとは Fitbit に登録する処理の部分です。でも、Cloud Tasks から呼び出した Post 処理で何故か Message Body がうまく受け取れなくてハマっています。ついつい ApexLegends やってしまうので、開発に割く時間が少ないのもなかなか完成しない原因のひとつなんですが。

さて、現在のところ開発中という段階ではあるものの、週末に何度かテストで動かしていても、1ヶ月4円しか費用が発生していません。サーバーレスだとちょっとした仕組みだとほぼ無料で構築できるのが Cloud のすごいところです。

0 件のコメント:

コメントを投稿