AWS IoT Device SDK for Python を Docker 環境で構築する。

今回の記事を読む前に前回の記事を読むと分かりやすいと思います。

前回の記事:AWS Iot Coreについて

├── 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 環境で構築しました。

この分野は記事が私がやっている段階では非常に少なく、少しでも役に立つと幸いです。

Nakano
Nakano
Back-end engineer

AWS,Rails,UE4,vue.js,hugo,その他なんでもやりたい

関連項目