AWS IoTのCLIツール AWS IoT ELF でThingのダミーを簡単に扱う

2016.06.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。 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の画面を確認してみると...

aws-iot-elf01

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されたメッセージを確認できます。

aws-iot-elf02

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の画面でもまっさらになっていることが確認できます。

aws-iot-elf03

従来だと、証明書、ポリシー、Thingにそれぞれ依存関係があり画面上でのリソース削除が非常に面倒だったので、一括削除してくれるのはとても便利に感じました。AWS IoT ELF配下のリソースはローカルのJSONファイルで管理されているので、関係無いリソースを誤って削除する恐れもありません。

まとめ

AWS IoTのダミーのThingを扱うCLIツール、AWS IoT ELFをご紹介しました。開発/デバッグ用に便利に活用できるツールだと思います。listサブコマンドで配下のリソースが一覧表示できると、さらに良いですね。