AWS IoT
AWS IoT Core ではデバイスをクラウドや他のデバイスに簡単に接続できます。AWS IoT Core では、断続的な接続を許容し、デバイスのコードフットプリントを削減し、必要なネットワーク帯域幅を削減するよう特別に設計された HTTP、WebSocket、MQTT といった軽量の通信プロトコルをサポートしています。また、AWS IoT Core では他の業界標準およびカスタムプロトコルをサポートしており、別のプロトコルを使用しているデバイス間でも相互に通信できます。
料金
接続料金: 0.096USD (接続 100 万分あたり)
メッセージ 10 億件まで: 1.20USD (メッセージ 100 万件あたり)
トリガーされたルール: 0.18USD (トリガーされたルール 100 万件あたり/実行されたアクション 100 万件あたり)
実行されたアクション: 0.18USD (トリガーされたルール 100 万件あたり/実行されたアクション 100 万件あたり)
AWS IoT Core と接続して、メッセージを送り、Lambda 等実行すればそれぞれに料金が発生するイメージか
各項目とも100万件あたり~とあるように小規模で運用する場合はほぼ数ドルで済む
IoT Core の開始
モノの登録
単一のモノを作成します
モノと AWS IoT Core を接続させる認証鍵を作成します
作成した有効化し証明書はダウンロードしておく
ルートCA「RSA 2048 ビットキー: Amazon ルート CA 1」のみ下記からダウンロード
サーバー認証 - サーバー認証用の CA 証明書
モノにポリシー、IAMのようなアクセス権限を設定する
作成してないので無く、ここから作成出来ないのでサイドメニューの「安全性」から作成する
テストなのでかなり自由な権限を与える
作成したポリシーはモノに設定した証明書と紐付ける
これで AWS IoT Core 側の初期設定は完了
デバイスの設定
Raspberry Pi で AWS IoT SDKを使用する
SDKのインストール
AWS IoT SDK - AWS IoT Device SDK for Python
SDKは C か c++ か Java か Javascript か Python がある JS版を入れてみる
$ sudo apt-get install -y nodejs npm
$ git clone https://github.com/aws/aws-iot-device-sdk-python.git
$ cd aws-iot-device-sdk-js/
$ npm install
サンプルアプリケーションの実行
IoT Core と通信するための 必要情報を確認する
AWS リージョン
ap-northeast-1クライアントID
IoT モノの名前と同じユーザーのプライベートキー
/home/pi/aws-iot-device-sdk-js/certs/private.pem.key
証明書
/home/pi/aws-iot-device-sdk-js/certs/certificate.pem.crt
ルートCA
/home/pi/aws-iot-device-sdk-js/certs/Amazon-root-CA-1.pem
AWS IoT エンドポイント
AWS IoT メッセージブローカーがリッスンするポート
8883IoT モノの名前
AWS IoT に登録したときに使用した名前
AWS SDK に用意されているサンプルを実行してみる
$ cd aws-iot-device-sdk-js/examples
$ node device-example -k "../certs/private.pem.key" -c "../certs/certificate.pem.crt" -i "vIoT-study" -a "../certs/Amazon-root-CA-1.pem" -H "************.iot.ap-northeast-1.amazonaws.com" -p 8883 -T "vIoT-study" --test-mode 1
connect
デバイスは1台しか無いので相互メッセージの通信は確認できないが、
コンソール上で確認してみると接続が出来ていることを確認できる
エッジコンピュータのゲートウェイ側はこんな感じでつながってるのね
AWS IoT Core にメッセージを送る
AWS IoT Core 側で MQTT トピックを作成
適当なプッシュを作り
// AWS IoT SDK
const awsIot = require('../aws-iot-device-sdk-js')
// AWS IoT Core 認証情報
const device = awsIot.device({
region: 'ap-northeast-1',
clientId: 'vIoT-study',
keyPath: 'certs/private.pem.key',
certPath: 'certs/certificate.pem.crt',
caPath: 'certs/Amazon-root-CA-1.pem',
host: '**************.iot.ap-northeast-1.amazonaws.com',
});
// 接続
device.on('connect', function() {
console.log('connect');
setInterval( function() {
device.publish('study_topic1', JSON.stringify({ value: 'hogehoge' }));
}, 5000);
});
実行すると
$ node push.js
トピック側にメッセージが来ていることを確認できる
ルールの作成
AWS IoT - AWS Lambda ルールを作成する
メッセージを送った際に AWS IoT Core で Lambda をキックさせる
Lambda関数を作成し
ルールを作成する
ルールのクエリーステートメントはどの Topic に対してこのルールを適用するかを定義している
IoT 機器毎に処理を分けたい場合は Topic 名で分ける
Topic 名で分けるだけなら SQL である必要が無い気がするので、細かい条件処理をすることもできるってことなのかな?
ルールによってアクションできるサービスは現在下記
- DynamoDB テーブルにメッセージを挿入する
- DynamoDBv2 データベーステーブルの複数列にメッセージを分割する
- Lambda関数を呼び出す
- SNS通知
- SQSキューにメッセージを送る
- Kinesis ストリームにメッセージを送信
- IoT トピックにメッセージを再パブリッシュ
- S3 バケットにメッセージを格納
- Kinesis Firehose ストリームメッセージを送信
- CloudWatchにメッセージを送信
- CloudWatchアラームの状態を変更
- Elasticsearch にメッセージを送信
- Salseforce IoT 入力ストリームにメッセージを送信
- IoT Analytics にメッセージ送信
- IoT Events 入力いメッセージ送信
- Step Function ステートマシンの実行を開始する
テストなのでエラー処理は入れていない
以上でルールを作成完了
AWS IoT + Lambda 連携確認
連携だけであれば AWS IoT の画面だけでテストできる
lambda コード
受け取ったメッセージを Googlehungout Chat に送る
// modules
const request = require('request');
// function
exports.handler = function(event, context) {
let message = event.message;
let options = {
url: process.env['hungoutChat'],
method: 'POST',
headers: 'Content-Type : application/json',
json: {
"text": message
}
};
console.log(message);
request(options, function(error, response, body){
console.log(body);
});
};
アクションにて設定した Topic に対して メッセージをサブスクライブ
無事 Lamdba も動いて 送信したメッセージ内容が Google Hungout Chat に通知された