おはげようございます。「IT 革命(アイティー革命)」を「イット革命」と呼ばれた方がいらっしゃったことをリスペクトします。
tl;dr
2015 年の re:Invent で満を持して発表された AWS イヲット、もとい、AWS IoT をちょっと触ってみる。
AWS IoT とは
詳しくは…
ドキュメントを。
※ AWS IoT はベータ版での提供となっており、今後も仕様の変更等が行われることが予想されるので実際の利用に際しては上記のドキュメントを参考にされたし
提供するサービスをざっくり三行 + α で
- AWS が提供するマネージド MQTT ブローカー(但し、MQTT には提供されない Shadow が実装されている、又、HTTP 1.1 もサポート)
- AWS IoT が提供する Rule にもとづいて AWS の各サービス(全てのサービスに対応しているわけではないが…)との連携
- ポリシーによるクライアントの認可と X.509 証明書ベースの認証
その他、詳細については AWS IoT の仕組み と以下の資料を。
自分なりの理解を手書き絵で
ドキュメント読みながら AWS IoT の構成要素を手書きで絵にしてみた。
構成要素としては…
- Thing「モノ」、自分が知ってる名詞ではラズパイ、エヂソン、IoT 機器と呼ばれるモノ
- AWS IoT のメッセージブローカー(MQTT 又はHTTP 1.1 で Thing からのメッセージを送受信可能)
- 証明書とポリシー(Thing からメッセージブローカーに対する認可、認証)
- ルール(メッセージブローカーから AWS 各サービスへのルーティング)
- Shadow(デバイスがオフラインでもメッセージ受信可能)
- Registry(デバイスの管理)
それぞれの機能や用途については引き続き調べたい。
で、なんぼ?
AWS IoT に掛かる費用の計算は以下を利用する。詳細はこちらを。
- モノから AWS IoT に送信したメッセージ数
- AWS IoT からモノに送信したメッセージ数
尚、AWS IoT と連携が可能な AWS サービスへの通信コストは発生しないとのこと。また、小遣い制の自分には嬉しい無料は以下の通り。
- 毎月 25 万メッセージ
- 12 ヶ月
ありがたや、ありがたや。
俺の手元にはラズパイがある
ラズパイ
今回は温度センサーとかは利用しない。
ということで
手元のラズパイを AWS IoT に登録してみる手順は以下の通り。
- ラズパイを登録
- ルールを定義
- ポリシーを定義
- 証明書を発行、ポリシーをアタッチ
- 証明書にラズパイをアタッチ
- 証明書をアクティベート
- 証明書をラズパイにダウンロード
- ルート証明書もラズパイにダウンロード
- ルールを定義
最終的には以下の記事を参考にさせて頂いて(有難うございます)俺のラズパイから Ruby を利用してメッセージを AWS IoT を経由して SNS に送信して最終的にはメールにメッセージを飛ばしたい。
以下、AWS CLI でサクッと試されている方が多い中、マネジメントコンソールをポチポチでやってみたいと思う。
ラズパイを登録
必須項目はモノの名前だけ。
ルールを定義
Name
を入力し、Attribute
とTopic Filter
を入力する。Topic Filter
には MQTT のトピック名を指定するChoose Action
には対応している AWS 各サービスのアクションを選択する(今回は SNS を利用したが、SNS の Topic ARN やポリシー等を一緒に作成することが出来る)
ポリシーを定義
- AWS IoT の IAM ポリシーを指定する(イメージ)
Action
でブローカーに対する細かいアクションを定義することが出来る
証明書を発行してラズパイとポリシーにアタッチ、アクティベート
証明書を発行。発行時点では INACTIVE
となっている。
証明書にポリシーをアタッチ。
証明書にラズパイをアタッチ。
証明書をアクティベート。
尚、ポリシーのアタッチ、アクティベートについては以下のように証明書にチェックを入れて Action
プルダウンより選択する。
証明書をラズパイに設置
何らかの方法で証明書ファイルをダウンロードしてラズパイに設置する。
ラズパイに適当にディレクトリをこさえておく。
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 先のメールアドレスに送信されて受信を確認できた。
以上
今回は Ruby を利用したが、AWS IoT の醍醐味の一つは AWS IoT SDK が提供されている点で AWS IoT を介して SDK で開発したアプリケーションを搭載したモノと AWS の各種サービスが手軽に連携出来るのが嬉しい点なのかなと考えている。現時点ではベータ版での提供ということもあるのか連携出来るサービスが限られている感があるが、今後、Amazon Elasticsearch Service 等との連携も出来るようになるのかしら…。
ということで、電源入れっぱなしでホコリを被っていたラズパイが利用出来て良かった、良かった。