はじめに
AWS IoT Message BrokerのMQTTでpub/subをやってみようとしたら参照した記事の通りではうまくいかなかったので、メモを残します。
結論から言うと、ATSエンドポイントとAmazon Root証明書を使用するの2点
環境
- RaspberryPi 3
- Raspbian GNU/Linux 9 (stretch)
- aws-cli/1.18.223 Python/3.5.3 Linux/4.19.66-v7+ botocore/1.19.63
- jq-1.5-1-a5b5cbe
手順
- Mosquittoインストール
- Mosquittoローカル動作確認
- AWS IoT用のユーザー作成
- AWS IoT Message Brokerクレデンシャル等取得
- AWS IoT Root証明書入手
- AWS エンドポイントでのMosquitto動作確認
Mosquittoインストール
$ sudo apt install mosquitto mosquitto-clients
Mosquittoローカル動作確認
mosquitto -d
mosquitto_sub -d -t topic/one -u mqtt -P mqtt
これで待ち受け状態になるので、別端末を開いて以下を実行
mosquitto_pub -d -t topic/one -m "This is message" -u mqtt -P mqtt
これで先ほどの端末でメッセージが表示されます
オプションの意味は
-d デバッグ情報出力
-t トピック名
-u ユーザー名
-P ユーザーパスワード
-m 送信メッセージ
AWS IoT用のアカウント作成
専用のアカウントmqtt_userを用意した。
AWSのIAM、ユーザーからAWS CLI用のアカウントを作成。アクセスキー - プログラムによるアクセスだけチェックし、コンソールでは使わないのでパスワードはなし。
既存のポリシーを直接アタッチでAWSIoTFullAccessを選択
キーIDとシークレットを以下で設定
$ aws configure
AWS IoT Message Brokerクレデンシャル等取得
以下参照記事に沿って
$ aws iot create-keys-and-certificate --set-as-active > cert.json
$ cat cert.json | jq .keyPair.PublicKey -r > mqtt_user-public-key.pem
$ cat cert.json | jq .keyPair.PrivateKey -r > mqtt_user-private-key.pem
$ cat cert.json | jq .certificatePem -r > cert.pem
AWS IoT Root証明書入手
元の記事ではシマンテックサイトから取得していたが、シマンテックのRoot証明書は無効になっているようでした。
その代わり現在はAmazonが発行している証明書が使えるようでしたので、Amazon Root CA 1をAmazonRootCA1.pemとしてダウンロードしました。
$ wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
IAM Role の設定
参照記事の通り
AWS エンドポイントでのMosquitto動作確認
MQTT エンドポイントの確認
ここでエンドポイントタイプを指定することで、ATS エンドポイントを取得しています。
$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
Subscribe
取得できたエンドポイントを-h オプションで指定してsubscribe
mosquitto_sub --cafile AmazonRootCA1.pem --cert cert.pem --key mqtt_user-private-key.pem -h "DUMMY-ats.iot.ap-northeast-1.amazonaws.com" -p 8883 -q 1 -d -t topic/test -i clientid1
Publish
別端末でpublishしてみます。
mosquitto_pub --cafile AmazonRootCA1.pem --cert cert.pem --key mqtt_user-private-key.pem -h DUMMY-ats.iot.ap-northeast-1.amazonaws.com -p 8883 -q 1 -d -t topic/test -i clientid2 -m "Hello, World!"
subscribeした元の端末にメッセージが表示されれば動作OK