348 Views
September 17, 16
スライド概要
2016/09/16
#ssmjp 2016.09
SORACOM Funnelで手抜きIoTプラットフォーム
秋葉原生まれ大手町育ちの歌って踊れる江戸っ子インフラエンジニア。 0と1が紡ぐ「ゆるやかなつながり」に魅せられ早20年、 SNSとCGMの力で世界を幸福にするのがライフワーク。 市民、幸福は義務です。 あなたは幸福ですか?
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とかでも辞さない人