BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS・IoT】WSL(Ubuntu)をIoTモノとして登録し、MQTTのテストを行う

f:id:bftnagoya:20210624154214j:plain

はじめに

こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。

少しずつ出来上がってきました、「混雑状況可視化サービス」! 作成していただいたプログラムを実装するのはラズパイなのですが、いかんせん全員に配布して確認してもらうようなことができません。

というわけで簡易的にプログラムが動く環境を作業端末に作ろう、というのがこの記事の趣旨です。もちろんカメラでキャプチャするとかCO2濃度を測定するみたいな部分は使えないので、固定値を与えた上でクラウド側へ値を送信する部分を確認することが目的です。

WSLの導入と初期設定

WSLの導入と初期設定についてはこちらの記事をご確認ください。本記事ではUbuntu 20.04で検証しています。
記事ではAnsibleも導入していますが、Ansible(と連携しなければVisual Studio Codeも)部分だけ飛ばしてもらえればOKです。

bftnagoya.hateblo.jp

IoTポリシーの作成、IoTモノの登録

前回同様、既存のポリシーを使います。IoTモノは前もって登録しておきました。
【AWS・IoT】Pythonを使って作業PCからIoT CoreへMQTT接続しようとしたらエラー対応に追われた話(Resolved) - BFT名古屋 TECH BLOG

WSL側の準備

それではWindowsの時と同様、実行環境の準備を行います。
必ずリポジトリとパッケージの更新はしておきましょう。

sudo apt update
sudo apt upgrade

Pythonのインストール確認

Pythonは3.5以上が必要です。 WSL(Ubuntu20.04)には3.8.5が最初から入っています。 最新ではないですが、特に問題ないのでこのままとします。

# pythonコマンドではないと言われる
ubuntuuser@DESKTOP-AC9R8UJ:~$ python -V

Command 'python' not found, did you mean:

  command 'python3' from deb python3
  command 'python' from deb python-is-python3

ubuntuuser@DESKTOP-AC9R8UJ:~$ 

# python3コマンドでバージョンを確認する
ubuntuuser@DESKTOP-AC9R8UJ:~$ python3 -V
Python 3.8.5
ubuntuuser@DESKTOP-AC9R8UJ:~$ 

必要なパッケージのインストール&確認

python-pip
pythonのパッケージ管理システムであるpipをインストールします。

# python3-pipのインストール
ubuntuuser@DESKTOP-AC9R8UJ:~$ sudo apt install python3-pip
Reading package lists... Done
Building dependency tree       
Reading state information... Done
~略~
ubuntuuser@DESKTOP-AC9R8UJ:~$ 

# pip3のバージョン確認
ubuntuuser@DESKTOP-AC9R8UJ:~$ pip3 --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
ubuntuuser@DESKTOP-AC9R8UJ:~$ 

② git
あとでgitコマンドを使うため、インストールします。

# gitのインストール(入ってました)
ubuntuuser@DESKTOP-AC9R8UJ:~$ sudo apt-get install git
Reading package lists... Done
Building dependency tree       
Reading state information... Done
~略~

# gitのバージョン確認
ubuntuuser@DESKTOP-AC9R8UJ:~$ git --version
git version 2.25.1
ubuntuuser@DESKTOP-AC9R8UJ:~$ 

AWS IoT Device SDK
ホームディレクトリに移動し、AWS IoT Device SDKとサンプルアプリケーションをインストール&ダウンロードします。

# ホームディレクトリに移動
ubuntuuser@DESKTOP-AC9R8UJ:~$ cd
ubuntuuser@DESKTOP-AC9R8UJ:~$ pwd
/home/ubuntuuser

# awsiotsdkのインストール
ubuntuuser@DESKTOP-AC9R8UJ:~$ python3 -m pip install awsiotsdk
~略~

# AWS SDK for Python v2のリポジトリをクローン
ubuntuuser@DESKTOP-AC9R8UJ:~$ git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git
~略~

# ホームディレクトリ配下にaws-iot-device-sdk-python-v2ディレクトリがクローンされた  
ubuntuuser@DESKTOP-AC9R8UJ:~$ ls -l
total 8
drwxr-xr-x 11 ubuntuuser ubuntuuser 4096 Jun 23 14:54 aws-iot-device-sdk-python-v2
ubuntuuser@DESKTOP-AC9R8UJ:~$ 

サンプルスクリプトの実行準備

aws-iot-device-sdk-python-v2ディレクトリ内にあるサンプルスクリプトを実行するための設定を行います。

クライアント証明書、秘密鍵の配置

IoTモノを登録した時に作成しダウンロードしたクライアント証明書(~.pem.crt)と秘密鍵(~.private.pem.key)をWSL上に配置します(公開鍵は不要)。配置する場所はサンプルスクリプトの作り上、ホームディレクトリ配下に作成したcertsディレクトリです。

# certsディレクトリ作成
ubuntuuser@DESKTOP-AC9R8UJ:~$ mkdir certs

# certsディレクトリがあることを確認  
ubuntuuser@DESKTOP-AC9R8UJ:~$ ls -l
total 8
drwxr-xr-x 11 ubuntuuser ubuntuuser 4096 Jun 23 14:54 aws-iot-device-sdk-python-v2
drwxr-xr-x  2 ubuntuuser ubuntuuser 4096 Jun 23 15:04 certs
ubuntuuser@DESKTOP-AC9R8UJ:~$ 

WindowsからWSLにアクセスするには、ファイル名を指定して実行(Windowsキー + r )かエクスプローラのアドレスバーで「\wsl$」と入力・実行します。
[ home ] - [ <ユーザ名> ] - [ certs ] と進み、証明書(~.pem.crt)と秘密鍵(~.private.pem.key)を置きます。

AWSルートCA証明書の配置

AWSのルートCA証明書はIoTモノを登録して作成したクライアント証明書などをダウンロードする画面で以下のURLリンクが表示されます。
サーバー認証 - AWS IoT Core

このサイトの真ん中くらいに「Amazon Root CA 1」のリンクを押すと間違えたかなと思うような文字列が表示されますが、これをコピーしてテキストに保存する必要があります。
f:id:bftnagoya:20210624140653p:plain:w550
f:id:bftnagoya:20210624141126p:plain:w400

メモ帳、サクラエディタVisual Studio Codeなどのテキストエディタに内容を貼り付け、Amazon-root-CA-1.pem」という名前で保存してください。

保存したファイルは先ほどのクライアント証明書、秘密鍵を配置した/home/<ユーザ名>/certsディレクトリに移動しておきます。

エンドポイントの確認

エンドポイント、とは送信先ととらえればOKです。AWSの管理画面で確認ができます。
[ AWS IoT Core ] - [ 設定 ] に表示されているエンドポイントの文字列をコピーしてください。次のコマンドで使用します。
f:id:bftnagoya:20210624153301p:plain:w550

サンプルアプリケーションの実行

ディレクトリ構成はこのようになっています。
f:id:bftnagoya:20210624144103p:plain:w550

pubsub.pyを実行するためにディレクトリを移動します(必須ではないですが記載したコマンドを実行するために移動)。

# 現在地確認  
ubuntuuser@DESKTOP-AC9R8UJ:~$ pwd
/home/ubuntuuser

# サンプルアプリケーションのあるディレクトリに移動  
ubuntuuser@DESKTOP-AC9R8UJ:~$ cd aws-iot-device-sdk-python-v2/samples/
ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$ 

# 実行する「pubsub.py」があることを確認
ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$ ls -l
total 92
-rw-r--r-- 1 ubuntuuser ubuntuuser 17933 Jun 23 14:54 README.md
-rw-r--r-- 1 ubuntuuser ubuntuuser  5388 Jun 23 14:54 basic_discovery.py
-rw-r--r-- 1 ubuntuuser ubuntuuser 17259 Jun 23 14:54 fleetprovisioning.py
-rw-r--r-- 1 ubuntuuser ubuntuuser  2878 Jun 23 14:54 ipc_greengrass.py
-rw-r--r-- 1 ubuntuuser ubuntuuser 13767 Jun 23 14:54 jobs.py
-rw-r--r-- 1 ubuntuuser ubuntuuser  8060 Jun 23 14:54 pubsub.py
-rw-r--r-- 1 ubuntuuser ubuntuuser 16285 Jun 23 14:54 shadow.py
ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$

# 実行する
ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$ python3 pubsub.py --endpoint XXXX-ats.iot.ap-northeast-1.amazonaws.com --root-ca ~/certs/Amazon-root-CA-1.pem --cert ~/certs/XXXX-certificate.pem.crt --key ~/certs/XXXX-private.pem.key
AWS libcrypto resolve: searching process and loaded modules
AWS libcrypto resolve: found static aws-lc HMAC symbols
AWS libcrypto resolve: found static aws-lc libcrypto 1.1.1 EVP_MD symbols
Connecting to a38ctv0lrxyc9e-ats.iot.ap-northeast-1.amazonaws.com with client ID 'test-9d95c17e-4fd7-4d05-89e0-2d27448453d6'...
Connected!
Subscribing to topic 'test/topic'...
Subscribed with QoS.AT_LEAST_ONCE
Sending 10 message(s)
Publishing message to topic 'test/topic': Hello World! [1]
Received message from topic 'test/topic': b'Hello World! [1]'
Publishing message to topic 'test/topic': Hello World! [2]
Received message from topic 'test/topic': b'Hello World! [2]'
Publishing message to topic 'test/topic': Hello World! [3]
Received message from topic 'test/topic': b'Hello World! [3]'
Publishing message to topic 'test/topic': Hello World! [4]
Received message from topic 'test/topic': b'Hello World! [4]'
Publishing message to topic 'test/topic': Hello World! [5]
Received message from topic 'test/topic': b'Hello World! [5]'
Publishing message to topic 'test/topic': Hello World! [6]
Received message from topic 'test/topic': b'Hello World! [6]'
Publishing message to topic 'test/topic': Hello World! [7]
Received message from topic 'test/topic': b'Hello World! [7]'
Publishing message to topic 'test/topic': Hello World! [8]
Received message from topic 'test/topic': b'Hello World! [8]'
Publishing message to topic 'test/topic': Hello World! [9]
Received message from topic 'test/topic': b'Hello World! [9]'
Publishing message to topic 'test/topic': Hello World! [10]
Received message from topic 'test/topic': b'Hello World! [10]'
10 message(s) received.
Disconnecting...
Disconnected!
ubuntuuser@DESKTOP-AC9R8UJ:~/aws-iot-device-sdk-python-v2/samples$

test/topicというトピックに向けて10回「Hello World!」とPublish(送信)してReceive(サブスクライブ、受信)もしていることがわかります。

クラウド側でテストとしてtest/topicをサブスクライブして確認することもできます。指定された形式で表示できないエラーとなってはいますが、「Hello World!」を10回受信しています。
f:id:bftnagoya:20210624151056p:plain:w550

終わりに

サンプルアプリケーションを通して動きの部分や認証について学ぶことができました。ありがたい限りです。
これで作成したプログラムを実行できる環境が整いましたので、次回はプログラムを実行してみようと思います。

ここまで読んでいただきありがとうございました~ ^ ^