ちょっと話題の記事

AWS再入門 AWS IoT編

2015.12.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

当エントリはDevelopers.IOで弊社AWSチームによる2015年アドベントカレンダー 『AWS サービス別 再入門アドベントカレンダー 2015』の25日目のエントリです。昨日24日目のエントリはきうちの『Data Pipeline』でした。

このアドベントカレンダーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

本日25日目、最終日のテーマは『AWS IoT』です。今年のバズワードとも言える「IoT」、乗り遅れたまま今年が終わりそう、、、という方は是非この記事で基本を抑えて下さい。

目次

サービスの基本的な説明

AWS IoTはAWSのリソース、特徴を使ってIoTデバイスからデータをAWSクラウドにつなぐ部分、デバイスの管理の部分をセキュアにつなぐ手助けをするサービスです。IoTを使い始めた方であれば一般のシステム開発と随分勝手が違う部分が出てきます。AWS IoTはそこの部分をうまくラップすることでなるべく違和感なくIoTの世界に入っていくことが出来るようになります。

AWSからのスライドもうまくその辺がまとめられているので御覧ください。

前提知識

そもそもIoTとはなんだ

まず前提として「IoTがよくわからない」という方もいるかと思います。そこを軽くさらってみたいと思います。

IoTとは「Internet of Things(モノのインターネット)」の略です。。。ここまではだいじょうぶでしょう。笑

モノがネットに繋がるとどういうことになるか、現在既に製造されているIoTデバイスをキーワードのみで見てみましょう。

  • 子供のランドセルにつけたBluetoothタグを認識して家の鍵が自動で開き、同時に親のスマホに帰宅を知らせる
  • 洗濯機のボタンを押すとAmazonから洗剤が届く
  • スマホに献立を打ち込むと冷蔵庫が中身を確認して足りない食材を教えてくれる
  • 眼精疲労を認識して休憩を促すメガネ
  • 時間帯と天気、明るさを認識して気分に合う明るさにしてくれる照明
  • 天気予報とリンクしてその日傘が必要かどうかを教えてくれる傘立て

IoTとはどういうものか、何となく分かって頂けたかと思います。

用語

ではAWS IoTの具体的な特徴をご紹介する前にIoTを扱う際に必要な用語をおさらいしましょう。

MQTT / ブローカー

mqtt

MQTTとはHTTPやSSHと同じメッセージプロトコルです。特徴は[Publish–subscribeモデル][ヘッダ容量が少ない]等があげられます。 ブローカーとはMQTTやHTTP等のプロトコルを通じて投げられたメッセージを物理領域に格納し、管理する為の仕組みです。代表的なMQTTブローカーには「Mosquitto」などがあります。

Zigbee

zigbee-logo

Zigbeeとは通信規格の一つです。Bluetoothや920MHz帯(サブギガ帯と言います)無線の仲間ですね。ZigbeeはZig(ジグザグに飛ぶ)bee(蜂)という名の通り沢山のノード(最大65535ノード)をつなげることができ消費電力がとても少ない、という特徴があります。先日発表した最新のZigBee3.0は2.4GHz帯で動作し次にご紹介するEnOceanとの提携も決まり、ますますIoTの開発には欠かせないものとなっています。

EnOcean

enocean

EnOceanもZigbee同様無線通信規格の一つです。特徴はズバリ「エネルギーハーベスティング技術」を使用している、という事です。エネルギーハーベスティングとは光や熱,電磁波,振動,人の動作などから電力を得る環境発電技術を指します。エネルギーを電池無しで様々な環境から少しずつハーベスト(収穫)することで動作するので屋外で微力な電力で動作するIoTデバイスに最適、と言われています。

BLE

BLEは[Bluetooth Low Energy]の略で、無線通信の王道、Bluetoothの最新、「Bluetooth4.0」という規格の一部を指します。Low Energyの名の通り極低電力で動作することができ、ボタン電池1つで2年いけると言われています。iPhone, macに搭載された時に有名になったのでご存じの方も多いかと思います。やはりIoTのポイントは「いかに低電力で動作するか」にあるわけです。

IoTゲートウェイ

上にご紹介したようにIoTデバイスは「低電力」というのがポイントとなります。低電力という観点で見た時にWi-Fiや3Gでクラウドまでデータを飛ばすことはかなりハードルが高くなります。そこでIoTゲートウェイはIoTデバイスからのデータを受け取り代わりにクラウドにデータを飛ばしてくれます。IoTデバイスは大抵複数個使うのでそれぞれのデバイスからデータを集めてまとめてあげることでコストの削減にも繋がります。 代表的なIoTゲートウェイには「OpenBlocks BX1」や「Armadillo-IoT」などがあります。特にOpenBlocksはAWS IoTに接続するためのWebコンテンツが用意されており、AWS IoTとの親和性が高くなっています。

SORACOM

IoTゲートウェイからクラウドにデータをあげる際に通信としてはWi-Fiを通じて既存のネットワークを使うか、3G回線を使用して直接インターネットとつなげるか、という選択になります。屋外や工場などネットワークに繋げられない状況の場合3G回線としてSIMをIoTゲートウェイに挿すことになります。 SORACOMはIoTに特化したSIMになります。SIMの管理自体もAPIを使ってプログラマブルに出来たり、Web画面を使って速度や休止、解約まで管理できるなど面白い仕組みになっています。SORACOM BEAMという仕組みを使うとAWSまでインターネットに直接出ることなくセキュアにデータが運べたりと、AWS IoTをWi-Fi以外からつなげる場合は選択肢として考えてみる価値があるかと思います。

AWS IoTの特徴

スケールするMQTT/RESTブローカー

awsiot_1 複数のIoTデバイスからデータを上げることが前提となるので、それらのデータを受けて適切に後ろに流すブローカーは大事な役割となります。つまり30秒に1回くらいしかデータが飛んでこない時も、秒間何万件というデータが飛んで来る時も安定して動き続けることが必要です。 AWS IoTの各メッセージブローカーはAWSマネージドとして必要に応じて独自にスケールアウトしますので、使用する時はそこら辺のことは一切考えずに、ひたすらデータを送りつけても問題ないアーキテクチャとなっています。

SQLライクにデータを管理するRuleエンジン

awsiot_2

IoTデバイスからメッセージブローカーに送られてきたデータは[Ruleエンジン]というサブスクライバによって処理された上で他のAWSリソースに運ばれます。 RuleエンジンはSQLっぽい式で登録ができるのでDBを触ったことのある方ならすぐに馴染めると思います。

RuleエンジンからAWSリソースを操作するには[Action]というコンポーネントを選択、登録します。Actionで選択できるAWSリソースは5種類(S3, DynamoDB, Kinesis, SNS, Lambda)となり、それ以外のAWSリソースに移動したい場合はLambdaやSNSに一旦データを渡し、そこから目標となるAWSリソースに投げると良いかと思います。

デバイスを仮想的に管理するデバイスSHADOW

awsiot_3

デバイスSHADOWとはAWSの中に仮想的に持っているデバイスオブジェクトのようなものです。デバイスが現在どういう状態なのか、実際のデバイスはオフラインになったりして管理できないこともよくあります。そんな時デバイスが最後に通信した時の状態をデバイスSHADOWが保持していて、デバイスが再びオンラインになった時点で同期をとる、ということができます。 またオフライン中にアプリからライトをつける、のような状態が変化する操作があった時も、オフラインの場合はSHADOWが変更され、デバイスがオンラインになった時にその変更が同期されます。これにより、実際のデバイスがどうなっているかは気にせず操作をAWS IoTに送ることができます。

固有ID管理をサポートするデバイスレジストリ

awsiot_5

デバイスレジストリは主にデバイス情報の管理に使います。デバイスSHADOWはデバイスの「状態」を主に管理するのに対し、デバイスレジストリはファームウェアや製品固有番号等のデバイスを管理する目的で使用します。またデバイスの固有番号などがないデバイスに対してもデバイスレジストリが独自の固有番号を振ることで一意に管理することが出来るようになります。

はじめてみよう

それでは初めて見ましょう。マネージメントコンソールからAWS IoTを開きます(ちなみについ先日Betaが取れました)。

awsiot_4

デバイス(Things)の登録

まずはデバイスを登録しましょう。

awsiot_6

AWS IoTではデバイスやモバイルアプリ等の接続単位を[Thing]と言います。ResourcesからCreate a thingを選択します。

awsiot_7

名前を入れてCreateボタンを押すとデバイスの登録が完了します。製造番号等がわかっている場合は[Attributes]からここで登録しておくと管理できます。

awsiot_8

右側に表示されているのが登録したThingの内容になります。[MQTT topic]にはデバイスSHADOWの保持先となるアドレスが表示されています。 ここでデバイスに登録するための証明書をダウンロードします。Connect a deviceをクリックします。

awsiot_9

デバイス内でAWS IoTとつなげるために書くコードの言語を選択してGenerate certificate and policyをクリックします。

awsiot_10

AWS IoTとの接続に必要な鍵(秘密鍵と公開鍵。実際に使うのは秘密鍵)と証明書のダウンロードリンクが出てきます。鍵はここでしかダウンロード出来ませんので必ずダウンロードしましょう。

awsiot_11

ダウンロードして Confirm & start connectingボタンを押すとそれぞれの言語での接続情報が出てきます。特にホスト名は大事なのでメモしておきましょう。 また上にSDKのダウンロードリンクが出てきます。こちらのSDKを使うとより一層簡単にデバイス側の登録ができるようになります。接続部分をラップしたDevice SDKというのもあります。そちらについてはこちらの記事を参考にしてみてください。

Ruleエンジンの登録

デバイスの登録が終わったら次はRuleの登録です。ResourceからCreate Ruleをクリックします。

awsiot_12

上で解説したようにRuleエンジンはSQLライクに書くことが出来ます。AttributeがSELECT部(何のデータを使うか)、Topic fileterがFROM部(どこに入っているデータを使うか)、ConditionがWHERE部(どのような条件で抽出するか)を表します。

awsiot_13

SQL部分を書いたら次はActionを登録します。現在AWS IoTから選べるアクションはこのようになっています。今回は簡単にS3への登録を選択します。

awsiot_14

S3を選択すると対象となるバケット名、キー名、S3を操作するためのIAM Roleを選択します。バケットやIAM Roleはその場で作ることも出来ます。Add ActionでActionを登録します。

awsiot_15

これでActionが登録されました。ひとつのルールに付き複数のActionを登録することが可能です。CreateをクリックするとRuleの登録が完了します。

ポイント

実装のポイントとしては

  • ひとまず疎通確認のためにはS3への登録を選んでおいて、疎通確認後に本当に渡したいサービスを登録する
  • AWS IoTはQoS(Quality of Service)レベルの2が選択できないので複数投げられてもデータが重複しないような冪等性を確保した設計にするとよい
  • 連続したデータはTopicにMQTTデータを投げる形で実装し、単発データや選択データ(ランプがつく/消える、や電話をかける、等)はSHADOWSで管理したほうがよい

となります。入力部、出力部のデバイスの実装はなるべくシンプルにし、難しい処理はAWS内で片付けたほうが変更に強い実装ができます。例えばデータの丸め等はデバイス部では行わず、AWS IoTからLambda等を繋いでそこで行ったほうがよいです。

まとめ

いかがでしたでしょうか。AWS IoTはまだスタートしたばかりのサービスなので今回は「とりあえず触れる」ための方法をご紹介しました。といっても後はSHADOWSの作りこみくらいだと思いますので、是非年末年始でトライしてみてください。

最後に

さて2015年クラスメソッドがお送りしたアドベントカレンダーは「AWS再入門」と題して、AWSの主なサービスをもう一度原点から見つめなおしてみよう、という企画でした。 ここで全ての記事を振り返ってみましょう。

日時 タイトル 担当者
2015/12/01 Amazon S3編 八幡
2015/12/02 Amazon VPC編 大瀧
2015/12/03 Amazon CloudFront編 清水
2015/12/04 Amazon Redshift編 しんや
2015/12/05 Amazon KMS編 吉田
2015/12/06 AWS WAF編
2015/12/07 Amazon RDS編 大栗
2015/12/08 Amazon Elastic MapReduce編 能登
2015/12/09 AWS Config編 森永
2015/12/10 Amazon EC2編 西澤
2015/12/11 AWS Directory Service編 小山
2015/12/12 AWS Inspecter編
2015/12/13 ElasticBeanstalk編 都元
2015/12/14 AWS CodeDeploy編 川原
2015/12/15 Amazon DynamoDB編 千葉
2015/12/16 Amazon Kinesis編 鈴木
2015/12/17 Amazon Elasticsearch Service編 藤本
2015/12/18 AWS Lambda編 藤村
2015/12/19 CloudWatch編 こうき
2015/12/20 Amazon Machine Learning編 平田
2015/12/21 AWS Trusted Advisor編 半瀬
2015/12/22 AWS IAM (Identity and Access Management)編 石川
2015/12/23 Amazon Simple Workflow Service編 せーの
2015/12/24 AWS Data Pipeline編 城内
2015/12/25 AWS IoT編 せーの

AWSに興味はあるけどもよくわからない、AWSを使い始めたんだけどサービスが多すぎて何をどう使っていいのかわからない、という方から、新サービスが出たのは知ってるんだけど日常業務に追われて触れていない、サービスに触る前にどういう事前知識が必要なのか知りたい、自社に導入できるものなのかざっと見てみたい、という方まで今回の企画が皆さんのビジネスの一助となれば幸いです。

One More Thing

今回の企画「AWS再入門」はおかげさまで非常に皆様の高評価を戴いた企画となりました。ご支持戴き誠にありがとうございました。

そこで、不定期ではありますがこのシリーズをもう少し続けてみたいと思います! 対象となるサービスは社内では「CloudFormation再入門」等があがっております。もしこのサービスについて知りたい!という方がいらっしゃいましたらコメントしてください。お待ちしております。

来年は何しましょうかね。リクエストがある方はこちらもコメントの方お待ちしております。それではまた2016 Advent Calendarでお会いしましょう!