メタラーまとんがハイソにやらかすようです

東大理系修士卒エンジニアのハイソサイエティ(上流階級)な日常

AWS IoTをWSL(Windows Subsystem for Linux)のUbuntuで動かしてみた!

ども!まとんです。

Windowsを使っているけど、LinuxAWS IoTを動かしたい!という人のために、Windows10のWSLでUbuntuを立ち上げて、PyhonでAWS IoTと通信する方法をメモします。

まず、今作りたいもの

「ボタンを押したらソレノイドが動くおもちゃ」を作りたいです。

今回はAWSの練習を兼ねているので、AWSを介して通信する仕組みを実装します。

f:id:highso:20190310213744p:plain

想定しているアーキテクチャ

SORACOMの「あのボタン」を押すと、AWS上でLambdaが走って、AWS IoTからMQTTをPublishします。

ソレノイドを駆動するArduinoは通信機能を持たないので、WiFiモジュールとセットになった評価基板が売られているESP32で代用し、iPhoneテザリングでインターネットに繋げます。

ESP32にAWS IoTの証明書を保存しておけば、これでセキュアに通信できるはず。

f:id:highso:20190224143744j:plain
f:id:highso:20190224215137j:plain
SORACOMボタンとソレノイド+Arduino

進捗

f:id:highso:20190310213819p:plain

青の部分は既に実装できました。(この記事の最後にリンクを貼っておきます)

今回はAWS IoTの部分を作ります。

Windows Subsystem for Linux(WSL)とは?

Windows10の機能で、Windows上でUbuntuの端末を操作できます。

数年前までは「Bash on Windows(BoW)」と呼ばれていましたが、2017年10月17日の正式版からWSLに名前が統一されました。

何が嬉しいって、WindowsユーザーでもLinux環境が手に入ります!!

WindowsユーザーがLinux環境を使おうと思うと、従来は

パーティションを分けてLinuxデュアルブートする

Windows上で仮想マシンLinuxを立ち上げる

あきらめてMacを買う

などがありましたが、どれも苦しかったです(環境構築が大変・動作が重い・金がかかる・ポリシーに反する、など)。

しかしWSLは、Windowsストアでダウンロードできる標準ソフトです。

導入がめちゃくちゃ簡単です!

色々な説明サイトがありますが、僕はこのサイトを参考にしてUbuntuを入れました。

qiita.com

環境

・Ubunsu 18.04.2 LTS (WSL)

Python 3.6.7

AWS IoT

AWS IoT Device SDK for Python

Ubuntuの環境構築

WSLでUbuntuが立ち上がったら、まず各種アップデートをします。

sudoのパスワードはWindowsのパスワードと同じです。

$sudo apt update
$sudo apt upgrade

なお、WSLのUbuntuを開くと、Windowsユーザー名でログインすることになります。

別のユーザーでログインしたい場合(例えばrootなど)は、コマンドプロンプトで下記実行します。

ubuntu config --default-user <ログインするユーザー名>

WSL その123 - デフォルトのユーザーを変更するには・ディストリビューションをクリーンな状態に戻すには - kledgeb

なお、$sudo suも使えるので、rootでログインする必要はありません。

僕はWindowsのユーザー名が実名で恥ずかしかったので、ログイン名を「maton」に変えました。

気にならない人は、そのままでいいと思います。

Pythonをインストール

Python3とpipをインストールします。(ここらへんうろ覚えなので、他にもやることあったかも)

$sudo apt install python3

$sudo apt install python3-pip

$python3 --version

Python 3.6.7

pipをアップデートします。

$sudo pip3 instal --upgrade pip
$sudo pip3 --version
pip 19.0.3 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

あと他にも必要なものを入れておきます。

$sudo apt install unzip

$sudo apt install git

$sudo apt update

$sudo apt upgrade

AWS IoTでデバイス登録

AWS IoTは、インターネットでのセキュア通信を担保するため、証明書などの一式をzipでダウンロードできるという優れた機能があります。

ここらへん、自分で実装するのは果てしなくめんどくさいので、非常に助かります!

 

AWSコンソールにログインして、ダッシュボードの「ソリューションの構築」から「IoTデバイスを登録する」を開きます。

ダッシュボードに無い場合は、「AWS IoT」→「オンボード」→デバイスの設定「開始方法」)

下記登録していきます。

プラットフォームの選択:Linux/OSX

AWS IoTデバイスSDKの選択:Python

名前:highso-thing

「接続キットのダウンロード」で、「connect_device_package.zip」をWindowsのどこかにダウンロードします。今回はDesktopにダウンロードしました。

このzipの中に、AWS IoTと接続するための証明書などが含まれています。

Ubuntu(WSL)にzipをコピー

Ubuntu(WSL)のディレクトリの実態は、Windowsの奥深い特殊なディレクトリにあり、Windowsから直接触るのは非推奨とされています。

ファイルシステムが異なるので、下手にいじるとファイルが破損する恐れがある)

Ubuntu(WSL)からWindowsを見ると、/mntがrootディレクトリに見えています。

例えばCドライブは/mnt/cです。

そこで、Ubuntuを開いて、先ほどダウンロードしたzipをcpコマンドでコピーします。

$cd /home/maton
$mkdir AWS-IoT
$cp /mnt/c/Users/<UserName>/Desktop/connect_device_package.zip /home/maton/AWS-IoT/
$cd AWS-IoT

(matonはUbuntuのユーザー名、<UserName>はWindowsのユーザー名です。適宜変更してください。)

AWS IoT接続キットを実行して接続テスト

基本的にはAWS画面上に表示されているコマンドを打っていけばよいのですが、すこし詰まったので詳細に説明します。

1. zipを解凍

$unzip connect_device_package.zip

2. 実行権限を付与

$sudo chmod +x start.sh

ここまでは問題ないです。

3. 開始スクリプトを実行

$sudo ./start.sh

ここで色々とエラーが起きました。

エラーメッセージ

Running pub/sub sample application...
Traceback (most recent call last):
File "aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py", line 18, in <module>
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
ImportError: No module named AWSIoTPythonSDK.MQTTLib 

AWSIoTPythonSDKなるモジュールが見つからないと。確かに、インスト―ルした記憶が無い。

ここで、start.shは気が利いていて、モジュールをgit cloneで同ディレクトリにダウンロードしてくれていました。

なので、モジュールをインストールするだけ。

$cd aws-iot-device-sdk-python
$chmod +x setup.py
$sudo python3 ./setup.py install

このsetup.pyを実行するだけでインストールされる。これは便利!AWS先生、気が利くぅ!

で、もっかい実行。

$sudo ./start.sh

しかし、まだエラーがでる。

どうやら、この環境のpythonは「python3」なのに、スクリプトでは「python」になっていることが原因のようだ。

start.shを直接変更。

$vim start.sh

-python setup.py install

+python3 setup.py install

-python aws-iot-device-sdk-python/samples~~~~

+python3 aws-iot-device-sdk-python/samples~~~~

vimは、「i」を押すと編集モード。「ESC」を押してコマンドモードにした後、「:wq」エンターで上書き保存)

よく考えたら、最初からこれをやっておけばエラーは吐かなかったと思う。

改めて、

 $sudo ./start.sh

これで通った!AWSのブラウザ上に1秒ごとにメッセージが表示されればOKです。

AWS上で動作確認

AWS IoTのMQTTが疎通していることを確認する方法を説明します。

Publishの確認

start.shは1秒ごとにトピック名「sdk/test/Python」にメッセージをPublishしています。

AWS IoT Core」→「テスト」→「トピックへサブスクライブする」

「トピックのサブスクリプション」に「sdk/test/Python」と入れて「トピックへのサブスクリプション」を押すと、start.shからのメッセージをブラウザ上で受信確認できます。

f:id:highso:20190310234520p:plain

左:AWS IoT画面、右:Ubuntu端末

これはTopic名「HighsoTopic」での疎通確認の様子。

なお、SORACOMのボタンはAWS 1-clickを使いますが、AWS 1-clickはオレゴンにしかないので、リージョンはオレゴンを選んでいます。

Subscribeの確認

start.shはメッセージのSubscribeもしています。

AWS IoT Core」→「テスト」→「トピックへの発行」

フォームに「sdk/test/Python」と入れて、下のエディタで「"message": "Hello from AWS IoT console"」のHello以下を好きな文言に変えて、「トピックに発行」ボタン

すると、Ubuntuのstart.sh上に、メッセージが瞬時に届きます。

Topic名の変更

MQTTプロトコルは、好きなTopic名でメッセージを送受信できるのが特徴です。

MQTTにおけるTopic名とは「雑誌の名前」のようなものです。

出版社(Publisher)は雑誌AをTopic名「A」でPublish(出版)し、雑誌Aを読みたい人(Subscriber)は、Topic名「A」をSubscribe(購読)します。

Publishされた雑誌を本棚に並べて、好きな時にSubscribeさせてあげる本屋さん(Broker)が通信の仲介をします。

AWS IoT CoreはBrokerのマネージドサービスです。

 

デフォルトのstart.shを流用して、Topic名を変更する方法を説明します。

start.shは、「basicPubSub.py」というPythonのテストスクリプトを実行しています。

basicPubSub.pyのオプションで「-t <トピック名>」を付ければ、任意のトピックで送ることができます。(デフォルトでTopicは「sdk/test/Python」になっています)

basicPubSub.pyの中身を直接変更してもよいですが、start.shを変更する方法で説明します。

$vim start.sh

python3 aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e ~~~~~の最後に「-t HighsoTopic」を追加

これでstart.shを実行すると、トピック名「HighsoTopic」で送信します。

しかし、これだけでは不十分でした。

ポリシーの変更

デフォルトのセキュリティ設定では「sdk/tet/Python」トピックのみが許可されています。

その他のトピックも許可するポリシーを設定をします。

AWS IoT Core」→「安全性」→「ポリシー」

名前を付けたThingのPolicyを選択(今回は「highso-thing-Policy」)

「ポリシードキュメントの編集」

"Resource": [
"arn:aws:iot:us-west-2:~~~:topic/*",(この行を追加)
"arn:aws:iot:us-west-2:~~~:topic/sdk/test/java",
"arn:aws:iot:us-west-2:~~~:topic/sdk/test/Python",
"arn:aws:iot:us-west-2:~~~:topic/topic_1",
"arn:aws:iot:us-west-2:~~~:topic/topic_2"
]

 

"Resource": [
"arn:aws:iot:us-west-2:~~~:topicfilter/*",(この行を追加)
"arn:aws:iot:us-west-2:~~~:topicfilter/sdk/test/java",
"arn:aws:iot:us-west-2:~~~:topicfilter/sdk/test/Python",
"arn:aws:iot:us-west-2:~~~:topicfilter/topic_1",
"arn:aws:iot:us-west-2:~~~:topicfilter/topic_2"
]

~~~は自分のものに併せて適宜修正してください。

これで好きなトピック名が使えるようになりました!

いかがでしたか?

今回やったことは下記です。

  • Windows10にUbuntu環境をWSLで構築
  • UbuntuにPython3をインストール
  • AWS IoTで接続キットをダウンロードしてUbuntuで適用
  • 接続キットのテストコード(start.sh)で疎通確認
  • トピック名を変更して疎通確認

トピック名変更については、調べても情報があまりなかったので、参考になる方は多いのではないかなと思います。

 

みなさんも是非、楽しいAWSライフを!!

そして僕は、ソリューションアーキテクトを目指します。

以上、メタラーまとんでした。

ではでは。

「ハイソボタンを押すとソレノイドが動くおもちゃ」の関連記事

 「ハイソボタン」の実装

highso.hatenablog.com

「ソレノイド」の実装

highso.hatenablog.com