はじめに
こんにちは!都内でWeb Developerしているnariと申します。
私が住んでいるシェアハウス(ギークハウス新宿)の同居人たちで、去年の7月に開発合宿にいったのですが、その際にプロトタイプを作ったシェアハウスの鍵システムが先日完成したということで、自分の担当した部分に関して振り返りをしておこうとこの記事を書いています。
まず何を作ったかをお見せした後、今回採用したおうちハックでの運用に優れた3つの技術スタック(Raspberry piとGoとMackerel(監視系SaaS))に関して紹介したいと思います。(作った物の実装は大したことないので詳しく説明しません)
何を作ったか
一言で言うと、シェアハウスの鍵システムなのですが、以下の同居人の @wamisnet さんのツイートの動画で実際の挙動を見てもらうとわかりやすいと思いますので一度そちらご覧になってください!
@fukubaka0825 さんと @retoruto_carry さんと作った鍵システムがついに動いたああああ! pic.twitter.com/uQZ44INF93
— わみ@NefryとかFlutter本とか (@wamisnet) January 1, 2020
こちらは、@wamisnet と @retoruto_carry さんと3人で作ったものです。
私はこの鍵システムのうち、スイカなどのICカードのタッチをNFCリーダーから検知し、鍵を開けるAPIを叩くチェックインサーバー部分を作りました。
具体的にいうと、NFCリーダーへのSuiceなどのタッチからidm(FeliCaカード製造時にICチップに記録され書き換えができない固有のID番号)を取得して、別のラズパイで立っているDBサーバーとのやりとりで認証チェックして、鍵を開けるAPIを叩いたりスピーカーを鳴らす部分を作成しました。
2020/01/03追記:コメントでご指摘がありましたが、認証においてidmは偽装が可能なので、ブルートフォース攻撃対策をいれたりカメラで不審者のチェックなども行っています。ここら辺の認証周りは生体認証を取り入れたり強化していく予定です。
システム関係図
@wamisnet 担当箇所(Open Key部分)記事: Suicaで開けられるスマートロックを作ってみた
@retoruto_carry 担当箇所(Admin部分)記事: 【おうちハック】開発合宿で3人でシェアハウスの鍵管理システムを作った【チーム開発】
実装は非常に簡単なので、ここからは**今回採用したオススメおうちハック技術スタックの紹介(Raspberry piとGoとMackerel(監視系SaaS))**をしようと思います。
運用しやすさを求めた3つの技術スタック紹介
Raspberry pi
言わずと知れたお手軽ハック界の雄です。
今回は常駐サーバーをこのラズパイを使って構築しました。(選定理由として、クラウド世代で物理サーバーを運用したことがなかったので簡易な形でもいいから物理サーバー運用してみたかったと言うのがあります。)
また、最新OS書込済のSDカード(ラズパイ動作保証付き、16GB)や、3Aの電源、ケース、HDMIケーブル、さらには高性能な産業用ヒートシンクまでついたスターターキットがあったりするので、そちらを買えば組み立ててマウスとディスプレイとつなぐだけで割としっかりしたコンピューターが1万円もしないで手に入ってしまいます。
このRaspberry pi 3のスターターキットが素晴らしかったですが、今であればRaspberry pi 4の物を買うといいと思います。(僕も欲しい。メモリ4GBとかもはや僕の研修時代のPCとスペック変わらなさそう。。)
頑張ればネットサーフィンしてYoutubeみれたりもしますし、ディスクトップのTerminalからの操作でラズパイ上で開発することも可能です。(私は自分のパソコンで開発して、接続したいときはsshして操作してました)
要件にストレージに諸々アセットを貯めたいとか、負荷のかかる処理を回したいとかがなく、簡単な常駐プロセスのサーバーを建てたいとかであればラズパイがオススメです。もしサーバー自体がお釈迦になっても安価に買い替えれたりスペアを常備したりできるので、運用コスト面で非常に優秀です。
Go
by Renée French CC BY 3.0
Go言語はGoogleが2009年にリリースした比較的新しい静的型付け言語で、ラズパイでのおうちハックともとても相性がいいです。
特質すべきは実行環境をラズパイ上に用意する必要がなく、以下のように開発環境でクロスコンパイルしたバイナリだけで実行できるお手軽さです。nodeやpythonのように実行環境のEOLに振り回される必要がないです。
GOOS=linux GOARCH=arm GOARM=6 go build main.go -o pi_linux_arm
systemdか何かのdaemon管理ツールで、サーバー再起動時にバイナリ実行もキックするようにしておくととてもメンテナブルです。
sudo systemctl start pi.service
また、なんといっても型付き言語で愚直に書く系の言語なので、後々メンテナンスするときも当時のコードを書いた自分の意図が汲み取り安いです。(将来の自分は他人)
Goに入門されたい方は、まずはA Tour of Goからどうぞ!
Mackerel(監視系SaaS)
今回のシステムは、アプリを開いてSesamiと直接bluetoothで接続して鍵を開くという代替の手段があるにせよ、故障したまま放置され、ICカードをタッチして入れなかったりすると住人のストレスが溜まっていくかと思います。
こういったわりかし生活にクリティカルなシステムの運用には、個人のシステムとはいえどお手軽で安価な監視システムが欲しくなってきます。
とはいえそのために監視サーバー立ててZabbixやNagiosなりで頑張るのは辛い、、ということで監視のSaaSを使うことに。今までDatadogは少しプライベートでいじったり、業務ではがっつりAWS CloudWatchを使っているので候補から除外して、今回は使いやすいと評判のMackerelを試してみることにしました。
具体的には、ラズパイのサーバーにMackerel agentを仕込んで、ラズパイ自体とnfcリーダーの接触感知ワーカープロセスを死活監視しました。後ついでに @wamisnet さんが建てたOpen key APIの外形監視を仕込みました。
細かい導入方法は以下を参考にしてください
ここでは、Mackerelをいじってみた感想を3つの項目に分けて紹介しようと思います。
無料枠の機能が充実
フリープランでホスト5台までなど個人開発なら十分なほど対応してくれています。
トライアルで使えた外形監視が使えなくなるので、ついでで入れたAPIの外形監視が使えないのはちと悲しい。。(使いたいならお金を払おうという話ですね)
管理画面が見やすい
- ホストごとに自分で設定したプロセス監視とデフォルトのメトリクス監視が一望でき、UIが非常にわかりやすい
ここら辺は普段いじっているAWS CloudWatchだとなかなか難しい部分で羨ましいなぁと思いました。
通知の設定が容易
- AWS CloudWatchのようにlambdaで処理を書かなくても、ノーコードでSlack通知を設定できるのはやはり最高
- しかもメトリクスグラフの画像までメッセージに詰めてくれたり、非常に観やすくて良い(アラートの再送の設定も容易)
最近外形監視までAWSさんでできるように(限られたリージョンのプレビューですが)なったり、ChatBotによってノーコードの通知が実現できそうだったり(β版ですが)と、監視の専業SaaSさんは大丈夫かしら、、と思っていましたが、やはり使いごこちと多機能性は専業SaaSに軍配が上がるなと感じました。**顧客の本当に注力したいアプリ/インフラへの改善アクションにリソースを最大限さける仕組みになっていて素晴らしい。**今後も使っていきたいです。
今後どうしたいか
鍵システム
ちゃっかりWebカメラも @wamisnet がつけてくれていたりするので、そちらを使って顔認証で鍵を開けれたりしたら面白いなぁなんて妄想をしています。(もうやれる時代にきているので、AutoML系サービスなどを使ってプロトタイプを作って精度チェックをしたいですね)
その他おうちハック
うちのシェアハウスでは、住人の物々交換のためのレジシステムがあったり、Alexaとおしゃべりしてテレビを操作できたり、お風呂センサーを見て今お風呂が空いているかわかったり、NatureRemoのアプリでリモコン操作できたりします。(つまりおうちハックパラダイスなんです。)
以下に開発者の紹介記事を載せておきますので是非お読みになってください!
Node-REDでシェアハウスのお風呂を爆速でハッキングする方法 - Qiita
Reactとタブレットでバーコード使ったシェアハウス物々交換システム作った話【個人開発】 - Qiita
次にやりたいこととしては、kibanaで可視化したレジシステムの情報だったり、リモコン操作だったりを集約して行える住人の管理画面を作ろうという話を @wamisnet としています。ちょっとお仕事だったり個人開発だったりで後手後手になってしまうかもしれませんが、また開発合宿なんかでがっとプロトタイピングしちゃいたいですね。
次の開発合宿はどこに行こうか。鎌倉とか奥多摩とかかな(あんまり遠出はしたくない)