見出し画像

Day18. AWS IoT入門(Raspi接続編)

※ひとりでIoTまるっとチュートリアル Advent Calendar 2018 18日目

ハードウェアの話も、クラウドの話もさらりと学んできました。AWSには本当にいろいろなサービスがあって、その数は年を追うごとに加速して増えています。そんな中、最近IoT分野にもかなり力を入れているようで、2018年のAWS re:Inventでも、多くのアップデートがなされていました。

今回はAWS IoTとRaspberry Piを連携させて、データをクラウド上にアップロードしてみましょう!

目次
・ AWS IoTで設定する項目
・ AWS IoTにモノを登録
・ラズパイからAWS IoTにメッセージを上げる

AWS IoTで設定する項目の概略図

実際に登録して動かすのですが、いろんな言葉がでてくるので混乱してしまいます。すっきりさせるために、概略図を作りました。頭の整理にお使いください。

AWS IoTにモノを登録

AWS IoT Coreのサービスにアクセスし、作成を始めます。コンソールから、IoT coreと入力しましょう。

次に、管理画面から、モノの作成をします。

登録に必要事項を入力します。と言っても、最低限必要なのは名前だけです。自分のイメージは

タイプ : タグみたいなもの。同じものをまとめておいて把握しやすくする
グループ : IAMグループと同じで、一括管理のために使う

次は、証明書の設定です。「モノをAWS IoTにつなげていいものですよ」と証明しなければならないので、証明書を追加しましょう。なにもこだわりがなければ、推奨のものでOKです。

証明書自体はすぐに作れます。ここで、必ず秘密鍵はダウンロードしておいてください。ページ遷移すると、二度とダウンロードできなくなります!!証明書・プライベートキー・ルートCAは後でラズパイに配置するので、今、全部ダウンロードしておきましょう。

ルートCAですが、ダウンロードボタンを押した後、下記ページに飛ぶので、とりあえずどれか一つダウンロードしておきましょう。(最近推奨する証明書が変わったようです。後述のエンドポイントに-atsがついている人は、推奨のにしておくとよいでしょう。ついていない人は、エンドポイントの変え方が載っているので、読んで設定しましょう(少しめんどそうだった)

証明書の作成ができたら、証明書に付随するポリシーを設定します。新規作成して、どういったアクセスを許すかを規定します。Action/リソースARNはIAMポリシーと考え方が同じなので、Day16を参考にしてください。
※ちなみに、下図はガバガバ設定です。実験ならとりあえずまあOKでしょう。本番運用の時はきちんと考えましょう。

Policyの例は、以下を参考にすると良いかもしれません。

最後に、設定(ページ左下にあります。この画像では見切れちゃってます。。)からエンドポイントの確認をしておきましょう。ここに向かってデータを投げつけます。

ここまでで、AWS IoT側の初期設定は終了です。

モノ・証明書・ポリシーの設定をする
各種証明書ダウンロードしておく
エンドポイントを確認する

がポイントです。

ラズパイからAWS IoTにメッセージを投げる

次に、ラズパイ側を設定していきます。AWS IoTは、IoTのような軽量通信のユースケースにはぴったりのMQTT通信が可能です。AWS IoTが、MQTTブローカの役割を果たしてくれるというわけです。

なので、実際にMQTTで処理をするコードを書きましょう。使う言語はPythonです。

Pythonでmqttを使うためにはmqtt-pahoというライブラリを使います。

sudo pip install mqtt-paho

準備はこれだけで、あとはコードを書いていきます。先ほど確認したエンドポイントに向かってデータを投げていきましょう。しかし、エンドポイントを知った人からAWS IoTにデータを無限に投げられても困りますね。それを防ぐために証明書が必要なのです。

TLS通信と呼ばれ、証明書を用いて安全なデータ通信をしています。
参考 : TLS (Transport Layer Security)とは
さて、さっきダウンロードした

・プライベートキー
・クライアント証明書
・ルート証明書

の3点セットを、USB経由でもscp転送でもなんでもいいので、とにかくラズパイにぶち込みましょう。

その後、以下のコードを実行します。とりあえず、{”message” : “Hello World!!”}というのをAWS IoTに送ってみましょう。

import paho.mqtt.client as mq
import ssl
import json
import time
from datetime import datetime as dt

endpoint = "xxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com"
port = 8883 #mqtt接続用port
topic = "topic/pub"
rootCA = "rootCA証明書の場所"
cert = "証明書の場所(xxxx-certificate.pem.crt)"
key = "秘密鍵の場所(xxxx-private.pem.key)"

client = mq.Client(protocol=mq.MQTTv311) #初期化
# TLS通信のセット
client.tls_set(ca_certs=rootCA, certfile=cert, keyfile=key,
              cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, 
              cipers=None) 
client.connect(endpoint, port=port, keepalive=60) #AWS IoTに接続
count = 0

while True:
   message = {"message":"Hello AWS IoT", "count":count}
   client.publish(topic, json.dumps(message)) #AWS IoTに送信(Publish)
   count += 1
   time.sleep(10)

これでpythonを実行してください。

そのご、再びAWS IoTに戻り、「テスト」というところから、実際に値が来ているかを確認しましょう。トピックというのは、アドレスみたいなもので、どこからのpublishなのか、どこからのpublishを受けるのかを規定します。"#"にするとどこからでも受け取れるよとなります。また、階層構造なので、topic/#とすることも可能です。

サブスクライブを押すと・・・表示されました!

まとめ

これで、ラズパイのAWS IoT化が完了しました!いよいよ、IoTの本領発揮というところです。

さて、クラウドまで結びつけることに成功したので、明日はもうちょっと踏み込んだ内容に入っていきましょう!明日の内容は

・SORACOM Beamを使ってみる!
・AWS IoTのルールって何?
・IoTで温度の遠隔モニタリングをしよう!

の3本建てです!お楽しみに。ではではっ

前の日 :  サーバーレスアーキテクチャの要「Lambda」とはなにか
次の日 : AWS IoTとSORACOM Beamで遠隔温度モニタリング


サポートいただけると励みになります! よろしくおねがいします!!