Copyright © HANDS LAB INC. All rights reserved.
2015年9月8日
JAWS-UG 千葉 第五回 ラズパイからセンサーデータをAPI Gateway+Lambdaに送るよ
ハンズラボ株式会社
1
自己紹介
名前 今井 智明 所属 ハンズラボ株式会社 2013年4月より東急ハンズのIT部門を子会社化 担当 AWSでのインフラ構築、運用、 iOSアプリケーション開発、運用
l JAWS-UG 千葉と聞いて、千葉出身なので来ました。 l 千葉県千葉市中央区星久喜町生まれ
l 小学校から大学までずーっと千葉市内でした。 l 星久喜小学校 l 星久喜中学校 l 千葉南高校 l 神田外語大学(神田って名前だけど美浜区にある)
l 千葉県民のみなさまよろしくお願いします。 2
なぜここにいるのか
3
本日お話すること
1. ラズパイの話
2. AWS側の話
3. まとめ
4
本日お話すること
1. ラズパイの話
2. AWS側の話
3. まとめ
l 正式名称はRaspberry Pi l 85.60 mm × 56.5 mmの小型コンピュータ l Linuxがふつうに動く l ネットワークに繋がる l USB、HDMIなどいろいろ l センサーを繋げられる
5
ラズパイとは
l ハンズラボにはIoT部がある l ハードウェア好き、DIY好きの集まり? l 入部するとラズパイを買ってもらえる
l 面白そうなので入る l 本当にラズパイ買ってもらう(゚д゚)ウマー l 温度、湿度、光センサーを買ってもらう(゚д゚)ウマー l 買ってもらったからには使ってみる l どうせならAWSと組み合わせる
6
ラズパイを触る経緯
l センサーを繋げてデータを取る l ラズパイにはデジタルセンサーしか繋げられない l ラズパイと一緒に買ったセンサーはアナログorz l Arduinoと組み合わせると使えるらしい l ラズパイ+Aruduinoの構成になる
l センサーデータをAWSに送って可視化する l 当初はAWSCLIを使おうと思ってた l API Gateway+Lambdaが出てきたので方針変更 l DyamoDB Stream+Lambdaもおもしろそう 7
ラズパイでやろうと思ったこと
8
構成図
AWS cloud 会社
DynamoDB Raspberry Pi Lambda API Gateway
Sensor
Arduino
DynamoDB Steams
Lambda CloudWatch Custom Metrics
l ラズパイを動かす l SDカード買う l Raspbianをダウンロード&インストールする l USBポートにキーボードとマウスを接続する l HDMIポートにモニターを接続する l Etherポートに有線LANを接続する l 起動する(microUSBを繋ぐ) l IPが取れたらあとはSSH
9
ステップ1/9
l Arduinoでセンサーを動かす l Arduinoにセンサー設置 l MacとArduinoをUSB接続 l Arduinoのコードを書いてデプロイする l 動作確認する
10
ステップ2/9
温度・湿度計
光度計 Arduino
11
ステップ2のつづき
l 取得したセンサーデータ
l ラズパイでArduinoからデータ受け取る l ラズパイとArduinoをシリアル接続(USB) l Arduinoがシリアルデバイスに出力するようにする l ラズパイがシリアルデバイスから読み取る
12
ステップ3/9
l Arduinoが出力するタイミングが合わなかった l 960ミリ秒ごとに出力する必要があった
13
ステップ3ではまったこと1
void setup() { Serial.begin(9600); while (!Serial) { } } void loop() { Serial.println("46.00 27.00 657"); delay(960); // ここをてきとーに1000にしてたら出なかった }
l awkを通すと出力されない l Debian系はmawkってやつらしい l mawkの場合オプションと関数が必要だった
14
ステップ3ではまったこと2
// ダメ $ cat /dev/ttyACM0 | awk ’{print $0}’ # 沈黙 // キタコレ $ cat /dev/ttyACM0 | awk -W interactive '{print $0; fflush()}’ 46.00 27.00 657 46.00 27.00 657
l Arduinoの出力する改行コードがCRLFだった l awkでおかしくなった(viで開いて^Mに気づいた)
15
ステップ3ではまったこと3
// ダメ $ cat /dev/ttyACM0 | awk 'NF==3{print "{ \"humidity\":\"" $1 "\", \"temparature\":\"" $2 "\", \"light\":\"" $3 "\"}” }’ "}"humidity":"46.00", "temparature":"27.00", "light":"657 // キタコレ $ cat /dev/ttyACM0 | awk -W interactive '{sub(/\r$/, ""); print $0; fflush()}' | awk -W interactive 'NF==3{print "{ \"humidity\":\"" $1 "\", \"temparature\":\"" $2 "\", \"light\":\"" $3 "\"}"; fflush() }' | { “humidity":"46.00", "temparature":"27.00", "light":"657” }
16
本日お話すること
1. ラズパイの話
2. AWS側の話
3. まとめ
l AWS側の構成を作る l DynamoDB作る(Stream設定込) l DynamoDBを更新するLambdaを作る l Lambdaを叩くAPI Gatewayを作る l CloudWatchを更新するLambdaを作る l DynamoDBStreamとLambdaを紐付ける
l どうせならAWSCLIで作る l API GatewayはGUIで妥協した
17
ステップ4/9
l DynamoDBのテーブル作る
18
ステップ4の詳細
$ cat dynamodb_sensor_table.json # 抜粋 { "TableName": "Sensor", "KeySchema": [ {"KeyType": "HASH”, "AttributeName": "clientIdHash”}, {"KeyType": "RANGE”, "AttributeName": "timestamp”}], "StreamSpecification": { "StreamEnabled": true, "StreamViewType": "NEW_AND_OLD_IMAGES” } } $ aws dynamodb create-table --cli-input-json file://dynamodb_sensor_table.json
l DynamoDBを更新するLambdaを作る(抜粋)
19
ステップ4の詳細
var params = {}; params.TableName = "Sensor"; params.Item = { clientIdHash: clientIdHash, timestamp: timestamp, clientId: clientId, humidity: humidity, temparature: temparature, light: light }; dynamo.putItem(params, callback);
l API Gateway作る l API作成 l リソース作成 l メソッド作成(POSTメソッド) l APIキー設定(なんとなく) l デプロイ l http://docs.aws.amazon.com/ja_jp/apigateway/
latest/developerguide/getting-started-intro.html
20
ステップ4の詳細
l ラズパイからAPI Gatewayを試しにたたく l curlでたたける(AWSCLIより軽い!)
21
ステップ5/9
$ curl -H "Content-Type: application/json" \ -H "x-api-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \ -X POST -d '{}' https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/prod/data
l ラズパイからセンサーデータを送る
22
ステップ6/9
$ cat /dev/ttyACM0 | awk -W interactive '{sub(/\r$/, ""); print $0; fflush()}' | awk -W interactive 'NF==3{print "{ \"humidity\":\"" $1 "\", \"temparature\":\"" $2 "\", \"light\":\"" $3 "\"}"; fflush() }' | curl -H "Content-Type: application/json" \ -H "x-api-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \ -X POST -d @- https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/prod/data
l ラズパイからセンサーデータを送る(結果)
23
ステップ6/9
l DynamoDB Stream-LambdaからCloudWatch更新(抜粋)
24
ステップ7/9
var params = { MetricData: [ { MetricName: 'Temparature’, Timestamp: timestamp, Value: temparature }], Namespace: ’RaspberryPiSensor’ }; cloudwatch.putMetricData(params, callback);
l LambdaとDynamoDB Streamのマッピング
25
ステップ8/9
$ event_source_arn="arn:aws:dynamodb:us-west-2:999999999999:table/Sensor/stream/2015-09-03T04:52:40.937" $ function_name=”putSensorMetricData" $ aws lambda create-event-source-mapping --function-name ${function_name} \ --event-source ${event_source_arn} \ --batch-size 1 \ --starting-position TRIM_HORIZON
l CloudWatchで温度を確認する
26
ステップ9/9(ゴール!)
l CloudWatchで光度を確認する
27
ステップ9/9(ゴール!)
l API Gateway 0円
28
気になる費用(5日間程度)1
l Lambda 0円(一ヶ月使い続けると$0.30かかりそう)
29
気になる費用(5日間程度)2
l DynamoDB 0円
30
気になる費用(5日間程度)3
l CloudWatch 0円
31
気になる費用(5日間程度)4
32
本日お話すること
1. ラズパイの話
2. AWS側の話
3. まとめ
33
まとめ
l センサーデータのインフラにAPI Gateway+Lambdaを使うと手早く簡単に構築できる
l 費用は使った分だけ(無料枠で実質無料)
l センサーおもしろい!
l センサーデータの活用方法をまじめに考えよう
求む! ・AWSエンジニア ・iOSエンジニア ・Webエンジニア ハンズラボは積極的に技術者採用中です。
Let's work together!
Copyright © HANDS LAB INC. All rights reserved.
御清聴ありがとうございました。
Recommended