はじめに
AWS IoT のMQTTでpublish/subscribe ができたのでメモします。基本的に、
「[Python の使用時に、デバイスから AWS IoT Core に MQTT メッセージを発行する方法を教えてください。]
(https://aws.amazon.com/jp/premiumsupport/knowledge-center/iot-core-publish-mqtt-messages-python/)」に書かれている通りです。ここにあるpublish するプログラムを動かせました。
サーバ認証
はまったポイントは、サーバ認証のところ。MQTT broker が間違ってませんよ、と確認するところかな。何が問題だったかというと、、、
最初に、Endpoint は
$ aws iot describe-endpoint
{
"endpointAddress": "xxxx.iot.ap-northeast-1.amazonaws.com"
}
とコマンド確認したアドレスを書いていました。が、これがアカンのであった。実は、
$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
"endpointAddress": "xxxx-ats.iot.ap-northeast-1.amazonaws.com"
}
と、Amazon Trust Service(ATS)の方のendpoint の方を使う必要があった。
より正確には、エンドポイントによって使われる証明書の型が違った。おじさんが使っていたAmazonRootCA1.pem はATSのnepoind の方で使うものであった。そしてこちらが奨励されるものである。「セキュリティ/認証/サーバタイプ」に公式の説明があります。
なお、こちらに awsiot を使わず、paho で接続している方がコードを公開されていた。
https://qiita.com/optimisuke/items/6f247bdb851ffee60b83
client = mqtt.Client(client_id= "python",protocol=mqtt.MQTTv311)
### パスワード認証を使用する時に使用する
#client.username_pw_set(username, password=password)
### SSL
client.tls_set(cacert,
certfile = clientCert,
keyfile = clientKey,
tls_version = ssl.PROTOCOL_TLSv1_2)
client.tls_insecure_set(True)
とすればよいらしい。メモ。
動作確認内容
コンソールでtopicを用意
AWT IoTの「管理」の「モノ」から作成できます。Thingsはモノですね。
最後に、必要なファイルを全てダウンロードさせるように促されるので、それに従います。
証明書を指定してサーバを実行
このサイトにあるコードを、必要な設定を書き換えて動かしました。
先にダウンロードした証明書、endpoint、topic name を指定します。certificate.pem.crtは「デバイス証明書」のファイルです。KEYはプライベートkey、ROOT証明書は、AmazonRootCA1.pem です。
ENDPOINT = "xxxx-ats.iot.ap-northeast-1.amazonaws.com"
CLIENT_ID = "testTkdDevice"
PATH_TO_CERT = "certificates/certificate.pem.crt"
PATH_TO_KEY = "certificates/private.pem.key"
PATH_TO_ROOT = "certificates/root.pem"
MESSAGE = "Hello World"
TOPIC = "test-thing-01"
ファイル名は変えましたが、これで動きました。
モニタリング
一応、IoTコンソールの一番上の「モニタリング」で動いていそうなのが確認できました。
証明書の再発行
コンソールの左にメニューの安全性 -- 証明書 から再発行できるようです。
設計について
ここは思い付きメモ。適切でなければご指摘のほどを。
ポリシーと証明書
とりあえず、ポリシーと証明書、というくくりで考えている。
いろいろややこしいが、、、
- 証明書の一式。これはデバイス一つに一つ与える感じ。(private key, certificate key, root証明書)
からなる。 - ポリシー。ポリシーは、topic やら client ID へのアクセス権の設定。証明書にポリシーに、既存のポリシーにアタッチする。
まとめ
とりあえずpublish できた。雑感として
- しっかりTLSするように設計されている
- 普通のMQTTみたい。昔のプログラムも使えるかも。
実装は awsiot なしで paho を使おうかな。ふー。
(2021/07/05)
追記
-「ポリシーと証明書」を追記。(2021/07/20)