fbpx

AWS と Azure と Raspberry Pi (ラズパイ) で IoT してみた (2) #raspi #aws #azure

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

こんにちは!まだまだフレッシュなエンジニアの星野です。前回の記事は読んでいただけましたでしょうか?
Raspberry Pi(以下「ラズパイ」)を使ってアマゾン ウェブ サービス(以下「AWS」)と Microsoft Azure(以下「Azure」)上に同じようなセンサーデータを溜める仕組みを作って比較するということで、前回はデバイスのセットアップが中心でした。
今回は AWS にセンサーデータを貯めるまでを行います。

はじめに

本記事では AWS IoT と DynamoDB の設定から導通確認まで行います。
各サービスのリージョンは東京(ap-northeast-1)で行い、AWS IoT は新しいコンソールを利用する前提で進行します。
AWS のアカウントを用意したら早速設定していきましょう!

DynamoDB の設定

AWS にサインインしたらサービスメニューからデータベースの DynamoDB を見つけてください。
DynamoDB に移動したら「テーブルの作成」ボタンを押します。


dynamoDB テーブル作成

1.センサーデータを溜めるテーブル名とプライマリーキーを入力します。

「ソートキーの追加」にチェックをいれます。

テーブル名 sensordata
プライマリーキー device_id
ソートキー timestamp

2.「デフォルトの設定を使用」のチェックをはずしキャパシティを設定します。

dynamoDB テーブル作成2

読み込み容量ユニット 1
書き込み容量ユニット 1

3.「作成」ボタンを押します。

DynamoDB の設定はひとまずここまでです。

キャパシティ小話

デフォルトだとどちらも 5 になっていますが、毎分数回程度の書き込みであれば 1 で十分であり価格もかなり抑えられます。
* 書き込み容量ユニット 1 は、秒間 1 kB の書き込みができるキャパシティ
* 最終的にデバイスが送るデータは約 400 Byte / 件 のため、1 ユニットで毎秒 2.5 件程度の書き込みが可能

参考リンク
* 各キーの設定についてはこちらをご覧ください
テーブル操作のガイドライン
* キャパシティについてはこちらをご覧ください
プロビジョニングされたスループット

AWS IoT の設定

サービスメニューから AWS IoT を選択してください。

AWS IoT

次に左のメニューから「Connect」を選択して「Configuring a device」の「Get started」を選択します。

プラットフォームから「Linux/OSX」を選択します。

AWS IoT 2

SDK は Python を選択して次のステップに移ります。

AWS IoT に接続するための手順

  1. デバイスの登録

    Thing は AWS 上で物理デバイスを管理するための仕組みです。
  2. 接続キットのダウンロード

    接続キットには AWS セキュリティ認証情報や SDK、サンプルコードなどが含まれています。
  3. デバイスの設定とテスト
    
接続キットをデバイスに転送して AWS IoT に正しく接続できることをテストします。

「Get started」ボタンを押して次に進みましょう。

Step 1 - デバイスの登録


AWS IoT 4

Thing 名を入力して次のステップに進みましょう。
ここで付けた名前を元にポリシーが作成されます。

Step 2 - 接続キットのダウンロード


ポリシーと Certificate の設定が作られました。
ポリシーの設定は「Preview policy」を押すと確認できます。

AWS IoT 5

接続キットをダウンロードします。
ダウンロードすると次のステップに進めるようになるので「Next Step」ボタンを押します。

Step 3 - デバイスの設定とテスト

ダウンロードした接続キットをラズパイに転送します。

$ scp ~/connect_device_package.zip pi@xxx.xxx.xxx.xxx:~/

ラズパイに ssh で接続し、画面の手順に沿って進めます。

AWS IoT 6

接続キットを解凍して、パーミッションを変更してサンプルコードを実行してください。

$ unzip connect_device_package.zip
$ sudo chmod +x start.sh
$ ./start.sh

SDK のインストール等が始まります。

Downloading AWS IoT Root CA certificate from Symantec...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1758 100 1758 0 0 4871 0 --:--:-- --:--:-- --:--:-- 4869
Installing AWS SDK...
.
.
.

うまくいくと AWS IoT の画面上でメッセージの確認ができたと思います。

AWS IoT 6

今度は AWS IoT の画面からラズパイにメッセージを送ってみましょう。
「Step 4: Send a message to the device」の下の入力欄に「Hello」とメッセージを入れて「Send message」ボタンを押してみました。どうでしょうか?

AWS IoT 8

うまく受信できてました!!!ちょっと感動しますね。
確認できたら「Done」を押します。ちなみにメッセージは日本語でも大丈夫でした。
これでデバイスと AWS IoT 間の導通確認ができたので、次はデバイスから送られてきたデータを AWS IoT から DynamoDB に渡すための設定をします。

ルールの設定

左メニューから「Rules」を選択します。
「Create a rule」ボタンを押したらルールの名前を入力します。

AWS IoT 9

Name insert_sensordata_into_ddb

※ Rule engine の名前にハイフンが使えないため、アンダースコアで区切っています。

Message source の設定

SELECT * FROM 'iot/device/sensordata'

Attribute *
Topic filter iot/device/sensordata

アクションの設定

「Add action」ボタンを押してこの Rule に合致した場合のアクションを設定します。

AWS IoT 10

一覧から「Split message into multiple columns of a database table (DynamoDBv2)」をチェックして「Configure action」ボタンを押します。

AWS IoT 11

Table name のリストボックスから最初に作った DynamoDB のテーブル名「sensordata」を選択します。
IAM role name のリストボックスから既にあるロールを選ぶか新規に作ることができます。
ここでは「Create a new role」を選択し、新しくロールを作ることにします。

AWS IoT 12

ロールを作ったら「Add action」ボタンを押して「Create rule」を押します。
これでルールができたので確認してみましょう。

AWS IoT から DynamoDB への導通確認

左メニューから「Test」を選択します。

AWS IoT 13

Publish のテキスト入力欄にルールで指定したトピック「iot/device/sensordata」を入力します。
次にメッセージを修正します。

{
"device_id": "testid",
"timestamp": "testtime",
"data": "testdata"
}

AWS IoT 14

「Publish to topic」を押してテストします。

サービスメニューから DynamoDB に移動してテストしたデータが入っているかテーブルを確認します。
保存されていれば以下のことが保障されます。

  • 使用した Topic に対して、Policy と Rule が適切に作用していること
  • 使用した Message の構造に対して DynamoDB のキーが適切に設定されていること

これでデバイスから AWS IoT、AWS IoT から DynamoDB 間の導通確認ができました。
それではデバイスからセンサーデータを送信して DynamoDB にデータを溜めるようにしてみましょう!

センサーデータをデバイスから AWS に送信する

送信プログラムをデバイス上に展開する

git clone するか、送信プログラムをダウンロードしてください。
https://github.com/s-hoshino/cllab-device-client.git

接続キットの時と同様に、ラズパイのホームディレクトリにファイルを展開して以下のような構造になるように配置します。

/home/pi
|--.cert.pem
|--.private.key
|--.root-CA.pem
|--lib
| |--__init__.py
| |--util.py
| |--dht11
| | |--dht11_example.py
| | |--dht11.py
|--LICENSE
|--README.md
|--requirement.txt
|--sendtoaws.py
|--send_to_aws.service
|--send_to_aws.sh
|--settings.py

配置できたら pip で必要なライブラリをインストールします。

$ sudo pip install -r requirement.txt

ソース内の send_to_aws.service を /etc/systemd/system/ にコピーします。

$ sudo mv send_to_aws.service /etc/systemd/system

プログラムの実行

展開したファイルの settings.py 4, 5 行目を編集

3 # AWS 設定
4 AWS_IOT_ENDPOINT = 'YOUR_AWS_IOT_ENDPOINT'
5 AWS_IOT_THING_NAME = 'YOUR_AWS_IOT_THING_NAME'

4 行目に AWS IoT のエンドポイントを記述します (例: 'xxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com')。
sendtoaws.py を実行します。

$ python sendtoaws.py

しばらくすると以下のような感じで出力されます。

MQTT connect.
{
"temperature": 24,
"lux": 48,
"timestamp": "1494469395889",
"humidity": 50,
"verbose_timestamp": "2017-05-11 11:23:15.889+0900",
"id": "device_001"
}
Publish result: OK
{
"temperature": 24,
"lux": 61,
"timestamp": "1494469458632",
"humidity": 48,
"verbose_timestamp": "2017-05-11 11:24:18.632+0900",
"id": "device_001"
}
Publish result: OK
{
"temperature": 24,
"lux": 73,
"timestamp": "1494469519224",
"humidity": 49,
"verbose_timestamp": "2017-05-11 11:25:19.224+0900",
"id": "device_001"
}
Publish result: OK

プログラムがうまく動かない

  • 例外が出て、最後に "socket.gaierror: [Errno -2] Name or service not known" と表示される
    -> AWS IoT のエンドポイント (settings.py の 4行目) が間違っている可能性がある

  • "MQTT Conect." は表示されたが、その後何も表示されない
    -> DHT11 のピン設定 (settings.py の 21行目付近) が間違っている可能性がある

デバイス起動時にプログラムを自動で起動させるための設定

send_to_aws.service をサービスとして登録し、ラズパイ起動時にセンサーデータの送信用プログラムが実行されるようにします。

$ sudo systemctl enable send_to_aws.service
$ sudo systemctl start send_to_aws.service

サービスとして動作している場合はプログラムからの標準出力がコンソール上に表示されないので /var/log/syslog で確認してください。

はい、といった感じでセンサーデータの送信までお付き合いいただきありがとうございました!
今回は細かい工作がないため、また業務で慣れているので終始自分のターンでした。
デバイスからデータ保存まで一気にやらずに、ひとつひとつ確認していくことで不具合があった際の原因の切り分けがしやすくなりますね。
このまましばらくセンサーデータを送信してデータを蓄積してみます。
次回はいよいよ Azure 編に突入です!どんな違いがあるのでしょうか?気になりますね。
Azure 編も引き続きよろしくお願いします!!

新規CTA