20150908 jaws ug-chiba_lt

  • View
    2.395

  • Download
    3

  • Category

    Software

Preview:

Citation preview

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.

御清聴ありがとうございました。