AWS IoTのCLIツール AWS IoT ELF でThingのダミーを簡単に扱う
ども、大瀧です。 AWSより、AWS IoTをExtremely Low Friction(ELF)に扱うCLIツール、AWS IoT ELFが公開されました。
AWS IoT ELFとは
AWS IoT ELFは、AWS IoTのThingを簡単に扱うためのPythonスクリプトで、CLIライクに利用することができます。現時点では、以下の機能があります。
- ダミーのThingを複数作成する
- ダミーのThingからトピックへのメッセージ送信
- ダミーのThingの一括削除
AWS IoTのThingの作成/削除にはクライアント証明書の発行と紐付けが付いて回るので、CLIで一気に実行できるのが便利ですね。
セットアップ
- 動作確認環境
- OS : Mac OS X El Capitan
- Python : バージョン 2.7.10
- Virtualenv : 13.0.3
今回は、GitHubのREADMEに従い、Virtualenv環境にセットアップしました。AWSのクレデンシャルはAWS CLIの設定を読みに行ってくれるので、~/.aws/credentials
ファイルを事前に設定しておきましょう。GitHubのリポジトリをcloneし、Virutalenvの一般的なセットアップ手順を踏襲します。
$ git clone https://github.com/awslabs/aws-iot-elf.git Cloning into 'aws-iot-elf'... remote: Counting objects: 166, done. remote: Total 166 (delta 0), reused 0 (delta 0), pack-reused 166 Receiving objects: 100% (166/166), 33.29 KiB | 0 bytes/s, done. Resolving deltas: 100% (97/97), done. Checking connectivity... done. $ cd aws-iot-elf/ $ virtualenv venv New python executable in venv/bin/python2.7 Also creating executable in venv/bin/python Installing setuptools, pip, wheel...done. $ source venv/bin/activate (venv)$ pip install -r requirements.txt You are using pip version 7.0.3, however version 8.1.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command. Collecting boto3==1.3.1 (from -r requirements.txt (line 1)) Using cached boto3-1.3.1-py2.py3-none-any.whl Collecting botocore==1.4.24 (from -r requirements.txt (line 2)) Using cached botocore-1.4.24-py2.py3-none-any.whl Collecting docutils==0.12 (from -r requirements.txt (line 3)) Collecting futures==3.0.5 (from -r requirements.txt (line 4)) Using cached futures-3.0.5-py2-none-any.whl Collecting jmespath==0.9.0 (from -r requirements.txt (line 5)) Using cached jmespath-0.9.0-py2.py3-none-any.whl Collecting paho-mqtt==1.1 (from -r requirements.txt (line 6)) Collecting python-dateutil==2.5.3 (from -r requirements.txt (line 7)) Using cached python_dateutil-2.5.3-py2.py3-none-any.whl Collecting six==1.10.0 (from -r requirements.txt (line 8)) Using cached six-1.10.0-py2.py3-none-any.whl Installing collected packages: futures, jmespath, six, python-dateutil, docutils, botocore, boto3, paho-mqtt Successfully installed boto3-1.3.1 botocore-1.4.24 docutils-0.12 futures-3.0.5 jmespath-0.9.0 paho-mqtt-1.1 python-dateutil-2.5.3 six-1.10.0 (venv)$
あとは、MQTTSのクライアント認証のためにrootCAファイルをダウンロードしておきます。
(venv)$ curl -o aws-iot-rootCA.crt https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1758 100 1758 0 0 9332 0 --:--:-- --:--:-- --:--:-- 9351
これでOKです。スクリプトはpython
インタプリタの引数に指定し、オプションとサブコマンドを付与して実行します。何も付与しないと、以下のようにヘルプが表示されます。
(venv)$ python elf.py usage: elf.py [-h] [--region REGION] [--profile PROFILE_NAME] {create,send,clean} ... elf.py: error: too few arguments
使い方
では、AWS IoT ELFを使ってみましょう。AWS CLIと同じく--region
オプションでAWSリージョンを指定することに注意します。
Thingと証明書の一括作成
まずは、create
サブコマンドでThingを一括作成します。引数に作成するThing数(今回は10)を指定し、実行します。
(venv)$ python elf.py --region ap-northeast-1 create 10 2016-06-08 01:48:08,548:iot-elf:INFO - Wrote ELF ID to config: urn:uuid:eaa0bbb4-2a2f-40a9-9578-596c4b963906 2016-06-08 01:48:08,645:iot-elf:INFO - [create_things] ELF creating 10 things 2016-06-08 01:48:09,540:iot-elf:INFO - Thing:'thing_0' associated with cert:'arn:aws:iot:ap-northeast-1:123456789012:cert/7d322e792094869b2bfe30cabf95c9e4baa43c5b62cdeb754854cb5ea9ae43c8' 2016-06-08 01:48:09,541:iot-elf:INFO - Thing Name: thing_0 and PEM file: /Users/ryuta/Repos/aws-iot-elf/misc/thing_0.pem 2016-06-08 01:48:09,541:iot-elf:INFO - Thing Name: thing_0 Public Key File: /Users/ryuta/Repos/aws-iot-elf/misc/thing_0.pub 2016-06-08 01:48:09,542:iot-elf:INFO - Thing Name: thing_0 Private Key File: /Users/ryuta/Repos/aws-iot-elf/misc/thing_0.prv 2016-06-08 01:48:09,543:iot-elf:INFO - Wrote 1 things to config file: /Users/ryuta/Repos/aws-iot-elf/misc/things.json : 2016-06-08 01:48:13,746:iot-elf:INFO - Thing:'thing_9' associated with cert:'arn:aws:iot:ap-northeast-1:123456789012:cert/01467a287b8feecb8cd5e2a7648d3fc4c3112ed632e33ed7acffbf148e5a6c8a' 2016-06-08 01:48:13,747:iot-elf:INFO - Thing Name: thing_9 and PEM file: /Users/ryuta/Repos/aws-iot-elf/misc/thing_9.pem 2016-06-08 01:48:13,748:iot-elf:INFO - Thing Name: thing_9 Public Key File: /Users/ryuta/Repos/aws-iot-elf/misc/thing_9.pub 2016-06-08 01:48:13,748:iot-elf:INFO - Thing Name: thing_9 Private Key File: /Users/ryuta/Repos/aws-iot-elf/misc/thing_9.prv 2016-06-08 01:48:13,751:iot-elf:INFO - Wrote 10 things to config file: /Users/ryuta/Repos/aws-iot-elf/misc/things.json 2016-06-08 01:48:13,751:iot-elf:INFO - [create_things] ELF created 10 things in region:'ap-northeast-1'. (venv)$
コマンドの出力から、misc/
ディレクトリ以下に各Thingのクライアント証明書一式が保存されているのがわかりますね。AWS Management ConsoleのAWS IoTの画面を確認してみると...
thing_<番号>というThingと対応する証明書が10セット作成されていることが確認できます。
メッセージのPublish
続いて、Thingからトピックへのメッセージ送信をサブコマンドsend
で実行します。
(venv)$ python elf.py --region ap-northeast-1 send 2016-06-08 01:58:18,473:iot-elf:INFO - Read ELF ID from config: 73a68220-c580-4e96-b4fd-556153ce5359 2016-06-08 01:58:18,557:iot-elf:INFO - [send_messages] ELF sending:'IoT ELF Hello' on topic:'elf' for:10 secs 2016-06-08 01:58:19,030:iot-elf:INFO - ELF connecting asynchronously to IoT endpoint:'XXXXXXXXXXXXX.iot.ap-northeast-1.amazonaws.com' 2016-06-08 01:58:20,819:iot-elf:INFO - ELF connecting asynchronously to IoT endpoint:'XXXXXXXXXXXXX.iot.ap-northeast-1.amazonaws.com' 2016-06-08 01:58:20,990:iot-elf:INFO - [on_connect] thing_0: Connected with result: 0 2016-06-08 01:58:21,040:iot-elf:INFO - ELF thing_0 posting message:'{'msg': 'IoT ELF Hello', 'ts': '1465351101.04'}' on topic: elf/thing_0 2016-06-08 01:58:22,045:iot-elf:INFO - ELF thing_0 posting message:'{'msg': 'IoT ELF Hello', 'ts': '1465351102.05'}' on topic: elf/thing_0 : (venv)$
デフォルトでは、全Thingから非同期にトピックelf/<Thing名>
宛てにIoT ELF Hello
というメッセージを10回送出します。オプションでトピックやメッセージは調節できるので、同じトピックに複数のThingからメッセージを送るなど、様々なデバッグに対応できそうです。Management ConsoleのMQTT Client画面でもPublishされたメッセージを確認できます。
Thingと証明書の一括削除
最後に、clean
サブコマンドでcreate
で作成したThingと証明書を削除します。
(venv)$ python elf.py --region ap-northeast-1 clean 2016-06-08 02:11:25,951:iot-elf:INFO - Read ELF ID from config: 73a68220-c580-4e96-b4fd-556153ce5359 2016-06-08 02:11:25,951:iot-elf:INFO - [clean_up] ELF is cleaning up... 2016-06-08 02:11:28,093:iot-elf:INFO - [clean_up] Cleaned things, policies, & certs for:thing_0 2016-06-08 02:11:29,628:iot-elf:INFO - [clean_up] Cleaned things, policies, & certs for:thing_1 2016-06-08 02:11:31,035:iot-elf:INFO - [clean_up] Cleaned things, policies, & certs for:thing_2 2016-06-08 02:11:32,458:iot-elf:INFO - [clean_up] Cleaned things, policies, & certs for:thing_3 : 2016-06-08 02:11:40,988:iot-elf:INFO - [clean_up] ELF has completed cleaning up in region:ap-northeast-1 (venv)$
Management Consoleの画面でもまっさらになっていることが確認できます。
従来だと、証明書、ポリシー、Thingにそれぞれ依存関係があり画面上でのリソース削除が非常に面倒だったので、一括削除してくれるのはとても便利に感じました。AWS IoT ELF配下のリソースはローカルのJSONファイルで管理されているので、関係無いリソースを誤って削除する恐れもありません。
まとめ
AWS IoTのダミーのThingを扱うCLIツール、AWS IoT ELFをご紹介しました。開発/デバッグ用に便利に活用できるツールだと思います。list
サブコマンドで配下のリソースが一覧表示できると、さらに良いですね。