いしぐめも

プログラミングとかしたことを書きます。

ASUS TinkerBoard で PDS を動かす!

この記事は以前 note に記載したものです。hatenaに統合するにあたり、記事をコピペしました。

【原題】Raspberry PiPDS を動かす

正しくは、「Raspberry Pi(のようなARMボード)でPDSを動かす!」です。実際はTinkerBoard(Raspberry Pi2相当?)を使用しているので、タイトル詐欺なところはありますが、Raspberry Pi系でも同様のことができます。

f:id:yoh1496:20210318184407j:plain
ASUS TinkerBoard

PDS (Personal Data Store) とは?

PDSとはどういうものかというと、Personal Data Storeという名前の通り、個人データの入れ物 です。ここではPDSを使用することで、どういう風にアプリが変わるか、というレイヤーのお話をしたいと思います。

よくあるWebアプリの利用形態は、下の図のようにアプリケーションの提供者(右)がWebアプリの資材と個人データの管理を行い、ユーザー(左)がそれらを取得し利用する、という形になっていると思います。個人データはマネージドなクラウドのDBに格納されてる!っていう場合であっても管理の主体はアプリの提供者、だと思います。

f:id:yoh1496:20210318182334p:plain
よくあるWebアプリの形態

PDSが導入された世界観では、アプリのデータの保存先を「PDS」と呼ばれる入れ物に向け、個人データをそこに蓄積していきます。

f:id:yoh1496:20210318182420p:plain
PDSを利用したアプリの形態

こうすることで、アプリの提供者はあくまで「アプリ資材」のみを提供するだけでよく、近年扱いが難しくなってきている個人データの取り扱いから開放される 他、ユーザーにとっても個人データがアプリ提供者の管理から外れるため自由に活用できる 、というメリットが発生します。

アプリ間のデータ共有を実現する PDS

  • アプリ提供者が個人データの取り扱いから解放される
  • 個人データが自由に活用できる

先程あげた、こういった世界観はなかなか理解できないと思いますが、実はネイティブアプリで今までやっていたことをネットワーク越しにやっているのに近いのではないか?と最近自分で思い始めています。今回は実験的にそういう説明をしてみます。

f:id:yoh1496:20210318182640p:plain
ネイティブアプリと PDSを使用したアプリ

左図は、ネイティブアプリで実現されてきたローカルなストレージに対して読み書きをしている模式図です。1つのフォルダに複数の矢印が向いているのは、例えば、お絵かきアプリを使って保存した画像データをSNSアプリでシェアするといったように、複数アプリで共有されていることを表します。PDSを導入することでそれがネットワーク上に移しつつも、実現できるようになるのです(右図)。つまり、端末にログインすればいつもの環境(データ・アプリ)がある、という環境のクラウド化みたいなのが実現できるのではないでしょうか(個人の感想です)。

国産PDS の 「Personium」

こういったPDSの概念を実現するには、単にネットワークストレージをアプリ間で共有すれば達成されるかというとそうではなく、アプリからPDSへのアクセス方式 だったり、どのようにアクセスコントロールするか など、予め方式を定めておかないとバラバラな仕様になってしまい、アプリごとにPDSが乱立するような状況に陥りかねません。Personium はそういった決まり事を定めた、PDS実装のうちの1つです。(PDSの世界はまだ標準化されていない認識です)

PDSを ARMボード で動かす!

というわけで、本題に戻ります。今回は 「Personium というPDSサーバーを自宅の ARMボード で動かそう! 」というのが趣旨です。図で示すとこんな感じ。

f:id:yoh1496:20210318182908p:plain
「おうちPDS」のイメージ

  • PDSを家のドメイン(myhome.example.jp)に立てる
  • 私はアプリの資材を app.somecompany.example.co.jp から受け取る
  • 私(taro)の個人データは PDS (taro.pds.myhome.example.jp)で読み書きする

なぜ自宅でPDSを動かすのか?

せっかくPDSでデータが自分の管理下に置かれるんだから、サーバーも自宅にあった方が自分で管理してる感が出るのでいいのでは?というのが理由です。何より物理的に 手元にあるので安心感(本当か?)があります。そして、やろうと思えば誰でもPDSを立てられるのだということを証明したかったというのもあります。

f:id:yoh1496:20210318184428j:plain
手のひらサイズのARMボード

なぜARMボード?

特にARMだからどう、というわけではありません。強いてあげれば、TinkerBoardやRaspberry Piが安価で手に入りやすい低消費電力なシングルボードコンピュータだからです。

なぜPersonium?

それは、Personiumがオープンソースソフトウェアであり、誰もがPDS事業者になれる ということを掲げているのが大きいです。PDS事業者になれるということは自分専用のPDSが作れるのはもちろん、他の人が使用するPDSを提供したり、他のPDSとの連携を実現できるサーバーを建てられるということです。

手順

ここからは実際にPDSを立てるまでの手順を記載します。

手順1:ドメインの取得

Personiumでは、自らのデータを管理する「データ主体」をそれぞれに割り振られたURLで識別する方式を取っています。なので、PersoniumにとってURLとはユーザー名に相当するものになります。

今回は MyDNS というDDNSサービスを利用して、ドメインを取得しました(〇〇○○.mydns.jp というようなドメインになります)。Personiumでは有効なSSL証明書が必要なんですが、MyDNSでは Let's Encrypt を使用した証明書発行に対応しており、とても便利です。

note.com

手順2:固定IPの取得

サーバーの公開にあたり、ドメインに紐づくグローバルIPを取得する必要があります。簡単にグローバルIPが手に入る状況ならよいですが、手元にプライベートIPしか降ってこない環境だとそれが難しく、また自宅のIPを直接公開などしたくない人も多いかと思います。

手に入らない場合の抜け道として、VPS+VPN自宅サーバーを公開するという手があります。今回は ConoHa のVPSで借りたUbuntuサーバーとのVPN接続で、VPSグローバルIPに向けられた通信を自宅に引き込む、ということをやっています。

qiita.com

  • DDNSのAレコードをVPSグローバルIPに設定する
  • VPS上に立てたnginxで自宅内のサーバーにリバースプロキシする

という感じです。

手順3:Personiumを起動する

Personiumコミュニティでは即座にdockerコンテナ群としてPersoniumを立ち上げられる、docker-compose.ymlを提供しています。

github.com

ただし、上記ファイルを元に外部から連携可能なPersoniumを立ち上げるにはちょっとひと手間かかります。手順については下記のWikiに書いたので参照ください。

How to launch per cell unit · personium/personium-docker Wiki · GitHub

VPSでnginxを動かす場合は、上記手順で構築するnginxをVPS上で動かすようにしてください。)

手順4:ARMで動かす場合に必要な手順

PersoniumではDBサーバーとしてElasticSearchと、メッセージキューとしてActiveMQを使用しています。それぞれDocker Hubからコンテナイメージを取得するようにdocker-compose.ymlが書かれていますが、それぞれarmhf用のものは提供されていないので実行することはできません。

つまり、armhf用のイメージをそれぞれビルドする必要があります。

note.com

上記のような手順も試してみましたが、@kikuzokikuzoさんも述べている通り、あまりパフォーマンス的な優位性は見いだせなかったので実機でビルドしました。そもそもElasticSearchもActiveMQも再ビルドを伴わないのでそこまでスペックは必要ありませんでした。ただ、ビルド中はアチアチになるのでコインで冷やしました笑

f:id:yoh1496:20210318183847j:plain
熱を逃がす!

実行:UnitManagerを動かしてみる

PersoniumのUnit(サーバー)を管理するためのアプリが公式から提供されています。それを使って自分のPersoniumにログインしてみましょう。

Personium Unit Manager

f:id:yoh1496:20210318183939p:plain
ユニットマネージャのログイン画面

  • LoginURL: https://unitadmin.<自分のPersoniumFQDN>/
  • Username: unitadmin
  • Password: unitadminのパスワード(init.shを実行後に出力される)

ログインが完了すると下記のようにUnit管理画面が表示されます。

f:id:yoh1496:20210318184026p:plain
ユニット管理画面

が、、、動きがだいぶ緩慢。実際にcurlコマンドでのログインAPIにかかった時間を計測してみると下記の結果が。

f:id:yoh1496:20210318184050p:plain

ただのログインに 45秒、だと・・・?!

終わりに:PDS を ARMボード上で使ってみた感想

2GBというメモリ容量の制約、ARMv7というCPUアーキテクチャという特殊なケースでも難なく動かせてびっくりしました。特にarmhfなCPUでも再ビルドなしに動かせるJavaはやはりクロスプラットフォームとして良く出来てるなと思いました。迅速に必要な環境を揃えられるdockerも便利ですね。

しかし、armhf用のJREの出来がよくないのか、ストレージが遅いのが問題なのか、通常使用には問題が発生するほど遅い印象を受けました(ログインのAPIを1回叩くのに45秒かかった件)。もしかしたら外付けドライブで実行するだとか、チューニングすることで性能改善はするのかもしれませんが、労力に見合わなそうなので二の足を踏んでいます。

むしろ、Raspberry PiやTinkerBoardであれば、GPIOなどを活用して、PDSに日々の生活を記録するデバイスとして利用するほうが向いていると思います。Home PDS は別の x86 マシンに譲るとして、そういった方向でTinkerBoardを活用していこうかなと思います。

Personiumはコミュニティメンバを募集しています

今回紹介したPDS「Personium」ですが、オープンソース開発を行うコミュニティを運営しています。もしPDSに興味を持ったり、コミュニティ運営をしてみたいという方がいらっしゃったらお声がけください。PDSを使ってみたい、というのでも結構です。

personium.io