Raspberry pi とGoとMackerelでシェアハウスの運用しやすい鍵システムを作る

# はじめに
こんにちは！都内でWeb Developerしている[nari](https://twitter.com/fukubaka0825)と申します。

私が住んでいるシェアハウス([ギークハウス新宿](https://4hacker.github.io/hackerhouse/geekhouse-shinjuku.html))の同居人たちで、去年の7月に開発合宿にいったのですが、その際にプロトタイプを作った**シェアハウスの鍵システムが先日完成**したということで、**自分の担当した部分に関して振り返り**をしておこうとこの記事を書いています。

まず**何を作ったか**をお見せした後、今回採用した**おうちハックでの運用に優れた3つの技術スタック(Raspberry piとGoとMackerel(監視系SaaS))に関して紹介**したいと思います。(作った物の実装は大したことないので詳しく説明しません)

# 何を作ったか
一言で言うと、**シェアハウスの鍵システム**なのですが、以下の同居人の @wamisnet さんのツイートの動画で実際の挙動を見てもらうとわかりやすいと思いますので一度そちらご覧になってください！ 
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/fukubaka0825?ref_src=twsrc%5Etfw">@fukubaka0825</a> さんと <a href="https://twitter.com/retoruto_carry?ref_src=twsrc%5Etfw">@retoruto_carry</a> さんと作った鍵システムがついに動いたああああ！ <a href="https://t.co/uQZ44INF93">pic.twitter.com/uQZ44INF93</a></p>&mdash; わみ@NefryとかFlutter本とか (@wamisnet) <a href="https://twitter.com/wamisnet/status/1212385075385401344?ref_src=twsrc%5Etfw">January 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こちらは、@wamisnet と @retoruto_carry さんと３人で作ったものです。
私はこの鍵システムのうち、**スイカなどのICカードのタッチをNFCリーダーから検知し、鍵を開けるAPIを叩くチェックインサーバー**部分を作りました。
具体的にいうと、NFCリーダーへのSuiceなどのタッチから[idm](https://www.orangetags.co.jp/what_felica_idm.html)(FeliCaカード製造時にＩＣチップに記録され書き換えができない固有のＩＤ番号)を取得して、別のラズパイで立っているDBサーバーとのやりとりで認証チェックして、鍵を開けるAPIを叩いたりスピーカーを鳴らす部分を作成しました。

2020/01/03追記：コメントでご指摘がありましたが、認証においてidmは偽装が可能なので、ブルートフォース攻撃対策をいれたりカメラで不審者のチェックなども行っています。ここら辺の認証周りは生体認証を取り入れたり強化していく予定です。

## システム関係図

![Untitled Diagram (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/032fcd3d-ab03-f4a7-6e91-e3c9bf31ba28.png)

@wamisnet 担当箇所（Open Key部分）記事: [Suicaで開けられるスマートロックを作ってみた ](https://qiita.com/wamisnet/items/b8a3f204dc604124ea34)
@retoruto_carry 担当箇所（Admin部分）記事: [【おうちハック】開発合宿で3人でシェアハウスの鍵管理システムを作った【チーム開発】](https://qiita.com/retoruto_carry/items/d59b9edc94475c5f2396)

実装は非常に簡単なので、ここからは**今回採用したオススメおうちハック技術スタックの紹介(Raspberry piとGoとMackerel(監視系SaaS))**をしようと思います。


# 運用しやすさを求めた３つの技術スタック紹介
## Raspberry pi 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/ff90e158-777b-f5bf-f87b-d7a3b839ac5b.png)

**言わずと知れたお手軽ハック界の雄**です。

今回は常駐サーバーをこのラズパイを使って構築しました。(選定理由として、クラウド世代で物理サーバーを運用したことがなかったので簡易な形でもいいから物理サーバー運用してみたかったと言うのがあります。)

また、最新OS書込済のSDカード（ラズパイ動作保証付き、16GB）や、3Aの電源、ケース、HDMIケーブル、さらには高性能な産業用ヒートシンクまでついたスターターキットがあったりするので、そちらを買えば組み立ててマウスとディスプレイとつなぐだけで**割としっかりしたコンピューターが１万円もしないで手に入ってしまいます**。
[このRaspberry pi 3のスターターキット](https://raspberry-pi.ksyic.com/main/index/pdp.id/463/pdp.open/463)が素晴らしかったですが、今であればRaspberry pi 4の物を買うといいと思います。(僕も欲しい。メモリ４GBとかもはや僕の研修時代のPCとスペック変わらなさそう。。)

頑張ればネットサーフィンしてYoutubeみれたりもしますし、ディスクトップのTerminalからの操作でラズパイ上で開発することも可能です。(私は自分のパソコンで開発して、接続したいときはsshして操作してました)

要件にストレージに諸々アセットを貯めたいとか、負荷のかかる処理を回したいとかがなく、**簡単な常駐プロセスのサーバーを建てたいとかであればラズパイがオススメ**です。もしサーバー自体がお釈迦になっても安価に買い替えれたりスペアを常備したりできるので、**運用コスト面で非常に優秀**です。

## Go
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/3671d3d8-b3b9-a069-d551-1d9546931088.png)

by Renée French CC BY 3.0

Go言語はGoogleが2009年にリリースした比較的新しい静的型付け言語で、**ラズパイでのおうちハックともとても相性がいい**です。

特質すべきは**実行環境をラズパイ上に用意する必要がなく、以下のように開発環境でクロスコンパイルしたバイナリだけで実行できるお手軽さ**です。nodeやpythonのように実行環境のEOLに振り回される必要がないです。

```sh
GOOS=linux GOARCH=arm GOARM=6 go build main.go -o pi_linux_arm
```

systemdか何かのdaemon管理ツールで、サーバー再起動時にバイナリ実行もキックするようにしておくととてもメンテナブルです。

```sh
sudo systemctl start pi.service
```

また、なんといっても型付き言語で愚直に書く系の言語なので、後々メンテナンスするときも当時のコードを書いた自分の意図が汲み取り安いです。(将来の自分は他人)
![carbon (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/e84fd3f5-944c-0614-f2c4-f81d9b83d855.png)

Goに入門されたい方は、まずは[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)からどうぞ！
## Mackerel(監視系SaaS)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/3ecf119d-56f8-70eb-8fe3-12564073f871.png)

今回のシステムは、アプリを開いてSesamiと直接bluetoothで接続して鍵を開くという代替の手段があるにせよ、故障したまま放置され、**ICカードをタッチして入れなかったりすると住人のストレスが溜まっていく**かと思います。

こういった**わりかし生活にクリティカルなシステムの運用には、個人のシステムとはいえどお手軽で安価な監視システムが欲しくなってきます**。
とはいえそのために監視サーバー立ててZabbixやNagiosなりで頑張るのは辛い、、ということで監視のSaaSを使うことに。今までDatadogは少しプライベートでいじったり、業務ではがっつりAWS CloudWatchを使っているので候補から除外して、今回は使いやすいと評判の**Mackerelを試してみる**ことにしました。

具体的には、ラズパイのサーバーにMackerel agentを仕込んで、ラズパイ自体とnfcリーダーの接触感知ワーカープロセスを死活監視しました。後ついでに @wamisnet さんが建てたOpen key APIの外形監視を仕込みました。

細かい導入方法は以下を参考にしてください

- [エージェントをインストールする - Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/howto/install-agent)
- [ラズパイにmackerelを導入 - Qiita](https://qiita.com/winuim/items/f9da2c76da4960c1f615)
- [Mackerelプロセス監視設定をする時の注意点 - Qiita](https://qiita.com/oshou/items/5dcd262077fe51c43788)

ここでは、Mackerelをいじってみた感想を3つの項目に分けて紹介しようと思います。
### 無料枠の機能が充実
フリープランでホスト5台までなど個人開発なら十分なほど対応してくれています。
トライアルで使えた外形監視が使えなくなるので、ついでで入れたAPIの外形監視が使えないのはちと悲しい。。(使いたいならお金を払おうという話ですね)

<img width="1289" alt="スクリーンショット 2020-01-02 18.24.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/7a138614-56a9-a9d0-d6c5-d821b960366d.png">
([料金 - Mackerel（マカレル）: 新世代のサーバー管理・監視サービス](https://mackerel.io/ja/pricing/)より引用)

### 管理画面が見やすい
- ホストごとに自分で設定したプロセス監視とデフォルトのメトリクス監視が一望でき、UIが非常にわかりやすい
<img width="1202" alt="スクリーンショット 2020-01-02 18.21.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/04efe010-fcdf-8700-3a07-95be9b9fe2a8.png">
- アラートの対応履歴が観れる画面があったり、メンテナンスモードでアラートが飛ばなくできたり細かいところに手がとどく仕様が満載
<img width="1211" alt="スクリーンショット 2020-01-02 18.21.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/13f901e8-793a-f6f0-3185-08118d3de3a2.png">

ここら辺は普段いじっているAWS CloudWatchだとなかなか難しい部分で羨ましいなぁと思いました。

### 通知の設定が容易
- AWS CloudWatchのようにlambdaで処理を書かなくても、ノーコードでSlack通知を設定できるのはやはり最高
- しかもメトリクスグラフの画像までメッセージに詰めてくれたり、非常に観やすくて良い(アラートの再送の設定も容易)
 
<img width="504" alt="スクリーンショット 2020-01-02 18.20.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/80e4da76-a98a-3465-990e-08b154307cd0.png">

[最近外形監視までAWSさんでできるように](https://aws.amazon.com/jp/about-aws/whats-new/2019/11/introducing-amazon-cloudwatch-synthetics-preview/)(限られたリージョンのプレビューですが)なったり、ChatBotによってノーコードの通知が実現できそうだったり(β版ですが)と、監視の専業SaaSさんは大丈夫かしら、、と思っていましたが、やはり使いごこちと多機能性は専業SaaSに軍配が上がるなと感じました。**顧客の本当に注力したいアプリ/インフラへの改善アクションにリソースを最大限さける仕組みになっていて素晴らしい。**今後も使っていきたいです。

# 今後どうしたいか
## 鍵システム
ちゃっかりWebカメラも @wamisnet がつけてくれていたりするので、そちらを使っ**て顔認証で鍵を開けれたり**したら面白いなぁなんて妄想をしています。(もうやれる時代にきているので、AutoML系サービスなどを使ってプロトタイプを作って精度チェックをしたいですね)
## その他おうちハック
うちのシェアハウスでは、住人の物々交換のためのレジシステムがあったり、Alexaとおしゃべりしてテレビを操作できたり、お風呂センサーを見て今お風呂が空いているかわかったり、NatureRemoのアプリでリモコン操作できたりします。(つまりおうちハックパラダイスなんです。)

**以下に開発者の紹介記事を載せておきますので是非お読みになってください！**
[Node-REDでシェアハウスのお風呂を爆速でハッキングする方法 - Qiita](https://qiita.com/retoruto_carry/items/00ec51a94d819925fad1)
[Reactとタブレットでバーコード使ったシェアハウス物々交換システム作った話【個人開発】 - Qiita](https://qiita.com/wamisnet/items/1c6f809be7c4847a900d)

次にやりたいこととしては、**kibanaで可視化したレジシステムの情報だったり、リモコン操作だったりを集約して行える住人の管理画面を作ろう**という話を @wamisnet としています。ちょっとお仕事だったり個人開発だったりで後手後手になってしまうかもしれませんが、また開発合宿なんかでがっとプロトタイピングしちゃいたいですね。
次の開発合宿はどこに行こうか。鎌倉とか奥多摩とかかな（あんまり遠出はしたくない)