スマートホームシステムの開発 AWS を活用した新規サービスの立ち上げ 井宮 大輔 Business Platform Department IoT Business Group Sony Mobile Communications Inc
自己紹介 井宮大輔 ( いみやだいすけ ) 主な開発履歴 Walkman メディアフレームワーク Android Walkman アプリケーション Xperia Phone/ Tablet のビデオアプリケーション メタデータ配信サーバー スマートホームシステム @yokobonbon http://qiita.com/yokobonbon 好きな AWS のサービス AWS ECS AWS IoT pg. 2 7 June 2017
pg. 3 7 June 2017
pg. 4 7 June 2017 新規サービスの共通課題
pg. 5 7 June 2017 新規サービスの共通課題
本日のアジェンダ スマートホームシステムの開発において直面した様々な課題 その課題を AWS のサービスを利用した解決方法 利用上の注意点 pg. 6 7 June 2017
pg. 7 7 June 2017
スマートホームシステム概要 家族 A 機器接続情報センサーデータ ユーザーデータ Smart Home Hub 家族 B 機器接続情報センサーデータ ユーザーデータ Smart Home Hub 家族 C 機器接続情報センサーデータ ユーザーデータ Smart Home Hub pg. 8 7 June 2017
家族 A 家族 B スマートホームシステム概要 X 機器接続情報センサーデータ ユーザーデータ 機器接続情報センサーデータ ユーザーデータ 家庭内のデバイスをスマートホームハブを通して接続 Smart Home Hub Smart Home Hub スマートフォンより家家族庭内デバイスのデータ C 照会 制御が可能 家庭内デバイスのデータ照会 制御は家族機器接続情報センサーデータのみ可能 ユーザーデータ Smart Home Hub pg. 9 7 June 2017
課題 1: アカウント管理 認証 (1/2) 家族 A 機器接続情報センサーデータ ユーザーデータ Smart Home Hub 家族 B アカウント管理 認証 機器接続情報センサーデータ ユーザーデータ Smart Home Hub 家族 C 機器接続情報センサーデータ ユーザーデータ Smart Home Hub pg. 10 7 June 2017
課題 1: アカウント管理 認証 (2/2) スマートフォンからデバイスのデータ照会 制御を安全に行うために以下の機能が必要 家族ユーザーの追加 / 削除 アクセストークンを用いたユーザー認証 パスワード変更 E-mail アドレス変更 オープンソースなどを用いて実現した場合 開発 / 運用コストが課題 pg. 11 7 June 2017
解決 1: アカウント管理 認証 (1/2) Amazon Cognito User Pool を利用する Amazon Cognito User Pool Google, Facebook などの外部認証プロバイダを使用せず独自のユーザー管理が可能 50,000 ユーザーまで無料 何百万人のユーザーまで拡張可能 メールアドレスや電話番号 (SMS) を用いた確認や 多因子認証 (Multi Factor Authentication) が実現可能 pg. 12 7 June 2017
解決 1: アカウント管理 認証 (2/2) Amazon Cognito User Pool では以下の属性を利用可能 Address Birthdate Email Family name Gender Given name Locale Middle name Name Nickname Phone number Picture Preferred username Profile Zoneinfo Updated at website 上記に加えてカスタム属性も利用可能 pg. 13 7 June 2017
ユーザー認証 ユーザー A (3) API 呼び出し トークン (3) (3) Amazon API Gateway (6) リソースアクセス Cognito ID Amazon Aurora リソースは Cognito ID に紐付けて保存されている Amazon Cognito User Pools email Cognito User Pool の属性は email のみ利用 pg. 14 7 June 2017
ユーザー追加 (1) ユーザー B を招待 (E-mail アドレス ) (1) (1) (2) ユーザー B を仮登録 (5) (5) ユーザー A ( 管理者 ) Amazon API Gateway (7) ユーザー B を本登録 Amazon Aurora ユーザー B (4) 確認コードを送信 (E-mail) Amazon Cognito User Pools pg. 15 7 June 2017
Cognito User Pool の制限 サインアップ確認コードの有効期限は 24 時間 24 時間以上伸ばすことはセキュリティの制限で現状できない 確認コードの再送の仕組みは必須 確認コードの有効期限をチェックする API はない 確認コードでアカウント有効化してみないと分からない アクセストークンの有効期限は 1 時間 リフレッシュトークンの有効期限は 1 3650 日 (10 年 ) まで指定可能 ( デフォルト 30 日 ) pg. 16 7 June 2017
課題 2: デバイス認証 家族 A 機器接続情報センサーデータ ユーザーデータ Smart Home Hub 家族 B 機器接続情報センサーデータ ユーザーデータ デバイス認証 Smart Home Hub 家族 C 機器接続情報センサーデータ ユーザーデータ Smart Home Hub pg. 17 7 June 2017
AWS IoT セキュリティ 軽量な通信 ルール処理 デバイスの状態 X.509 クライアント証明書 IoT Policy IoT Topic IoT Rule IoT Shadow pg. 18 7 June 2017
解決 2: デバイス認証 (1/5) 全てのデバイスに対応した IoT Thing( 仮想デバイス ) を作成クライアント証明書を発行し全てのデバイスに埋め込む IoT thing generic IoT thing generic IoT thing generic IoT thing generic X509 クライアント証明書 X509 クライアント証明書 X509 クライアント証明書 X509 クライアント証明書 pg. 19 7 June 2017
解決 2: デバイス認証 (2/5) クライアント証明書は IoT Policy と紐付いている IoT Policy はデバイス毎に設定が異なる IoT thing Policy IoT thing Policy IoT thing Policy IoT thing Policy pg. 20 7 June 2017
解決 2: デバイス認証 (3/5) デバイス毎に用意された IoT Topic IoT Shadow にアクセス可能 pg. 21 7 June 2017
解決 2: デバイス認証 (4/5) IoT Policy にデバイス UUID に紐づけた IoT Topic IoT Shadow にのみアクセス可能に制限を記述 UUID=1000 UUID=1001 UUID=1002 UUID=1003 X X X UUID=1000 UUID=1001 UUID=1002 UUID=1003 pg. 22 7 June 2017
解決 2: デバイス認証 (5/5) UUID=1000 のデバイスの IoT Policy の記述 { "Effect": "Allow", "Action": [ "iot:publish ], "Resource": [ "arn:aws:iot:ap-northeast-1:xxx:topic/devices/1000/fromdevice/*", "arn:aws:iot:ap-northeast-1:xxx:topic/$aws/things/1000/shadow/get" ] }, { "Effect": "Allow", "Action": [ "iot:subscribe ], "Resource": [ "arn:aws:iot:ap-northeast-1:xxxx:topicfilter/devices/1000/todevice/*", "arn:aws:iot:ap-northeast-1:xxxx:topicfilter/$aws/things/1000/shadow/update/delta", pg. 23 7 June 2017
課題 3: デバイスとの双方向通信 家族 A 機器接続情報センサーデータ ユーザーデータ Smart Home Hub 家族 B 機器接続情報センサーデータ ユーザーデータ Smart Home Hub 家族 C 機器接続情報センサーデータ ユーザーデータ Smart Home Hub pg. 24 7 June 2017
解決 3: 双方向通信 (1/5) IoT Topic とは論理通信チャンネル IoT Topic を通してデバイスとメッセージの送受信を行う AWS IoT Message Broker (MQTT サーバー ) publish subscribe パブリッシャー 1 トピックサブスクライバー 1 パブリッシャー 2 subscribe publish サブスクライバー 2 トピック subscribe サブスクライバー 3 pg. 25 7 June 2017
解決 3: 双方向通信 (2/5) 各デバイスごとに送受信のための IoT Topic を用意デバイスから受信する Topic とデバイスへ送信する Topic を用意 AWS IoT Message Broker /devices/1000/fromdevice/topic1 /devices/1000/todevice/topic2 UUID: 1000 /devices/1001/fromdevice/topic1 /devices/1001/todevice/topic2 UUID: 1001 /devices/1002/fromdevice/topic1 /devices/1002/todevice/topic2 UUID: 1002 pg. 26 7 June 2017
解決 3: 双方向通信 (3/5) IoT Rule でデバイスから IoT Topic への書き込みを監視デバイスからメッセージが記述された時点で Lambda を動作させる AWS IoT Message Broker IoT Rule /devices/1000/fromdevice/topic1 /devices/1000/todevice/topic2 publish UUID: 1000 IoT Rule /devices/1001/fromdevice/topic1 /devices/1001/todevice/topic2 publish UUID: 1001 IoT Rule /devices/1002/fromdevice/topic1 /devices/1002/todevice/topic2 publish UUID: 1002 pg. 27 7 June 2017
解決 3: 双方向通信 (4/5) デバイスからのメッセージ受信時に Lambda を起動するためのルール例 SELECT * FROM 'devices/+/fromdevice/temperature' デバイスの UUID が指定されている必要がある /devices/1000/fromdevice/temperature /devices/1001/fromdevice/door デバイス 1000 からの温度データ デバイス 1001 からのドア開閉データ pg. 28 7 June 2017
解決 3: 双方向通信 (5/5) デバイスは特定の IoT Topic を Subscribe メッセージの受信が可能 AWS IoT Message Broker IoT Rule /devices/1000/fromdevice/topic1 /devices/1000/todevice/topic2 publish subscribe UUID: 1000 IoT Rule /devices/1001/fromdevice/topic1 /devices/1001/todevice/topic2 publish subscribe UUID: 1001 IoT Rule /devices/1002/fromdevice/topic1 /devices/1002/todevice/topic2 publish subscribe UUID: 1002 pg. 29 7 June 2017
AWS IoT Topic QOS AWS IoT では Message Brocker との間で以下の QoS が利用可能 QoS 0 At Most One ( 多くても 1 回 ) 定期的にデータを送信を行い 多少のデータの欠損が問題にならない場合に利用 QoS 1 At Least One ( 少なくとも 1 回 ) 定期的ではなくイベント型のデータで欠損が望ましくない場合に利用 QoS 2 サポートされていない pg. 30 7 June 2017
AWS IoT Message Broker の制限 (1/2) デフォルトではアイドル状態が 30 分続くと MQTT クライアントとの接続が切れる http://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_iot キープアライブの設定を MQTT CONNECT 時に 5 秒から 1200 秒まで指定可能 サーバー側はキープアライブの 1.5 倍の時間以内に通信がない場合は接続を切る aws-iot-cpp-sdk Class MqttClient { Connect(std::chrono::milliseconds action_reponse_timeout, bool is_clean_session, mqtt::version mqtt_version, std::chrono::seconds keep_alive_timeout, std::unique_ptr<utf8string> p_client_id, std::unique_ptr<utf8string> p_username, std::unique_ptr<utf8string> p_password, std::unique_ptr<mqtt::willoptions> p_will_msg); pg. 31 7 June 2017
AWS IoT Message Broker の制限 (2/2) AWS IoT Message Broker /devices/1000/fromdevice/topic1 /devices/1000/todevice/topic2 PING も課金対象なので注意が必要 Keep Aliveで設定時間ごとにPING メッセージを送信することで接続を維持 AWS IoT Device SDK Message Broker からの切断以外に NAT のセッションタイムアウトなど経路で切断されることもがある pg. 32 7 June 2017
課題 4: データ同期 Smart Home Hub が接続デバイスを制御するために クラウドに保存されている様々な情報が必要になる Smart Home Hub 変更 デバイス制御に必要な情報 変更 デバイスリスト デバイス情報 設定値 デバイスリスト デバイス情報 設定値 pg. 33 7 June 2017
解決 4: データ同期 (1/2) IoT Shadow を利用してクラウドに保存されているデータを Smart Home Hub に同期する Smart Home Hub 変更 デバイス制御に必要な情報 変更 デバイスリスト デバイス情報 設定値 デバイスリスト デバイス情報 設定値 pg. 34 7 June 2017
解決 4: データ同期 (2/2) Smart Home Hub 変更 (device2 追加 ) { devicelist : { desired : [ device1, device2 ], reported : [ device1 ], delta : [ device2 ], }} { devicelist : { desired : [ device1, device2 ], reported : [ device1, device2 ],}} IoT Shadow の変更通知が Smart Home Hub に送られる Smart Home Hub 内部のデータベースを更新 reported で IoT Shadow が同期されたことを通知 pg. 35 7 June 2017
IoT Shadow の制限 最大 8K byte IoT Shadow の変更時は desired, reported, desired が記述されるためサイズ制限を超えることがある 1 つのデバイスで複数の IoT Shadow を利用することで問題を解決 pg. 36 7 June 2017
Thing と Shadow の関係 AWS コンソールからも AWS IoT Device SDK の API からも IoT Thing と IoT Shadow は 1 対 1 の関係に見える /** * @brief Constructor * * @param p_mqtt_client - MQTT Client instance used for this Shadow, can NOT be changed later * @param mqtt_command_timeout - Timeout to use for MQTT Commands * @param thing_name - Thing name for this shadow * @param client_token_prefix - Client Token prefix to use for shadow operations */ Shadow(std::shared_ptr<MqttClient> p_mqtt_client, std::chrono::milliseconds mqtt_command_timeout, util::string &thing_name, util::string &client_token_prefix); ResponseCode PerformGetAsync(); util::jsondocument GetServerDocument(); https://github.com/aws/aws-iot-device-sdk-cpp 1 つの IoT Thing に対して複数の IoT Shadow を利用することが可能 pg. 37 7 June 2017
Multiple IoT Shadow (1/2) { "Effect": "Allow", "Action": [ "iot:publish ], "Resource": [ xxx/devices/1000/fromdevice/*", xxx/$aws/things/1000*/shadow/get" ] }, { "Effect": "Allow", "Action": [ "iot:subscribe ], "Resource": [ xxx/devices/1000/todevice/*", IoT Policy に UUID + ワイルドカードを記述 xxx/$aws/things/1000*/shadow/update/delta", ] UUID+* の Shadow を利用可能とする thins/1000-1 thins/1000-2 thins/1000-3 things/1000 pg. 38 7 June 2017
Multiple IoT Shadow (2/2) Thing Name に Shadow 名を入れることで複数 Shadow を利用可能 Shadow shadow1(p_mqtt_client, ConfigCommon::mqtt_command_timeout_, 1000-1, client_token_prefix); Shadow shadow1(p_mqtt_client, ConfigCommon::mqtt_command_timeout_, 1000-2, client_token_prefix); Shadow shadow1(p_mqtt_client, ConfigCommon::mqtt_command_timeout_, 1000-3, client_token_prefix); pg. 39 7 June 2017
スマートホームシステムの構成 Smart Phone Application Firebase Cloud Messaging Amazon API Gateway Amazon Cognito Amazon Aurora Corporate Private Cloud AWS IoT Smart Home Hub pg. 40 7 June 2017
まとめ Amazon Cognito User Pool IoT Policy Client Certificate IoT Topic IoT Rule IoT Shadow pg. 41 7 June 2017
ご清聴ありがとうございました pg. 42 7 June 2017
SONY is a registered trademark of Sony Corporation. Names of Sony products and services are the registered trademarks and/or trademarks of Sony Corporation or its Group companies. Other company names and product names are registered trademarks and/or trademarks of the respective companies.