AWS IoT ハンズオン ~基本編~¶
イントロダクション¶
ハンズオンシナリオ¶
シナリオ1: センサーデータの送信
EdisonからAWS IoTのトピックに照度センサーのデータを送信し、AWS IoTでルールに基づきNoSQLデータベースDynamoDBへの保存を行います。また、しきい値を下回った場合、E-mailでアラートを送信するようにルールを設定します。本ハンズオンにより、センサーからのデータ取得および時系列データの保存、しきい値に対するアクションの手順を確認することができます。
シナリオ2: アプリケーションからLEDをリモート制御
WebアプリケーションからEdisonに接続されたLEDの点灯/消灯の操作を行います。EdisonはAWS IoTのShadowのMQTTトピックをSubscribeしており、アプリケーションはShadowにコマンドを送信することでEdison側ではリアルタイムにコマンドを受信することができます。
利用するデバイス、アプリケーション、サービス¶
インテルEdison
- インテル社が提供する開発用のシングルボードコンピュータです。本ハンズオンではセンサーからのデータ取得、AWS IoTへのデータ送信に利用します。
- http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html
Groveスターターキット
- Aruduinoなどの開発用ボードに接続可能なセンサーやケーブルが同梱されたキット。本ハンズオンではスターターキットの中のセンサーを選んでIntel Edisonに接続し、センサーデータを取得します。
- http://www.seeedstudio.com/document/Grove%20Starter%20Kit.pdf http://www.seeedstudio.com/wiki/GROVE_System
AWSアカウント
AWSコマンドラインでiotおよびiot-dataを実行できるようにご利用のPCの設定をお願いします。 インストールの手順はこちらのとおりです。
AWS IoT
- 接続されたデバイスが安全かつ簡単にクラウドアプリケーションやその他のデバイスとやりとりするためのマネージド型プラットフォームです。本ハンズオンではデバイスからのデータ受信、デバイスのリモート制御などで利用します。
- https://aws.amazon.com/jp/iot/
Amazon DynamoDB
マネージド型のNoSQLサービスで、高速で予測可能なパフォーマンスとシームレスな拡張性が特長です。本ハンズオンでは照度センサーで測定したデータを格納する時系列データベースとして利用します。
Amazon CloudWatch
AWSクラウドリソースとAWSで実行するアプリケーションのモニタリングサービスです。メトリクスの収集、ログファイルの収集が可能です。本ハンズオンではCloudWatch Logsを利用してAWS IoTのログを収集、閲覧します。
インテルEdisonの設定¶
インテルEdisonの準備を行います。
センサーの接続¶
Grove Kitの中から照度センサーとLED、LCDを取出してください。
照度センサーはこちらです。(LIGHTと書いてあります)
LEDは組み立て式となります。袋からLEDを取り出してボードに装着します。ピンが長い方が+となります。
LCDはこちらです。
次に、Arduino互換ボードをEdisonに装着します。(Arduino互換ボードの図)
Arduino互換ボードにセンサーとLED、LCDを接続します。以下のように接続してください。
ポート | 設定 |
---|---|
A0 | 照度センサー |
D8 | LED |
I2C | LCD |
シリアルポート接続¶
Edisonへ接続します。まず、Edisonにシリアルポート経由で接続します。USBケーブルでPCとEdisonを接続し、シリアルコンソールを開きます。
Windowsの場合
USBケーブルとACアダプタを図のように接続してください。
MacOSの場合
USBケーブル2本を図のように接続してください。
ターミナルソフトでEdisonに接続してください。接続に必要な情報はこちらです。特にBaud Rateにご注意ください!
設定 | 設定項目 |
---|---|
Port | Edisonが接続されているUSBポート(Macであれば/dev/cu.usbserial-xxxx[FTDI]) |
Baud Rate | 115200 |
Data Bits | 8 |
Stop Bits | 1 |
Parity | none |
Teratermをご利用の場合、メニューの[設定]-[シリアルポート]からスピードを”115200”に変更するのを忘れないでください。
MacOSをご利用の場合は、ターミナルから以下のコマンドを入力することで接続が可能です。
$ sudo screen /dev/tty.usbserial-XXXXXXX 115200
または、
$ sudo cu -s 115200 -l /dev/tty.usbserial-XXXXXXX
Password: ← Macのユーザパスワードを入力
プロンプトが表示されれば接続成功です。loginのプロンプトで、ユーザ名”root”、パスワード”Password1”でログインしてください。
edison login: root
Password: ******** ←パスワードを入力
root@edison1: ~#
WiFi設定¶
WiFiの設定を行います。ログイン後、configure_edison –wifi コマンドでSSIDとパスワードの設定を実施してください。
root@edison1: ~# configure_edison --wifi
Configre Edison: WiFi Connection
Scanning: 8 seconds left..
1. Exit WiFi setup
2. Manually input a hidden SSID
3. Guest
4. xxxxxxxxx
Enter 0 to rescan for networks.
Enter 1 to exit.
Enter 2 to input a hidden network SSID.
Enter a number between 3 to N to choose one of the listed network SSIDs: ←Guestが表示されている番号を入力
Is Guest corrrect? [Y or N]: ←Yを入力
What is the network password?: ←WiFiのパスワードを入力
Initiating connection to Guest. Please wait...
Attempting to enable network access, please check 'wpa_cli status' after a minute to confirm.
Done. Please connect your laptop or PC to the same network as this device and go to http://x.x.x.x or http://edison.local in your browser.
(Doneが出力されたら成功)
ハンズオン準備¶
ハンズオンを始めるにあたり、事前の準備設定を行います。AWSマネージメン トコンソールにログインし、東京リージョン を選択してください。
ハンズオン用CloudFormationのスタック作成¶
ハンズオンで利用するIAMユーザ、DynamoDBテーブルを作成を自動化するために、CloudFormationのスタックを作成します。IAMユーザはedisonの証明書を作成するための権限を与えるために作成します。また、DynamoDBテーブルはシナリオ1のセンサーデータの保存用のテーブルとなります。
マネージメントコンソールのAWSサービスで”CloudFormation”と入力しCloudFormationを選択します。
“Choose a template”から”Specify an Amazon S3 template URL”にチェックを入れ、以下のパスを入力し、[Next]をクリックします。
https://s3-ap-northeast-1.amazonaws.com/awsiot-handson-jp/awsiothandson.template
“Stack Name”と”DynamoDBTableName”、”IAMUserName”に以下の値を入力し、 [Next]をクリックします。 (一つのAWSアカウントの複数のIAMユーザがいる場合、<任意の番号>は他のユー ザと被らないように設定してください)
項目 | 設定 |
---|---|
Stack Name | awsiot-handson-stack<任意の番号> |
DynamoDBTableName | awsiot-handson-table<任意の番号> |
IAMUserName | awsiot-handson-user<任意の番号> |
“Options”で何も入力せずに[Next]をクリックします。
“Resource”の画面を下にスクロールし、”Capabilities”で”I acknowledge that this template...”にチェックを入れ、[Create]をクリックします。
Cloud Formationのスタックの一覧に自分が作成したスタックが表示されるのを確認します。Statusは”CREATE_IN_PROGRESS”から”CREATE_COMPLETE”になるのを確認します。
画面下の”Output”タブをクリックし、AccessKeyとSecretKeyが表示されていることを確認し、こちらの内容をメモ帳などにコピーしてください。
Edison用サンプルコードの準備¶
ハンズオンで利用するEdison用のサンプルコードのダウンロード、初期設定を行います。
Edison上で以下のコマンドを実行し、サンプルコードのダウンロード、zipファイルの解凍を行います。
root@edison:~# wget https://s3-ap-northeast-1.amazonaws.com/awsiot-handson-jp/awsiot-handson-fundamentals.zip
root@edison:~# unzip -q awsiot-handson-fundamentals.zip
証明書を取得するためのスクリプトの設定を行います。解凍したサンプルコードのawsiot-handson-fundamentals/certsディレクトリに移動し、config.jsonの先ほどコピーしたCloudFormationのOutputのAccessKey/SecretKeyを入力します。
root@edison:~# cd awsiot-handson-fundamentals/certs
root@edison:~/awsiot-handson-fundamentals/certs# vi config.json
{
"accessKeyId": "<your access key>", ←<your access key>にAccessKeyを入力
"secretAccessKey": "<your secret key>", ←<your secret key>にSecretKeyを入力
"region": "ap-northeast-1"
}
証明書作成のスクリプトを実行します。certsディレクトリにはすでにプライ ベートキー(privatekey.pem)とCSR(cert.csr)が存在しており、CSRの内容を元 に証明書を作成しています。出力されるcertificateIdの英数字文字列をメモ 帳にコピーしてください。次章のAWS IoTの設定の中で証明書を特定するため に利用します。 他のIAMユーザが作成した証明書が特定できなくなってしま う恐れがあるため、必ずメモを取得してください
root@edison:~/awsiot-handson-fundamentals/certs# node create_cert.js
~
{ certificateArn: 'arn:aws:iot:ap-northeast-1:xxxxxxxxxxxxxx:cert/<英数字文字列>',
certificateId: '<英数字文字列>',
~
証明書ファイル(cert.pem)がcertsディレクトリ内に存在することを確認します。
root@edison:~/awsiot-handson-fundamentals/certs# ls
cert.csr config.json node_modules rootca.crt
cert.pem create_cert.js privatekey.pem
AWS IoT基本設定¶
デバイスの作成¶
AWSマネージメントコンソールへログインし、画面右上のメニューから東京リージョンを選択します。 AWSサービスから”IoT”と入力し、”AWS IoT”を選択します。
dashboard画面が表示される場合は左側のメニューのRegistry内のThingsをクリックします。
デバイス(Thing)を作成します。[Create]をクリックします。
Nameに”edison<任意の番号>”と入力し、[Create thing]をクリックします。 (デバイス名を他のIAMユーザと被らないように任意の番号を付与します。)
リソースの一覧で作成したデバイスが表示されます。[←]でThings画面に戻ります。
ポリシーの作成¶
デバイスに対して、AWS IoTの各種操作を許可するためのポリシーを作成しま す。メニューのSecurity内のPoliciesを選択し[Create]をクリックします。
フォームにそれぞれ以下のパラメータを入力し、[Create]をクリックします。 policy名は他のIAMユーザと被らないように任意の番号を付与してください。
項目 | 値 |
---|---|
Name | awsiot-handson-policy<任意の番号> |
Action | iot:* |
Resource |
|
作成したポリシーが表示されます。[←]でPolicies画面に戻ります。
先ほど作成した証明書をポリシーに割当てます。メニューのSecurity内のCertificatesをクリックしてしてリスト中の証明書の右下のチェックボックスをチェックし、[Actions]-[Attach policy]をクリックしてください。(3章で証明書を作成したときのcertificateIdの証明書をリソースから選択してください。)
“Attach policies to certificate(s)”の画面で、先ほど作成したポリシーを選択し、[Attach]をクリックします。
次に、デバイスと証明書の関連付けを行います。[Actions]-[Attach thing] をクリックします。
“Attach things to certificate(s)”画面でデバイスを選択し、[Attach]をクリックします。
センサーデータの送信¶
Intel Edisonに接続された照度センサーのデータをAWSの各サービスにストアします。 EdisonはAWS IoTのトピックにデータをパブリッシュし、AWS IoTでルールに基づきDynamoDBへ保存します。使用するDynamoDBのテーブル”awsiot-handson-rawdata”は「3.ハンズオン準備」で作成したCloud Formationのスタックに含まれています。
センサーデータは以下のJSONフォーマットとします。
{
"timestamp": "2015-10-24T14:16:37.305Z", ←ISO8601形式
"value": "300" ←アナログ値
}
AWS IoT ルールの作成¶
メニューのRulesをクリックし[Create]をクリックします。
スクリーンショットの赤枠で囲んだ部分について、以下の項目を入力します。 任意の番号の部分は他のユーザと被らない数字を入力してください。
設定項目 | 値 |
---|---|
Name | SaveToDynamoDB<任意の番号> |
SQL Version | 2016-03-23 |
Description | 任意 |
Attribute | *(アスタリスク) |
Topic Filter | edison/illuminance<任意の番号> |
[Add action]をクリックし、”Select an action”から”Insert a message into a DynamoDB table”を選択し、[Configure action]をクリックします。
以下の値を入力します。
設定項目 | 値 |
---|---|
Table Name | awsiot-handson-table<任意の番号> |
Hash Key Value | ${topic(2)} |
Range Key Value | ${timestamp()} |
Write message data to this column | value |
AWS IoTからDynamoDBへデータをPutするためのRoleを作成します。 “Choose or create a role to grant AWS IoT access to the DynamoDB resource to perform this action.”で[Create a new role]をクリックし、ロール名として”AWSIoTHandsonDynamoDB”と入力し、再度[Create a new role]をクリックします。 これによって入力したロール名が選択できるようになるので、作成したロールを選択し、[Upate role]をクリックし、次に[Add action]をクリックします。
“DynamoDB Action”が追加されたことを確認したら、[Create rule]をクリックします。
ルールが作成されたことを確認します。
プログラムの実行¶
照度センサーから照度データを取得し、AWS IoTのメッセージブローカーへ送信するためのプログラムを実行します。サンプルプログラム内のawsiot-handson-fundamentals配下のsensorに移動し、プログラムを実行します。
root@edison:~awsiot-handson-fundamentals/sensor# node main.js edison/illuminance<任意の番号>
Publish: {"timestamp":"2015-10-24T14:16:37.305Z","value":268}
Publish: {"timestamp":"2015-10-24T14:16:38.365Z","value":268}
Publish: {"timestamp":"2015-10-24T14:16:39.424Z","value":271}
Publish: {"timestamp":"2015-10-24T14:16:40.484Z","value":270}
Publish: {"timestamp":"2015-10-24T14:16:41.535Z","value":272}
DynamoDBのテーブルを確認し、データが格納されていることを確認してくださ い。マネージメントコンソールのトップ画面に戻り、DynamoDBを選択します。 画面左のメニューの”Tables”をクリックし、テーブル一覧から “awsiot-handson-table<任意の番号>”をクリックします。メイン画面上部の “Item”タブをクリックし、テーブルのデータを表示します。
LEDのリモート制御¶
AWS CLIを実行し、Intel Edisonに接続されたLEDのON/OFFを行います。AWS IoTのShadowを利用してブラウザからEdisonのステータスの変更リクエストを送信し、Edisonは変更通知を元にLEDをOFF/ONします。また、完了後は最新のステータスをShadowにアップデートします。
プログラムの実行¶
Edison上で以下のプログラムを実行します。
root@edison:~# cd ~/awsiot-handson-fundamentals/led
root@edison:~/awsiot-handson-fundamentals/led# node main.js edison<任意の番号>
マネージメントコンソールのAWS IoTを開き、メニューの”Registry” > “things” をクリックし、”edison<任 意の番号>”をクリックします。
左のメニュー画面から”Shadow”をクリックし、”Shadow document”の”Edit”をクリックして編集モードにします。
”Shadow state:”に以下のJSONを入力してください。入力が終わったら”Save”をクリックします。クリック後、EdisonのLEDが点灯することを確認してください。
{
"reported": {
"led": "off"
},
"desired": {
"led": "on"
}
}
“desired”内にある”led”アイテムの値をoff/onのように記述を変更することでLEDの消灯/点灯を行なうことができます。
その他の設定(オプション)¶
CloudWatch Logsの設定¶
AWS IoTのログはCloudWatch Logsで取得可能です。 詳細な手順はこちらに掲載されています。
http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/cloud-watch-logs.html
まず、メニュー画面から”Identity & Access Management”をクリックし、IAMの設定画面を表示します。画面左のメニューから”Roles”をクリックし、[Create New Role]をクリックします。
“Role Name”にロール名を入力し、[Next Step]をクリックします。
“Select Role Type”で”AWS IoT”の[Select]をクリックします。
“Attach Policy”で”AWSIoTLogging”のビルトインポリシーにチェックを入れ、[Next Step]をクリックします。
内容を確認します。次の手順のコマンドラインでARNが必要になるため、”Role ARN”の文字列をコピーしておきます。問題なければ[Create Role]をクリックしてください。
以下のaws cliコマンドを実行し、aws iotに作成したロールを割当てます。(以下のコマンドをコピーするとダブルクオーテーションが文字化けする場合がありますのでご注意ください。)
aws iot set-logging-options --region ap-northeast-1 --logging-options-payload roleArn=”arn:aws:iam::<your-aws-account-num>:role/awsiotlogging”,logLevel=”INFO”
マネージメントコンソールのサービスメニューから”CloudWatch”をクリックし、左メニューの[Logs]をクリックします。
一覧の”Log Groups”から”AWSIotLogs”が表示されていることを確認します。
AWSIotLogsをクリックし、”Log Streams”にログのエントリが存在することを確認します。それぞれのLog Streamsをクリックすることで、ログを閲覧することができます。
証明書の作成¶
本ハンズオンではあらかじめプライベートキーとCSR(Certificate Signing Request)を作成し、そちらを元に証明書を取得しています。プライベート鍵とCSRを作成する手順は以下のとおりです。
以下のopensslコマンドでプライベートキーを作成します。
$ openssl genrsa -out privatekey.pem 2048
Generating RSA private key, 2048 bit long modulus
................................................................................+++
..........+++e is 65537 (0x10001)
次に、作成したプライベートキーを元にCSRを作成します。
$ openssl req -new -key privatekey.pem -out cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Meguro
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Amazon Web Services Japan K.K.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
ハンズオン終了後¶
ハンズオン終了後には以下の設定を削除してください。
AWS IoTのリソース削除¶
AWS IoTの証明書、ポリシー、デバイスを削除するためには、削除前にアタッチされているリソースをデタッチする必要があります。(ルールは他のリソースとの関連性はありません)
- マネージメントコンソールのサービスから[AWS IoT]を選択します。
- 削除したい証明書を選択します。
- 関連付けられているデバイスを選択し、[Detach]をクリックします。
- 同様にポリシーもデタッチします。
- 削除したいリソースを選択し、”Actions”のメニューから”Delete”を選択します。
CloudFormationスタックの削除¶
- マネージメントコンソールのサービス一覧から[CloudFormation]をクリックします。
- リストから”AWSIoTHandsonStack”のスタックを選択し、”Actions”から[Delete Stack]をクリックします。
AWS IoT Device SDK解説¶
本ハンズオンで利用したサンプルコードを元に、AWS IoT Device SDKの解説をします。
シナリオ1の解説¶
シナリオ1ではTopic(edison/illuminance)向けに照度センサーのデータをMQTTを利用してPublishします。
まず、証明書のパスを指定し、プライベート鍵、証明書、ルート証明書のパスを指定します。
1 2 3 4 5 6 7 | var device = awsIot.device({
keyPath: '../certs/privatekey.pem',
certPath: '../certs/cert.pem',
caPath: '../certs/rootca.crt',
clientId: 'eison_pub_client',
region: 'ap-northeast-1'
});
|
メッセージブローカに接続します。1秒ごとにループを回し、照度センサーからのデータ取得、メッセージの整形、メッセージのPublishを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | device.on('connect', function() {
console.log('Connected to Message Broker.');
setInterval(function() {
// Retrieve sensor data
var value = analogPin0.read();
// Display sensed analog data on LCD
myLCD.setColor(0, 255, 0);
myLCD.setCursor(0,0);
myLCD.write(clearStr);
myLCD.setCursor(0,0);
myLCD.write("DATA: " + value);
// Compose records
var record = {
"timestamp": moment().toISOString(), // ISO8601 format
"value": value
};
// Serialize record to JSON format and publish a message
var message = JSON.stringify(record);
console.log("Publish: " + message);
device.publish(topic, message);
}, 1000);
});
|
シナリオ2の解説¶
シナリオ2ではShadowのdeltaトピックに対しSubscribeおよびupdateトピックに対しPublishを行っています。
まず、証明書のパスを指定し、プライベート鍵、証明書、ルート証明書のパスを指定します。
1 2 3 4 5 6 7 | var thingShadows = awsIot.thingShadow({
keyPath: '/home/root/.node_app_slot/certs/privatekey.pem',
certPath: '/home/root/.node_app_slot/certs/cert.pem',
caPath: '/home/root/.node_app_slot/certs/rootca.crt',
clientId: 'edison_shadow_client',
region: 'ap-northeast-1'
});
|
メッセージブローカに接続します。
1 2 3 4 5 6 | thingShadows
.on('connect', function() {
console.log('connected to awsiot.');
thingShadows.register('edison');
clientTokenUpdate = thingShadows.update('edison', defaultState);
});
|
ステータスを監視します。
1 2 3 4 | thingShadows
.on('status', function(thingName, stat, clientToken, stateObject) {
console.log('received ' + stat + ' on ' + thingName + ': ' + JSON.stringify(stateObject));
});
|
アプリケーションからdesiredステータスのアップデートがあった場合、deltaのトピックにメッセージがpublishされます。deltaをsubscribeすることで変更をリアルタイムに受信します。
1 2 3 4 5 | thingShadows
.on('delta', function(thingName, stateObject) {
console.log('received delta '+' on ' + thingName + ': ' + JSON.stringify(stateObject));
updatedState = {"state":{"reported":{"led": ""}}};
});
|
ステータスをチェックし、デバイス内でそれぞれのステータスに応じた処理を実行します。
1 2 3 4 5 6 7 8 9 | if (stateObject.state.led == 'on') {
//ONの処理(LED点灯)
} else {
//OFFの処理(LED消灯)
}
|
本書はAWS IoTおよびAWSの各サービスを利用してIoTの基本的なシステムを構築するためのハンズオン手順 について記述しております。
最新情報¶
-AWS IoTの説明資料を公開しました。 http://bit.ly/1SrHtGf
前提条件¶
- インテルEdisonまたはRaspberry Piなどの機器で開発経験がある方
- IoTを活用したアプリケーション構築をご検討されているデベロッパーの方
- AWSクラウドを活用したシステム・アプリケーション開発に従事されている方
- UNIXの基本的なコマンドの利用経験がある方
注意事項¶
- AWSのサービス利用料金は受講者の方にご負担いただきますよう、ご了承ください。
- ハンズオンに必要な機材は貸出品となりますので、終了後は必ず返却をお願いします。
サンプルプログラム¶
本ハンズオンで利用するサンプルプログラムです。Edison上で利用します。
https://s3-ap-northeast-1.amazonaws.com/awsiot-handson-jp/awsiot-handson-fundamentals.zip
ハッシュタグ¶
Twitterのハッシュタグはこちらになります。 #AWS_IoT_JP
\ Sort by:\ best rated\ newest\ oldest\
\\
Add a comment\ (markup):
\``code``
, \ code blocks:::
and an indented block after blank line