概要
Google Home Miniが1ヶ月ほど眠っていたので、そろそろ活用しようと思っていた矢先に、同居人との家計簿管理に使えないかということに思い至り、AWSで作ってみた話です。こんな感じの機能を作りました。
- GoogleAssistantに「家計簿 食費 1000円」というとDynamoDBに保存される
- 毎月1日に先月分の家計簿を集計してチャットツールに通知する
- 同居人は非エンジニアなので無難にLINEに通知するつもり
構成
AWSでこんな感じになりました。
作る
構成をポチポチ作りたくなかったので、使い慣れたServerless Frameworkを使って管理することにしました。
こんな感じでセットアップできます。
$ npm i -g serverless
$ mkdir your-dir
$ cd your-dir
$ serverless create --template aws-nodejs --name household-account-book
$ npm i
デプロイ
とりあえずデプロイしてAPIのHOSTを確定させましょう。前提としては、aws configures
でAWSのCredentialsを設定しておいてください。
$ sls deploy
終わったら、URLが表示されるのでそれをメモっておく。
IFTTT
僕のアカウントがたまたま、GoogleHomeMiniと連携していたGoogleアカウントでIFTTTにログインしていたので、Appletの設定のみで終わりました。
this
GoogleAssistantを選択。
- 「Say a phrase with both a number and a text ingredient」を選択。
- 「What do you want to say?」系には
「家計簿 $ # 円」
みたいな感じのことを助詞つけたりとかで変化させつつ入力。 - 「What do you want the Assistant to say in response?」はGoogleAssistantに返事として何を言わせるかなので、こちらが伝えた内容の確認の意味も込めて、
「家計簿を $ # 円でつけました」
と設定。 - LanguageはJapaneseを選択。
that
Webhookを選択。
- URLは上記のものを入れる。変更があった場合は再度ここの設定を修正しましょう。
- MethodはPOSTにします(別になんでもいいですけど、まあPOSTが無難でしょう)。
- Content typeはapplication/json
- Bodyは下記のように設定しました。
{"category": "{{TextField}}", "price": {{NumberField}}}
コードを書く
下記にあるので参考にしてもらえればと思います。(久々にJS書いたのもあって書き方ブレブレですすみません)
https://github.com/SeiyaMogami/household-account-books
軽く説明しておくと、
-
serverless.yml
にインフラ周りの設定が書かれています- API用のLambdaとCloudWatchからcronにもとづいて起動されるLambdaの設定
- 都度記録用のテーブルと集計用のテーブルの設定
- 都度記録用はTTL(設定した時刻になったら自動でレコードを消してくれる)を設定してます
- 権限まわりの設定
-
handler.js
にはAPIの処理が書かれています- IFTTTから上記で設定したBodyが送られてくるので、それをテーブルにputしているだけ
- 失敗した場合は、LINEに通知する
- 家計簿のカテゴリを意図したものに絞りたかったので、バリデーションをかけてます
- なぜか「光熱費」だけ「光熱 費」のようにスペースを含んでPOSTされてきてたので、スペースも消す処理いれてます
-
aggregate.js
には集計用の処理が書かれています- 都度記録用のテーブルからカテゴリと日付で絞って取得してサマっているだけです
- 念のため集計用テーブルに集計したデータを保存
少し話はそれますが、自分のLINE Botに喋らせるようのAPIを持っていてそれが結構便利です。Slackはチームを作るのがめんどうなので、とりあえずLINE Botに簡単な内容を喋らせるにはいい感じなので、もしよかったら作ってみてください。今回もそれを活用しています。
動作
数値の部分はこんな感じでGoogleHomeMiniに伝えてみていますが、問題なく動作していますね。
ただ、喋るときに、少しつまると「わかりません」って言われるので少し大変かもしれません。まとめて入力とかもできないですし。
今後運用していって、辛くなったら、APIだけ活かして、WEBサービスなりアプリなりを作るか、世にあるサービスを素直に使うことにします。
余談
はじめは、使ったことのないGCPを使ってみようと思って、Serverless Frameworkを使ってGCPにデプロイしてみていたのですが、Failed to initialize a region.
と怒られて、できなかったので諦めてしまいました。どなたか解決方法をご存知でしたらコメントいただけますと幸いです。