札幌の勉強会でAWS IoTから電話をかけてみた
こんにちは、せーのです。先日札幌にて「ユースケースから学ぶアマゾンウェブサービス勉強会&個別相談会」という勉強会が開催されました。
私はそこでAWS IoTの(というかIoTそのものの)基礎についてお話致しました。
概要
概要はざっくりとIoTの基礎とAWS IoTとは、というお話をメインに致しました。まとめますと
- AWS IoTは「AWS」と「IoT」をつなげるもの
- IoTとは単純なデータ収集をデバイスそのものがインターネット上にデータを投げることで自動化する、というもの
- デバイス自体の高性能化によりデバイスにLinuxがそのまま載るようになった。 => 高級言語が使え、敷居が下がった
- 通信の高速化によりセンサーとゲートウェイが無線で繋がるようになった => はんだづけが要らなくなり、敷居が下がった
- 今ではプログラミングができればそのままIoTエンジニアにもなれる時代
- 各種ボード、センサー紹介
というような内容でした。
デモ解説
今回最後にデモとしてAWS IoTから電話をかける、というデモを行いました。本編では時間がなかったこともありそのままさらっと流しましたが、そんなに難しくないので解説しておきます。
アーキテクチャ
アーキテクチャは図の通り、センサーからAWS IoTにリクエストを送り、Lambdaを叩いて、そこからtwilio APIを叩いて電話を鳴らす、というものです。 今回はMQTTの解説も兼ねていたため、実際のセンサーからではなくmacからターミナルを使って送りました。
Lambda Function実装
まずはLambda Functionの実装です。
// Twilio Cred var accountSid = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; var authToken = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'; var client = require('twilio')(accountSid, authToken); var querystring = require('querystring'); exports.handler = function(event, context) { var word = "クラスメソッド勉強会へようこそ"; var twiml = '<Response><Say voice="woman" language="ja-jp">' + word + '</Say></Response>'; client.calls.create({ from: "+811234567890", to: "+811234567890", method: "GET", url: 'http://twimlets.com/echo?Twiml=' + querystring.escape(twiml) }, function(err, call) { if (err) { //console.log(error.message); context.fail(err.message); } context.succeed("OK"); }); }
Lambda Function自体の実装はこのようになります。twilioのモジュールをnpmからインストールし、そこにアカウントSID、Tokenを使ってAPI Keyを叩くと電話がなります。
本番のサービスではTokenやSIDはKMSを使って暗号化させておくのが良いかと思います。
また今回はサービスとして既にあるTwiMLを使ってメッセージを投げました。これもセキュリティポリシーなどと照らしあわせてS3等自前でやっても良いと思います。
twilioのモジュールをインストールしているので、まとめてzip化してLambda Functionにアップロードしておきます。
AWS IoT実装
AWS IoTはRule Engineに上で実装したLambdaをつなげます。動作確認用にS3のActionもつけておきます。後はいつも通りThingsを登録し、証明書をダウンロードします。この証明書をデバイス側にセットすれば準備完了です。
デバイス(mac)側実装
デバイス(として動作させたmac)側はmosquittoをインストールして、証明書を引数にMQTT_PublicすればOKです。
mosquitto_pub \ --cafile rootCA.pem \ --cert 1234567890-certificate.pem.crt \ --key 1234567890-private.pem.key \ -h 1234567890.iot.ap-northeast-1.amazonaws.com \ -p 8883 \ -q 1 \ -d \ -t awsiotdemo/sapporo \ -i clientid \ -m '"test"'
ポイントはRoot証明書を落としておくことと、送信文字をクォーテーションで囲うことです。クォーテーションで囲んでいないとLambdaに入った時に引数エラーになってしまうので注意しましょう。
まとめ
いかがでしたでしょうか。まとめてみるととても簡単な仕組みで電話を鳴らすことができることがおわかりかと思います。
勉強会に参加された方も、そうでない方も参考になさって頂ければ幸いです。