« AWS EC2 "悪い" EIPにご用心 | メイン | Seleniumを使ってIoT案件のSalesforce画面を画像に落とす »

2016年2月27日 (土)

ソラコムBeamでUDP通信機器の暗号化を実装

要約

  • ソラコムBeamを使用すると、UDP通信をHTTPリクエストに変換してくれる。
  • 端末側の対応不要で通信セキュリティを確保できる。
  • コストについてはケースに応じて比較検討を要する。

エンジニアの佐藤です。今回はソラコムBeamのお話をさせていただきたいと思います。

「モノのインターネット(IoT)」なる案件を手掛けたときに筆者が発見したのは、「デバイスよ、お前はなんて貧弱なんだ。」という事実です。「なんとかドラゴン」だの「スカイレーク」だの言われているスマホやパソコンと異なり、ほんのわずかなリソースしかない。
こんな時に光ってくるのがUDPプロトコルです。コネクションなしで、IPパケットにポート番号を追加しただけの非常に単純な仕様。即時性重視のデバイスにはとても向いています。
一方でUDPの弱点は、暗号化非対応、64KB以上のデータを一度に送信できない、不達エラーを検出できない、などがあります。筆者もこの「暗号化非対応」に困っていました。

そんな時に聞いたのが「ソラコムBeam」(以下、Beam)の話です。簡単に言うと「閉域網でUDP(他もある)を受けて、HTTPSでリクエストしてくれる」サービスで、デバイスに負担をかけずにUDPをセキュアに使えるのです。

設定

詳しくはソラコムのホームページに書かれていますが、大まかに以下の手順です。

  1. HTTPSサーバーを用意する。
  2. ソラコムのSIMを購入して有効化する。
  3. グループを作ってSIMを登録する。
  4. このグループに対してBeam機能を有効化する。 (ア) 払い出されるUDPエンドポイント(ホスト名・ポート番号)をデバイスに設定する。 (イ) 用意したHTTPSサーバーのホスト名・ポート番号・リクエストパスを登録する。カスタムヘッダも登録できる。

278car394_11


どんなリクエストが来るのか?

今、デバイスがUDPで送信するのは、あるバイナリデータです。テキストではありません。どうやってHTTPリクエストになっているのでしょうか? 観察してみると、POSTリクエストのbodyに以下のJSON文字列(ASCIIエンコード)が入っていました。

{payload:"YWJjZGVmZ2hpam…"}

キーは「payload」、値はUDPバイナリをbase64エンコードした文字列です。 従ってUDPで送信されたバイナリを復元する手順は以下になります。

  1. JSONデコード
  2. 「payload」キー値の評価
  3. 値をbase64デコード

Node.jsでの受信処理は以下のようになりました。

// SORACOM Beam受信処理
var https = require('https');

httpsOpts = {};
httpsOpts['key']  = fs.readFileSync(PRIVATE_KEY_FILE);
httpsOpts['cert'] = fs.readFileSync(CERTIFICATE_FILE);
httpsOpts['ca']   = fs.readFileSync(CERTIFICATE_CHAIN_FILE);

https.createServer(httpsOpts, function(req, res) {
    var rawData = null;

    req.on('data', function(d) {
        var base64 = JSON.parse(d.toString())['payload'];
        rawData = new Buffer(base64, 'base64');
    }); // end of on('data')
    req.on('end', function() { 

        // ここにrawData評価処理を記述

        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end();
    }); // end of on('end')
).listen(LISTEN_PORT); // end of createServer

UDPの受信処理と比べてみると、だいぶ複雑にはなりましたが、流れは同じです。

// 元々のUDP受信処理
var dgram = require('dgram');

var udpServer = dgram.createSocket('udp4');
udpServer.bind(LISTEN_PORT);
udpServer.on('message', function(buf, rinfo) {
    // ここにbufの評価処理を記述
}); // end of on('message')

UDP直使用と比べて、どうか

筆者が少し試した範囲では、Beamは性能については特に問題はないと思いました。即時性も良好です。HTTPになれば通常のWebトラフィックと同様にスケールアウトできますから、何かと楽です。

費用はどうでしょうか。Beamの利用料金は本稿執筆時点で1リクエストあたり0.0009円で、UDPパケット1個の転送で2リクエストカウントされます。
3秒ごとにデータを送信すると24時間では
24 * 3600 / 3 = 28,800回の送信になり、
1日あたりの料金は
28800 * 2 * 0.0009 = 51.84円(税別)になります。
元々の通信料金と比べてみましょう。
UDPパケットの長さを、仮にプロトコルヘッダ込みで100バイトとすると、
24時間では
100 * 28800 = 2.88メガバイトで、約3メガバイトです。
本稿執筆時点の通信料金は最も安い料金クラスの場合、1メガバイトあたり0.2円ですから、3メガバイトでは0.6円となります。これに1日あたりの基本料金10円が加算されますので、1日あたりの通信料金は10.6円(税別)です。
つまり、UDP直使用と比較してBeamの通信コストは
(51.84 + 10.6) / 10.6 ≒ 5.9倍になります。
また、HTTPSを受けるCPUコストもありますので、筆者の感覚では、同一サーバーでさばけるデバイス数は、少なくとも数分の一になるでしょう。

「セキュリティ」のコストはそれなりにかかります。 ソリューション設計にあたっては、諸事情勘案の上で比較する必要があると思います。


コメント

コメントを投稿

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上での
Webアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

株式会社フレクトは、
認定コンサルタント
認定上級デベロッパー
認定デベロッパー
が在籍している、セールスフォースパートナーです。
また、heroku partnersにも登録されています。
herokuパートナー
株式会社フレクトのSalesforce/Force.com
導入支援サービス
弊社の認定プロフェッショナルが支援致します。
・Visualforce/Apexによるアプリ開発
・Salesforceと連携するWebアプリ開発
も承っております。
セールスフォースご検討の際は、
お気軽にお問合せください。

2017年12月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
ブログ powered by TypePad