(超メモ)AWS イオット革命...もとい、AWS IoT をちょっと触ってみる - ようへいの日々精進XP

ようへいの日々精進XP

よかろうもん

(超メモ)AWS イオット革命...もとい、AWS IoT をちょっと触ってみる

おはげようございます。「IT 革命(アイティー革命)」を「イット革命」と呼ばれた方がいらっしゃったことをリスペクトします。

追記(2016/01/19)

AWS Iot は昨年の 12 月にベータが取れて正式リリースとなっております。

aws.typepad.com

tl;dr

2015 年の re:Invent で満を持して発表された AWS イヲット、もとい、AWS IoT をちょっと触ってみる。

aws.typepad.com


AWS IoT とは

詳しくは...

ドキュメントを。

AWS IoT はベータ版での提供となっており、今後も仕様の変更等が行われることが予想されるので実際の利用に際しては上記のドキュメントを参考にされたし

提供するサービスをざっくり三行 + α で

  • AWS が提供するマネージド MQTT ブローカー(但し、MQTT には提供されない Shadow が実装されている、又、HTTP 1.1 もサポート)
  • AWS IoT が提供する Rule にもとづいて AWS の各サービス(全てのサービスに対応しているわけではないが...)との連携
  • ポリシーによるクライアントの認可と X.509 証明書ベースの認証

その他、詳細については AWS IoT の仕組み と以下の資料を。

www.slideshare.net

自分なりの理解を手書き絵で

ドキュメント読みながら AWS IoT の構成要素を手書きで絵にしてみた。

f:id:inokara:20151121235521p:plain

構成要素としては...

  • Thing「モノ」、自分が知ってる名詞ではラズパイ、エヂソン、IoT 機器と呼ばれるモノ
  • AWS IoT のメッセージブローカー(MQTT 又はHTTP 1.1 で Thing からのメッセージを送受信可能)
  • 証明書とポリシー(Thing からメッセージブローカーに対する認可、認証)
  • ルール(メッセージブローカーから AWS 各サービスへのルーティング)
  • Shadow(デバイスがオフラインでもメッセージ受信可能)
  • Registry(デバイスの管理)

それぞれの機能や用途については引き続き調べたい。

で、なんぼ?

AWS IoT に掛かる費用の計算は以下を利用する。詳細はこちらを。

  • モノから AWS IoT に送信したメッセージ数
  • AWS IoT からモノに送信したメッセージ数

尚、AWS IoT と連携が可能な AWS サービスへの通信コストは発生しないとのこと。また、小遣い制の自分には嬉しい無料は以下の通り。

  • 毎月 25 万メッセージ
  • 12 ヶ月

ありがたや、ありがたや。


俺の手元にはラズパイがある

ラズパイ

f:id:inokara:20151122081024p:plain

今回は温度センサーとかは利用しない。

ということで

手元のラズパイを AWS IoT に登録してみる手順は以下の通り。

  1. ラズパイを登録
  2. ルールを定義
  3. ポリシーを定義
  4. 証明書を発行、ポリシーをアタッチ
  5. 証明書にラズパイをアタッチ
  6. 証明書をアクティベート
  7. 証明書をラズパイにダウンロード
  8. ルート証明書もラズパイにダウンロード
  9. ルールを定義

最終的には以下の記事を参考にさせて頂いて(有難うございます)俺のラズパイから Ruby を利用してメッセージを AWS IoT を経由して SNS に送信して最終的にはメールにメッセージを飛ばしたい。

qiita.com

以下、AWS CLI でサクッと試されている方が多い中、マネジメントコンソールをポチポチでやってみたいと思う。

ラズパイを登録

必須項目はモノの名前だけ。

f:id:inokara:20151122010254p:plain

ルールを定義

f:id:inokara:20151122010400p:plain

  • Name を入力し、AttributeTopic Filter を入力する。Topic Filter には MQTT のトピック名を指定する
  • Choose Action には対応している AWS 各サービスのアクションを選択する(今回は SNS を利用したが、SNS の Topic ARN やポリシー等を一緒に作成することが出来る)

ポリシーを定義

f:id:inokara:20151122010641p:plain

  • AWS IoT の IAM ポリシーを指定する(イメージ)
  • Action でブローカーに対する細かいアクションを定義することが出来る

証明書を発行してラズパイとポリシーにアタッチ、アクティベート

証明書を発行。発行時点では INACTIVE となっている。

f:id:inokara:20151122011040p:plain

証明書にポリシーをアタッチ。

f:id:inokara:20151122011121p:plain

証明書にラズパイをアタッチ。

f:id:inokara:20151122011135p:plain

証明書をアクティベート。

f:id:inokara:20151122011325p:plain

尚、ポリシーのアタッチ、アクティベートについては以下のように証明書にチェックを入れて Action プルダウンより選択する。

f:id:inokara:20151122011636p:plain

証明書をラズパイに設置

何らかの方法で証明書ファイルをダウンロードしてラズパイに設置する。

f:id:inokara:20151122012100p:plain

ラズパイに適当にディレクトリをこさえておく。

pi@raspberrypi ~ $ mkdir path/to/iot
pi@raspberrypi ~ $ cd path/to/iot
pi@raspberrypi ~/dev/iot $ ls -l
total 24
-rw-r----- 1 pi pi 1220 Nov 22 00:45 xxxxxxxxxxx-certificate.pem.crt
-rw-r----- 1 pi pi 1675 Nov 22 00:45 xxxxxxxxxxx-private.pem.key
-rw-r----- 1 pi pi  451 Nov 22 00:45 xxxxxxxxxxx-public.pem.key

ルート証明書もラズパイに設置

以下のようにルート証明書を取得する。

pi@raspberrypi ~ $ mkdir path/to/iot
pi@raspberrypi ~ $ cd path/to/iot
pi@raspberrypi ~ $ wget https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -O rootCA.pem

メッセージを送信

以下のようなスクリプトを用意してメッセージを送信。

require "mqtt"

MQTT::Client.connect(
  host: "xxxxxxxxxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com",
  port: 8883,
  ssl: true,
  cert_file: "xxxxxxxxxx-certificate.pem.crt",
  key_file: "xxxxxxxxxx-private.pem.key",
  ca_file: "rootCA.pem"
) do |client|
  client.publish("oreno/iot", "Hello Oreno IoT!")
end

以下のように AWS IoT がメッセージを受信、ルールに基いて SNS に転送、SNS から Subscribe 先のメールアドレスに送信されて受信を確認できた。

f:id:inokara:20151122012652p:plain


以上

今回は Ruby を利用したが、AWS IoT の醍醐味の一つは AWS IoT SDK が提供されている点で AWS IoT を介して SDK で開発したアプリケーションを搭載したモノと AWS の各種サービスが手軽に連携出来るのが嬉しい点なのかなと考えている。現時点ではベータ版での提供ということもあるのか連携出来るサービスが限られている感があるが、今後、Amazon Elasticsearch Service 等との連携も出来るようになるのかしら...。

ということで、電源入れっぱなしでホコリを被っていたラズパイが利用出来て良かった、良かった。