オブジェクトの広場はオージス総研グループのエンジニアによる技術発表サイトです

クラウド/Webサービス

これならできる!AWS IoT ハンズオン 参加レポート

AWS IoTで作る簡単IoT環境
オージス総研
中尾 和弘
2015年12月3日

2015年11月13日に、東京目黒区のアルコタワー・アマゾン目黒オフィスにてAWS IoTのハンズオンが開催されました。AWS IoTは、2015年10月にラスベガスで実施されたAWS re:Invent 2015にて発表された、各種IoTデバイスをより容易かつセキュアにAWSクラウドと接続する新しいサービスです。今回のハンズオンでは、この新しいAWS IoTサービスに加え、IoTデバイスを模した小型ボードコンピューター "インテルEdison"を利用しました。本記事では、AWS IoTのポイントと、実際のハンズオンで感じた環境構築の容易さをお伝えします。なお、AWS IoTの詳しい説明は、AWS IoT の仕組み をご参照下さい。

会場のご紹介

エレベータの扉が、Amazonダンボール仕様でした。

elev

会場は、カラフルな椅子が並ぶ広い会議室でした。40名程度の方が参加されていたと思います。

room


AWS IoT 入門 ~ 新サービスのご紹介

ハンズオンの前に、AWS IoTサービスの説明がありました。ここでは、主なポイントをご紹介したいと思います。

AWS IoTの全体イメージ

AWS IoTの全体イメージは、以下のようになっており、大きく4つの主要なパートがあります。

  1. 「Message Broker」: デバイスからクラウドへ、またはその逆方向にメッセージの伝達を行います。
  2. 「Rules Engine」: メッセージを解析し、カスタマイズしたアクションを実行します。
  3. 「Thing Registry」: ネットワークに接続されたデバイスの登録を行います。
  4. 「Thing Shadow」: デバイスの仮想化を行います。これでデバイス状態の更新や参照を行うことができます(以降の記事では、このパートのことを「シャドー」と呼びます)。

AWS IoT Image

https://aws.amazon.com/jp/iot/how-it-works/ より引用

AWS IoTが対応するプロトコルと認証方式

  • サーバ認証:TLS + 証明書
  • クライアント認証:TLS + 証明書
  • 暗号化:TLS
  • プロトコル:MQTT
  • 識別:AWS ARNs
  • 認可:AWSポリシー
  • ※これ以外にも従来のAWS API Keysを用いたHTTP(S)通信も可能です。

AWS IoTでは、デバイスの正当性証明のために、クライアント証明書を使用します。そのためには、クライアント証明書を個々のデバイスに配布する必要があり、この証明書の管理が問題になります。デバイス数が数台程度であれば、証明書の発行や管理もそれほど困難ではないと思いますが、デバイス数が数千台などの単位になってくると、その数だけ証明書発行を行わなければなりませんし、有効期限が到来した証明書の更新、失効リストの管理なども必要になってきます。
AWS IoTでは、コマンドラインで証明書が発行できるようです。また、証明書に有効期限はなく、APIで有効・無効を設定できる仕様になっています。 (参照) https://docs.aws.amazon.com/iot/latest/developerguide/iot-security-identity.html

IoTデバイスの種類は多岐に渡り、証明書をデバイスに配布する方法についても多種多様なやり方があります。発行後の証明書の配布などについては、アマゾンが事例などを調査されているようで、今後ベストプラクティスのようなものがあれば、その機能も付加されるかと思われます。しかし、現状はIoTを導入する人が、証明書の配布や管理について別で考える必要がありそうです。

AWS IoT Device SDK

SDKは、以下の言語をサポートしているようです。

  • C-SDK
  • JS-SDK
  • Arduino Library
  • Mobile SDK (Android, iOS)

AWS IoT ルールエンジン

これは、SQL文を使用してデータの送受信におけるフィルタや文字列操作などを行うことができるものです。 また、それらの操作の後、AWSの他のサービスへ連携することができます。

AWS IoT シャドー

これは、AWS上に個々のIoTデバイスの状態を保持しておけるものです。IoTデバイスがネットワークから切断された状態でも、外部のアプリケーションがデータを要求して利用できるようします。
また逆に、IoTデバイス側でシャドーのSubscribeをしておくことで、外部アプリケーションはシャドー上のデータを変更するだけで、その変更が自動的にIoTデバイスに伝達されます。

AWSエコシステムパートナー

IoTシステムインテグレータとしてAccentureが入っているなど、有力なメンバーがエコシステムとしてAWS IoTへ参画しています。

eco system  

気になる料金について

・AWS IoTを使用したメッセージ量による課金
※2015/11/18現在。最新の料金については、https://aws.amazon.com/jp/iot/pricing/ をご参照ください。

price

https://aws.amazon.com/jp/iot/pricing/ より引用


AWS IoT ハンズオン

いよいよ、ハンズオンが始まりました。座席には、3つのものが用意されていました。一つは、USBケーブルと電源アダプター。もう一つは、インテルEdison。そして最後に、インテルEdisonに接続するセンサーやLCDなどの電子パーツです。

parts

今回のハンズオンでは、次の2つを行いました。

(1) センサデータの送信

EdisonからAWS IoTのトピックに照度センサーのデータを送信し、AWS IoTでルールに基づきNoSQLデータベースDynamoDBへの保存を行います。(今回のハンズオンでは、データベースへのデータ保存まで実施)

handson1

https://awsiot-handson-fundamentals.readthedocs.org/ja/latest/01.html より引用

(2) アプリケーションからLEDをリモート制御

シャドーの状態を手動で変更して、Edisonに接続されたLEDの点灯/消灯の操作を行います。EdisonはAWS IoTのShadowのMQTTトピックをSubscribeしており、Edison側では変更された状態をリアルタイムに受信することができます。(今回のハンズオンでは、アプリケーションではなくブラウザの管理画面から機器制御を実施)

handson2

https://awsiot-handson-fundamentals.readthedocs.org/ja/latest/01.html より引用

Edisonの組み立てとPCとの接続

まず、Edisonの組み立てを行いました。使用したのは、照度センサーとバックライト付のLCD、LEDと取り付けボードです。これらは、部品のピンを刺して組み上げられるので、非常に簡単です。

この後、USBケーブルをPCと接続して、シリアル通信を行い、Edisonにログインします。 ログインしたら、次はEdisonのWi-Fi設定を行います。Wi-Fi設定では、繋がらないトラブルが結構出ているようでした。ここで少し時間がかかりましたが、これでEdisonの準備は完了しました。

edisoon

次に、AWS上での準備を行います。AWSには、CloudFormationという便利な機能があります。CloudFormationとは、AWSのシステム構成をJSONで記述してテンプレート化したもので、これを使えば環境構築が楽に行えます。今回のハンズオンでも、テンプレートが準備されていたので、[Create]ボタンをクリックするだけで、DynamoDBなどのデータベースを含めた環境が構築できました。

次に、Edisonで使用するサンプルコードを準備します。wgetコマンドで、ネット上にあるサンプルコード一式をEdisonにダウンロードします。 ダウンロード後は、まずクライアント証明書を作成します。クライアント証明書は、AWS IoTのWeb UIやAPIからでも作成できるようですが、今回はEdisonにダウンロードしたファイルにある証明書作成スクリプトを用いて作成しました。これで、準備段階は終了です。

AWS IoTの設定

いよいよAWS IoTでデバイスの設定を行います。 AWSマネージメントコンソールから、"AWS IoT(beta)“をクリックするとIoT設定画面が開きます。

toppage

ここから、デバイス設定やルール作成、ポリシー設定などを行います。GUIで設定を行うことができます。 まずは、デバイス"edison"を登録します。 その後、ポリシーを設定し、先ほど作成したクライアント証明書をアタッチして有効にします。 ここまでで、デバイスからAWS IoTに対してデータ送信をすることができます。

次に、デバイスから受け取ったデータをどのように処理するのかを設定します。 これは、ルールに記載します。ルールで設定できるアクションは、他にも"Lambda"などのAWSサービスとの連携や、"SNSメッセージ送信"なども指定することができます。 今回は、デバイスからJSON形式で送られてくる照度データを、DynamoDBに保存します。

rulepage

これで、デバイスから受け取ったデータをDynamoDBに保存することができました。Edisonの事前準備を除けば、30分程度でここまで終えることができました。

db_kekka

今回は、データをDynamoDBに保存するだけでしたが、保存したデータをAmazon Machine Learningに連携して機械学習を行わせたりすることもできるようです。
(今後の開催が検討されているハンズオン応用編で実施されるかもしれないそうです)

LEDをリモート制御

次は、アプリケーションからLEDをリモート制御します。 これは、登録したThings "edison"のシャドーを使います。 シャドーの設定は、図の"Shadow State"のようになっています。

shadow

"desired"が更新後に設定される値、"reported"がデバイスの現在状態です。 この2つの内、"desired"の値をon/offと変えることで、デバイスのLEDを点灯させたり、消したりできます。
もう少し詳しく説明すると、デバイスは"desired"と"reported"の値を知っています。そして、"desired"の値と"reported"の値に違いがあった場合に、"desired"の値を読み取って自分の状態を更新します。これで、LEDのON/OFFが切り替わります。デバイスは、状態を変更した後にAWS IoTのシャドーに対して、"reported"の最新状態を送ります。これで、"desired"と"reported"の値は同じになり、再び"desired"が変更されるまでデバイスは今の状態を続けます。 この機能は、とても実用的だと思います。今回はデバイスがネットに繋がった状態でシャドーを使用しましたが、デバイスがネットに繋がっていない状態でも、"desired"の値を変更しておけば、次にデバイスがネットに接続して通信可能になった場合に、その変更を通知することができます。また、"reported"を見れば、どの端末がまだ変更されていないかを知ることもできます。

  • LEDをONに設定した場合

led-on

  • LEDをOFFに設定した場合

led-off


まとめ

今回は、Edisonの組み立てという初歩の段階から、センサデータのDBへの保存、シャドーを利用したデバイス制御まで行いました。Edisonの組み立てを考慮しなければ、AWS IoTを使用してかなり早く、簡単に一通りのIoT環境を準備することができました。この容易性は、IoTを触ってみたいという人へのハードルを下げることができると感じました。さらに、AWS IoT単体ではなく、DynamoDBやS3さらにAmazon Machine Learningといった他のAWSサービスとの連携も行えるため、今後AWS IoTを使用した画期的な事例がどんどん出てくるのではないかと思います。また、今後も応用編のハンズオンの開催なども考えておられるそうなので、興味のある方は是非参加してみてはいかがでしょうか。