SORACOM Funnelはいいぞ

この記事は、SORACOM Advent Calendar 2016の18日分(だったはずのもの)です。大変遅れてクリスマス投稿になりました。すみません。。。


さて、全国2億3800万人のSORACOMファンのみなさん、SORACOM Funnelはもちろん使っていますよね?


SORACOM Funnelは、ソラコムのサービスの中では「アプリケーション連携サービス」の「クラウドリソースアダプタ」と位置付けられています。IoTと言われる技術分野の半分は、実世界のオブジェクトのデータをクラウドに送ることですが、それを実現するときに悩ましい部分をまるっとやってくれるのが、このSORACOM Funnelです。

Funnel?

SORACOM Funnelをまだご存じない方も、公式サイトの以下の図を見れば一目瞭然でしょう。


(出典: SORACOM Funnel)

要するに、軽めのプロトコルでFunnelエンドポイントに投げると、良い感じにパブリッククラウドのストリーム処理に投げ込んでくれるというもので、そしてそのために必要なつらい処理を全部やってくれるというものです。
重要なのはこの後半部分です。「とりあえずクラウドに投げるだけ」なら猿でもできるわけですが、じゃあクラウド側に投げるときの端末識別や認証どうするの、とかクラウド側が落ちてるときの再送処理どうするの、とか真面目に運用を考えたときに色々実装や運用が面倒くさい部分がたくさんあるわけです。そこを、SORACOM FunnelはMVNOの出口近くに、そういった面倒なことを全てやってくれるエンドポイントを出してくれているわけです。

実行例

こんな感じで投げます。

$ curl -X POST http://funnel.soracom.io -H Content-Type:application/json -d '{"foo":"bar"}'

すると、例えばKinesis Stremsであれば、以下のように届きます。

{
  "operatorId": "OP9999999999",
  "timestamp": 1473322750825,
  (省略)
  "payloads": { "foo": "bar" },
  "imsi": "440000000000000"
}

IMSI(International Mobile Subscriber Identity)がSIM毎に付けられたIDですので、これを見て通信元を判断できます。
たとえばnodeであれば kinesis-stream-lambda というライブラリがあるので、そこに流し込んであげればよいです。

const es = require('event-stream');
const KSL = require('kinesis-stream-lambda');

exports.handle = function(event, context, callback) {
  const stream = KSL.reader(event, { isAgg: false });
  stream.on('end', function() { callback(null, {}); });
  stream.on('error', function(err) { context.fail(err); });
  stream.pipe(KSL.parseJSON({ expandArray: false }))
    .pipe(es.map(function(data, cb) {
      console.log('processing event: %j', data);
      ※ なんかやる
    }));
};

こんな感じで書いてあげるだけで、機器の識別はできていますし、lambdaが追いつかない場合の再送なども全部SORACOMとクラウドにお任せしてしまうことができ、実装したい処理内容に注力することができます。

SORACOMとセキュリティ

IoTと言えばセキュリティが課題、と言われています。組み込み機器自体の脆弱性もさることながら、それらのデータを適切にクラウドに上げることもまた重要です。今年の7月には総務省経済産業省・IoT推進コンソーシアムの方でIoTセキュリティガイドライン ver1.0が策定されました。この中でも「指針4 ネットワーク上での対策を考える」としてネットワーク接続まわりでのセキュリティ対策がまとめられています。
ましてや、そのデータから得られた分析結果によって組み込み機器にフィードバックを行い、実世界側に対して働きかけを行うCPS(サイバーフィジカルシステム)の時代が来ています。誤ったセンサーデータを送りつけるだけで、下手をすれば人間が傷付けられる可能性もあるわけです。それには、ネットワークの先にある機器をただしく識別・認証する必要があります。

単に機器をインターネットに接続する場合、「自分が誰か」ということを自分自身で相手に証明する必要があります。ここで複数の機器を個別に識別できていないと、たとえば盗難された機器を悪用されたときの被害が大きくなるわけです。そのため、一台ずつ個別の認証情報を配布、管理する必要があります。

SORACOMはMVNO事業者ですし、3G/4Gの通信路は暗号学的に適切な手法を用いて、全てのSIMを識別・認証し、その上の通信も暗号化されています。であれば、この識別の枠組みをそのまま使って、機器とクラウドの間の認証にも利用できれば嬉しいわけです。これを実現するのが、SORACOM Beamsであり、今回取り上げているSORACOM Funnelです。

機器には設置時に個別にどうせSIMを挿すわけで、機器自体には個別の情報を持たせる必要が無くなり「1を0にする」ことが実現します。製造段階での個別作業がゼロになるということは、機器ベンダにとって大きなメリットです。

SORACOMとサーバレス

IoTはその性質から、たくさんの機器からの情報をクラウド側で集約することが求められます。これを全て自前でやろうとすると、自前でMQTTサーバ等を建てたりしないといけないですし、そのMQTTサーバのサイジングや冗長化なども課題となります。というわけで、クラウド時代なのでクラウド事業者が提供してくれているメッセージキューを使うのが良いとされます。具体的には、AWSであれば Kinesis StreamsもしくはKinesis Firehose、AzureであればAzure Event Hubsです。どちらもビッグデータ向けのストリーム処理と銘打っているため、秒間数万件以上のレコードを(お金さえ払えば)処理できるようになっています。

これだけの規模になると、旧来のアプリのように「いったんデータベースに入れてから集計する」というバッチ処理だけでは間に合わない部分が出てきます。そのため、いわゆる「Lambda Architecture」のように、リアルタイムでストリーム処理のまま集計処理を行う必要があります。

KinesisもEvent Hubsも、どちらもそのための枠組みを持っています。一つはAWS LambdaやAzure FunctionsといったFaaSへの繋ぎ込み、もう一つがKinesis Analytics、Stream Analyticsといったストリーム処理エンジンです。前者は散々議論されているので割愛しますが、後者のストリーム処理は来年たくさんの事例が出てくると思われます。

ストリーム処理は、一般的にSQLっぽい感じのクエリを設定しておくとリアルタイムでそれを適用し、直近N秒(ウインドウ)やN秒ごとに集計を継続して出力できるといったものです。最近では「Amazon KinesisとAWS WAFを利用して、サーバレスでリアルタイムな侵入防止システムを作ってみた」などの記事も出ています。膨大に上がってくるデータに対して、まず一次集計を行ってからRDBMSに投入すると言ったことが容易にできます。場合によっては、ストリーム処理だけで最終データまで落とし込める場合も多々あるため、積極的に使っていきたいところです。なお、数年前にNorikraが登場したことをきっかけに、日本国内でもちらほら身近な事例が出てくるようになっています。このあたりをキーワードに検索すると情報が探しやすいです。

というわけで、SORACOM Funnelを使うと、エンドポイントにTCP/UDPやHTTPでJSONぶん投げるだけでこのようなストリーム処理に対してデータを投入できるので楽しいです。

SORACOMと開発者

SORACOMの真価は「開発や運用のコストをオフロードできる」点に尽きると考えています。よく言われるような通信費が安いという事だけであれば、ここまでSORACOMが注目を浴びることはなかったでしょう。このような「世界観」をうまく提示したことが、SORACOMが現状で他の追従を許していない理由です。

セキュリティにしろ、ストリーム処理にしろ、自前で全てを実装することももちろん可能です。ところが、それを運用まできっちり回そうとすると、最初に述べたように地獄の産みの苦しみがあります。ぱっと見簡単そうに見えても実際には難しく手間が掛かるという事が往々にして存在するわけです。でも、IoTデバイスを作っている人にとってはそこで勝負をしたいわけではないわけです。サーバレス界隈の方でも「餅は餅屋」と言い続けていますが、自分のビジネスにとって本丸では無い部分に手間やお金を掛けるのは無駄なことであり、でも誰もやってくれないからみんな自分でやっていたわけです。

そこに颯爽と現れたのがSORACOMです。

以前のLT「SORACOM Funnelで手抜きIoTプラットフォーム #ssmjp」でも主張したとおり、通信費の安さだとか、中身がクラウドネイティブでスケールするなんてことはぶっちゃけどうでもいいんです。

重要なことは、自分が今一番作る手間を掛けたいことに注力し、それ以外を楽に済ませるか、ということなんです。

そこに対して、SORACOMの世界観はよく考えられています。特にSORACOMの世界観の中でも、SORACOM BeamsとSORACOM Funnelは画期的です。だって、MVNOのすぐ向こう側というほとんどダウンタイムを考えないで良い場所に、全てを安心して任せられる基盤があるのです。使わなければ損というものでしょう。

結論

というわけで、「SORACOM Funnelはいいぞ」。