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.
御清聴ありがとうございました。

20150908 jaws ug-chiba_lt