僕のYak Shavingは終わらない

車輪の再発明をやめたらそこには壮大なYakの群れが

コロナ禍でも問題なし!フルリモートIoT案件(副業)をbalenaを使って完遂しました。

f:id:kazuph1986:20200920103836p:plain
開発環境

<2020/09/21 9:24 追記>

ありがとうコロナ渦警察

<追記終わり>

はてブロではお久しぶりです。

この度「フルリモートIoT案件」をbalenaを使って完遂したので、その内容を共有したいと思います。 先に書いておきますが、「技術書典9でbalena本書いたから買ってほしい」という願望により書かれた記事ですw (セルフPR)

案件内容

詳しくは書けませんが、友達のベンチャーのIoTデバイス(抽象的表現)用のゲートウェイスマホアプリとそれをつなぐクラウド部分を担当しました。 その会社には組み込みより下のレイヤーのメンバーしかいない状態だったので、今回は組み込みより上を担当した感じです。

本来であれば、IoT案件となると、開発中の試作品の目の前でうんうんうなりながら開発すると思うのですが、 今回はコロナ禍ということもあり、完全にフルリモートで開発することにしました。

balenaを使った結果、実際に完全にフルリモートで開発することが可能で、 相手はArduinoを利用していたのですが、Arduinoとの通信部分のデバッグも 問題なく可能でした。

今回の副業は、作り込みで言うと完全にPoCレベルですが、本業の方では本番導入が進んでいます。

balenaってなに?

f:id:kazuph1986:20200920101258p:plain
balenaの概略

www.balena.io

一言でいうと「IoT用途のエッジデバイス管理プラットフォーム」です。

以下の事が可能です。

  • Dockerコンテナを使ったアプリケーション開発
  • コンテナのビルドからエッジデバイスへ配布の実行(手元マシンにDockerのインストール不要)
  • エッジデバイスごとにユニークな公開URLを付与
  • 登録したエッジデバイスに対していつでも遠隔ターミナル接続
  • コンテナが参照する環境変数をWebコンソールから設定
  • リリースリビジョンの管理(リリースロックや巻き戻しが容易)
  • 死活監視、ログ監視、リソース監視

その他、死活監視、ログ監視、起動制御、OSアップデートなどエッジデバイス運用でほしい事をすべて遠隔で実施可能です。

無料で10台のエッジデバイスが利用できるので、家庭向けに検討されている方は無料枠だけで一生分遊べるのではないでしょうか?

balenaを使ってできること

基本的になんでもできます。コンテナを利用するからできなくなってしまうこともほぼないと思います(今のところ遭遇してないだけかも?)。

自分が試したことを列挙します(ここに書いてないことができないというわけではないです)。

  • GPIO(High/Low, PWM)を使ったLEDやサーボモーターの制御
  • ArduinoとのSerial通信(USB)
  • カメラモジュールによる撮影(静止画、動画ストリーミング)
  • Bluetooth Low EnergyによるBLEデバイス操作(Switchbotの温湿度計の制御)
  • 公開URLを使ってハードウェア制御用のWeb APIを構築
  • Google Home Notifierの構築(しゃべらせるやつ)
  • Prometheus+Grafanaを使ったリソース等のメトリクスの可視化
  • cronによる何かしらのスクリプトの定期実行

基本的にコンテナに権限を何でも付与できるので、root権限が必要なものも実行可能ですし、 ネットワークについてもホストOSと同等のものも付与できます(セキュリティの話は別にありますが)。

実際に子どもが生まれて、妻と子どもだけ地方に里帰りしていた期間があるのですが、 balenaを入れたラズパイにカメラをつなげて、 自分は東京でそのカメラアプリを開発するということが可能でした。

これによって生まれたばかりの赤ちゃんがベッドで寝ている画像をいつでも見れる環境を構築することができました。 (撮影タイミングを変更したり、撮影した画像をGoogle Driveにバックアップしたりなどは後からどんどん追加開発していました)。

これは完全にbalenaのおかげです。

なぜbalenaを使うのか

f:id:kazuph1986:20200920105726p:plain
バイスの管理画面

balenaを使うと、遠隔にあるエッジデバイスを使った開発が容易に可能になるというのもありますが、 開発した後の運用がめちゃくちゃ楽になるという効果もあります。

この理由の1つ目は、Dockerを利用するのが強制されるおかげで、環境構築がコード化されたり、 デバイス内のアプリケーションを分割しようとする力学が働くからだと思います。

balenaでは、Dockerfileを使うのに加えて、docker-composeも利用が可能です。 これによって、コンテナの分割が容易になったり、 コンテナごとに付与する権限を制御しやすくなったり、 いつでも不要なコンテナを削除したりが簡潔にできるようになります。

github上にはたくさんのbalenaのサンプルが上がっているのですが、 これらも原則に従い、一つのコンテナにすべてを詰め込むようなことはせず、 いくつかのコンテナに分割し、それらが協調するように構成になっているのが伺えます。

それに伴って、コードもシンプルになり、メンテナンス性が向上します。

また2つ目の理由としては、やはり遠隔にあるエッジデバイスの状態がいつでもわかり、アクセスが可能なことです。 これによって、何かの影響でバグが発生したとしても、いつでも確認し修正することが可能です。

開発のしやすさ

balenaが用意しているコマンドラインツールによって、ローカルネットワーク内にあるbalena対応のデバイスを検知して、 クラウドを介さずに開発することも可能です。これによってMac等の開発マシンでソースコードをいじって、 そのコードの変更を検知して自動でコンテナをリビルドし、目的のエッジデバイス上でコンテナの再起動が可能です。

また、VSCodeのRemote Containerも使うことができるので、インクリメンタルにブレイクポイントを使った開発も可能です。

vscodeが64bit向けにしかRemote Containerのagentを提供していないことに注意)

書籍の紹介

ということで、最後に書籍の紹介ですw

現在開催中の技術書典9にて、『実践balena』という書籍を執筆し販売しています。 balenaのアカウントの作成から、実際のアプリの開発例をソースコードを交えて解説しています。

執筆のモチベーションは、balenaの日本語の記事や資料がまだまだ全然ないがために、日本人がbalenaを試せてないということを感じたからです。 IoTに従事して5年以上経ってしまいましたが、エッジデバイスの管理は独自に作り込むのがとても大変で、実際に運用面でとても苦労してきました。

そのためbalenaに出会ってからの感動といったらありませんでした。「これ、ほしかった!」という機能は大体実装されているので、 開発期間もかなり短縮できますし、運用に入ってからのソフトウェア更新もとても簡単になりました。

正直この辺を自前でやるのはつらすぎるので、おそらく自分は今後balenaを利用しないことはないと思います(ネットワークやセキュリティの要件がガチガチの大手向けIoT案件だとまた別かもですが)。

ということで、気になった方はぜひご購入ください。

techbookfest.org

また姉妹本で、技術書典7にて販売していた、ラズパイとDockerの本も半額の500円で販売しているので、 合わせてご利用くださいm( )m

techbookfest.org

(安いせいかこっちの方が3倍くらい売れてるんですよね…人類のためになるのはbalena本の方だと確信していますが…)