4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【AWS】MQTTをpython で

Last updated at Posted at 2021-07-05

はじめに

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はモノですね。

image.png

最後に、必要なファイルを全てダウンロードさせるように促されるので、それに従います。

証明書を指定してサーバを実行

このサイトにあるコードを、必要な設定を書き換えて動かしました。

先にダウンロードした証明書、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コンソールの一番上の「モニタリング」で動いていそうなのが確認できました。

image.png

証明書の再発行

コンソールの左にメニューの安全性 -- 証明書 から再発行できるようです。

設計について

ここは思い付きメモ。適切でなければご指摘のほどを。

ポリシーと証明書

とりあえず、ポリシーと証明書、というくくりで考えている。
いろいろややこしいが、、、

  • 証明書の一式。これはデバイス一つに一つ与える感じ。(private key, certificate key, root証明書)
    からなる。
  • ポリシー。ポリシーは、topic やら client ID へのアクセス権の設定。証明書にポリシーに、既存のポリシーにアタッチする。

まとめ

とりあえずpublish できた。雑感として

  • しっかりTLSするように設計されている
  • 普通のMQTTみたい。昔のプログラムも使えるかも。

実装は awsiot なしで paho を使おうかな。ふー。
(2021/07/05)

追記

-「ポリシーと証明書」を追記。(2021/07/20)

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?