AWS IoT Device SDK for Python を Docker 環境で構築する。
今回の記事を読む前に前回の記事を読むと分かりやすいと思います。
├── Dockerfile
├── cert
│ ├── hands-on-iot-python.cert.pem
│ ├── hands-on-iot-python.private.key
│ ├── hands-on-iot-python.public.key
│ └── root-CA.crt
├── docker-compose.yml
└── publish_test.py
hands-on-iot-python.cert.pem 等については前回の記事で解説しています。
注意点として、cert
ディレクトリ以下に配置しています。
[Dockerfile]
FROM python:3.8.6-slim-buster
RUN apt-get update
RUN apt-get install -y cmake
RUN apt-get install -y libssl-dev
RUN pip install awsiotsdk
[docker-compose.yml]
version: '3'
services:
python3:
build: .
working_dir: '/root/python'
tty: true
volumes:
- ./:/root/python
[publish_test.py]
from awscrt import io, mqtt, auth, http
from awsiot import mqtt_connection_builder
import json
ENDPOINT = "エンドポイント.iot.ap-northeast-1.amazonaws.com"
PATH_TO_CERT = "./cert/hands-on-iot-python.cert.pem"
PATH_TO_KEY = "./cert/hands-on-iot-python.private.key"
PATH_TO_ROOT = "./cert/root-CA.crt"
TOPIC="sdk/test/Python"
CLIENT_ID = "basicPubSub"
event_loop_group = io.EventLoopGroup(1)
host_resolver = io.DefaultHostResolver(event_loop_group)
client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)
mqtt_connection = mqtt_connection_builder.mtls_from_path(
endpoint=ENDPOINT,
cert_filepath=PATH_TO_CERT,
pri_key_filepath=PATH_TO_KEY,
client_bootstrap=client_bootstrap,
ca_filepath=PATH_TO_ROOT,
client_id=CLIENT_ID,
clean_session=False,
keep_alive_secs=6,
port=8883
)
print("Connecting to {} with client ID '{}'...".format(
ENDPOINT, CLIENT_ID))
connect_future = mqtt_connection.connect()
connect_future.result()
message = {"message" : "test"}
mqtt_connection.publish(topic=TOPIC, payload=json.dumps(message), qos=mqtt.QoS.AT_LEAST_ONCE)
print("Published: '" + json.dumps(message) + "' to the topic: " + TOPIC)
disconnect_future = mqtt_connection.disconnect()
disconnect_future.result()
{“message” : “test”} を"sdk/test/Python"トピックに送信しているだけのコードですね。
docker-compose up -d
docker-compose exec python3 python publish_test.py
これで送信できたら完了です。
エラーについて
awscrt.exceptions.AwsCrtError: AwsCrtError(name='AWS_IO_TLS_ERROR_NEGOTIATION_FAILURE', message='TLS (SSL) negotiation failed', code=1029)
こういうエラーで随分悩みましたが、PATH_TO_ROOT
の値をhands-on-iot-python.cert.pem
でローカルでは動いていたのですが、docker環境だとroot-CA.crt
で動かさないとダメのようです。
このエラーで困った人がいたらぜひ。
まとめ
AWS IoT Device SDK for Python を Docker 環境で構築しました。
この分野は記事が私がやっている段階では非常に少なく、少しでも役に立つと幸いです。