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で遠隔温度モニタリング
サポートいただけると励みになります! よろしくおねがいします!!