SORACOM Funnelで手抜きIoTプラットフォーム
#ssmjp 2016/09
Aki@nekoruri
で、誰?
•あき
•ねこるり
etc.
最近はIoTっぽいBLEデバイス作ってます
みんなだいすきSORACOM
• SORACOM Air• IoT/M2M時代の(ほぼ)完全従量課金型MVNO
• 契約事務手数料 954円
• 1日10円+昼上り0.2~0.3円/MB+昼下り0.6円~1円/MB+夜上下0.2円/MB
• 世界120カ国で利用可能
• ドコモのL2 MVNOの上にAWSベースのソフトウェア交換機を独自実装
• APIで制御して事業者がSIMを再販できる
そんなことはどうでもいい
•安けりゃいいなら格安SIMの上にVPNでもしとけ
開発者にとってのSORACOMの嬉しさ
•セキュリティのオフロード
•機能のオフロード
セキュリティのオフロード
•そもそも携帯端末は安全に識別されている• SIMは最も身近なICカード(国際規格 ISO/IEC 7816)
• 耐タンパ性(物理攻撃耐性)のあるセキュアなマイコン
• 電話回線の識別・認証に必要なセキュアな暗号処理を担当
SORACOMで実現する強固なセキュリティ http://www.slideshare.net/SORACOM/connectedt4soracom
セキュリティのオフロード
•認証に必要な情報を端末自身に持たせたくない• 端末は盗まれたりするので個別に識別が必要
• 端末ごとの秘密鍵を適切に個別配布しないといけない
• 例)スマートメーター全国で7000万台
•通信回線のSIMはどこかで必ず挿す• SIMで全てを識別できれば良いのでは
• 端末自身には何の情報を持たせずに済む
セキュリティのオフロード
• SORACOM Beam• 秘密鍵をSORACOM側で管理、外部と暗号化通信
• 接続先もSORACOM側で管理、端末は一つのエンドポイントに送信
• HTTP/MQTT/TCP/UDP⇒ HTTPS/MQTTS/TCPS
• SORACOM Endorse• SORACOMがIdPとして、安全なトークンを発行
• JWT(JSON Web Token)なので使いやすい
• SORACOM経由では鍵の発行処理だけ、データは別の経路でも構わない
• SORACOM Gate• 個別VPG(VPCみたいなの)を用意して、L2-VPNで端末に接続
機能のオフロード
•開発コストの大幅な削減• 接続先やクレデンシャルの管理・配布コスト
• シンプルなデータ投入
• クラウド側へのデータ投入時の再送など(スロットリング対策)
• SORACOM Funnel• UDP/TCP/HTTPでSORACOMのエンドポイントに投げる
• クラウドサービスへのデータ転送をSORACOM側がやってくれる
• クレデンシャルや接続先情報もSORACOM側が持つ
SORACOM Funnel
•端的に言って神サービス
• curlとかあればそれでKinesisに投げ込める• Cでlibcurlで書いても20行いかない
• JSON作るの含めても40行くらい
• 端末上でAWSライブラリとか直接触らなくて良いしAzureも試せる
•一応まだPublic BetaだけどPublicなので誰でももう使える!
なげる
$ curl -X POST http://funnel.soracom.io ¥
-H Content-Type:application/json ¥
-d '{"foo":"bar"}'
Kinesis Streams経由でとどく
{
"operatorId": "OP9999999999",
"timestamp": 1473322750825,
(省略)
"payloads": {
"foo": "bar"
},
"imsi": "440000000000000"
}
AWS 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);
※ なんかやる
}));
};
あとはご自由に
•夢がひろがりんぐ• とりあえずS3になげる
• DynamoDBに投げる
• BigQueryに投げる
• バッチサイズ100件とかでも200msとかで十分捌けるレベル
• 困ったらKinesis Streamsのシャード数を増やせば良い
• いわゆる「IoTプラットフォーム」のデータ層がこれですぐ作れる
•データ量多くてもSORACOMが再送制御などやってくれるっぽい
遅延だけでちゃんと届いてる=きちんと再送!
懺悔
•もしかして:自分
•検証作業で、N倍界王拳したセンサーデータを大量に送信※ 秒間数十件程度• 徐々に取り出すデータが遅れていくのでおかしいとは思っていた
• Kinesisと合わせ技で、どこの問題か切り分けできていなかった
• 最大で20時間以上の遅延
受信側Kinesis Stramsの転送件数青:SORACOMからの受信橙:こちら側の取り出し件数
あっ……(察し)
受信側Kinesis Stramsの転送件数青:SORACOMからの受信橙:こちら側の取り出し件数
念力デバッグ
• PutRecordをPutRecordsで複数件登録にしたっぽい
得られた知見
•投げるの楽なのでついうっかり投げ過ぎちゃう:;(∩´﹏`∩);:
• Public Betaのサービスをいじめてはいけない
•中身の修正が必要なはずなのにすぐ対応されてすごい• 検知: 09/14 12:54 JST
• 改善連絡: 09/14 15:37 JST
• 解決: 09/14 17:21 JST
まとめ
• SORACOMすごい• 開発者を楽に(かつセキュアに)する様々な仕組み
• SORACOM Funnelやばいすごい楽
• 修正早い
•株式会社WHEREではエンジニアを募集中です!• SORACOMを一緒にいじめたい人
• AWSとかAzureとかでサーバレスアーキテクチャしたい人
• EC2建てたら負けだと思っている人
• 必要なら生のCとかでも辞さない人