AWS IoTのAmazon Lambdaをつかって、「ボタンを押すとツイートする」を実現してみた

AWS IoTを使って、IoT Buttonを自作してみた-①」の続編として、今度はAmazon Lambdaを使ってTweetしてみたいと思います。折角なので、押したことが分かるようにLEDライトも付けてみます。

Amazon Lambdaとは?
「AWS Lambda を使用すれば、サーバーのプロビジョニングや管理なしでコードを実行できます。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。(Amazonよくある質問より)」とあるように、コード実行をシンプルに行えるAmazon AWSの一つの機能です。

ちなみに、2015.11.24時点で、AWS IoTから使える機能は、 以下だ。

  • Send message as a notification(SNS)※第一回でつかったやつです
  • Insert Message into a code function and execute it(Lambda)※今回使うやつ
  • Insert Message into a database table(DynamoDB)
  • Send message to a real-time data stream(Kinesis)
  • Store the message in a file and store in the cloud(S3)
  • Send the message to a queue in the cloud(SQS)
  • Send the message to a real-time data stream that stores to a bucket(Kinesis Firehose)

実装の手順は、

Ⅰ.Raspberry Piのデバイス作成

  • 電子工作の手順

Ⅱ.Lambdaにて呼び出すプログラムをJavaScriptにて作成

  • Twitterライブラリをインストールする
  • tweetするJavaScriptプログラムを tweet.js というファイル名で作成します
  • S3に上げるためのファイルを準備します

Ⅲ.AWS側の設定(Amazon Lambda)

  • WebブラウザでAmazon SNSの設定画面にアクセスします
  • Lambda Function を作成します

Ⅳ.AWS IoT のルールを作成します

  • ルールを作成します

Ⅴ.Raspberry Piの設定

  • iot_button.sh を書き換える
  • 動作確認

Ⅵ.LEDを点灯させる

Ⅶ.まとめ

Ⅰ.Raspberry Piのデバイス作成

用意したもの

  • Raspberry Pi 2(インストール済み)
  • BUFFALO WIFI(設定済み)
  • ブレッドボード
  • タクトスイッチ× 2
  • LEDライト(赤)
  • 10kΩ抵抗器 × 2
  • ジャンパーワイヤー(オス-メス) × 5
  • ジャンパーワイヤー(オス-オス) × 4

電子工作の手順

  • タクトスイッチはeとf列の1と3・11と13に設置
  • 10kΩ抵抗器(上から茶・黒・オレンジ・金)はブレッドボードのd列3と6・13と16
  • ジャンパーワイヤー赤はRaspberry:3.3v/ブレッドボード: + (プラス)
  • ジャンパーワイヤー青はRaspberry:Ground/ブレッドボード:- (マイナス)
  • ジャンパーワイヤー白はブレッドボードの + (プラス)とa列の1・ブレッドボード: + (プラス)とa列の11
  • ジャンパーワイヤー緑はブレッドボードの + (プラス)とa列の6・ブレッドボード: + (プラス)と:a列の16
  • ジャンパーワイヤー黄はRaspberry:GPIO15/ブレッドボード:b列の3・Raspberry:GPIO25/ブレッドボード:b列の13
  • ジャンパーワイヤー黒はRaspberry:GPIO5/ブレッドボード:c列の20
  • LEDはカソード(足が短い)をブレッドボード:の– (マイナス)とアノード(足が長い)をa列の20

 

01

動作確認は「AWS IoTを使って、IoT Buttonを自作してみた-①」や「AWS IoT Thing ShadowでLEDをつけてみた」を参考にしてください。

 

Ⅱ.Lambdaにて呼び出すプログラムをJavaScriptにて作成

1.Twitterライブラリをインストールする

TwitterのJavaScript用のライブラリをインストールします。

npm install twitter

2.tweetするJavaScriptプログラムを tweet.js というファイル名で作成します

consumer_key や consumer_secret, access_token_key, access_token_secretなどの設定値はTwitterの開発者ツールにて取得します。

var Twitter = require('twitter');

var client = new Twitter({
  consumer_key: 'nsY*******************UiP',
  consumer_secret: 'Rei*******************************************u8a',
  access_token_key: '*********-fsq************************************DGM',
  access_token_secret: '6PL*****************************************g0Eb'
});

exports.handler = function (event, context) {
  var params = {status: event.message};
  client.post('statuses/update', params,  function(error, tweet, response){
    if(error) throw error;
    context.succeed(params.status);
  });
}


3.S3に上げるためのファイルを準備します

tweet フォルダを作成し、1で作成された node_modules フォルダ(twitterフォルダが中に入っています)と2で作成したtweet.jsを同一の階層になるように入れ、zip化します。

 

Ⅲ.AWS側の設定(Amazon Lambda)

今回はボタンが押されたらtweetするため、Amazon Web Serviceマネージメントコンソールにログインし、Lambdaの設定をおこないます。前回と同様にオレゴン(us-west-2)を使用します。

1.WebブラウザでAmazon SNSの設定画面にアクセスします

AWSマネージメントコンソールのサービス一覧にある”Lamda”をクリックします。

2.Lambda Function を作成します

“Create a Lambda function”をクリックします。

02

下記のような画面が表示されますが、そのまま “skip” をクリックします。03

設定を行います。

入力する項目は下記の赤丸が付いている箇所になります。

Lambda function code の Upload a .ZIP file のところでⅡで作ったzipファイルをアップロードします。

入力が終わったら “Next” をクリックします。

 

04

入力した内容を確認し、”Create function” をクリックします。

 

05

下記のような画面が表示され、”successfully created.”と表示されれば、作成完了となります。

06

Ⅳ.AWS IoT のルールを作成します

今回は Certificate や Policy の作成は行いません。「AWS IoTを使って、IoT Buttonを自作してみた-①」にて作成したものを使用します。

1.ルールを作成します

“Name” “Attribute” “Topic Filter”を以下のように入力します( “Rule Query Statement” は自動的に更新されます)。

今回は”Choose an action” に “Lambda” を選択します。

“Function Name” はⅢで作成した “tweet” が選択できるようになるので、選択し “Add Action” ボタンをクリックします。

07

以下のように “Lamda Action” が追加されることを確認し、”Create” ボタンをクリックします。

08

できあがった “iot_tweet” rule は以下のようになっています。

09

 

Ⅴ.Raspberry Piの設定

AWS IoTを使って、IoT Buttonを自作してみた-①」にて作成iot_button.shを書き換えて、tweet機能を追加します。

1.iot_button.sh を書き換える

新たに追加した tweet するボタンの Port やmosquittoの処理を追加すると以下のようになります。

PORT1=15
PORT2=25
MESSAGE="ボタンが押されたよ!"
COMMENT="今日もおつかれさまでした!"

gpio -g mode $PORT1 in
gpio -g mode $PORT2 in

echo "ボタンを押してね!"
while true ; do
  if [ `gpio -g read $PORT1` -eq 1 ] ; then
    echo "mailボタンが押されました!"
    mosquitto_pub --cafile keys/aws-iot-rootCA.crt --cert keys/41df0daa95-certificate.pem.crt --key keys/41df0daa95-private.pem.key -h 'A7WZHYOFSWEOL.iot.us-west-2.amazonaws.com' -p 8883 -q 1 -d -t topic/mysns -i clientid1 -m "{\"message\": \"$MESSAGE\"}"
  fi

  if [ `gpio -g read $PORT2` -eq 1 ] ; then
    echo "tweetボタンが押されました!"
    TIME=`date +%H:%M`
    mosquitto_pub --cafile keys/aws-iot-rootCA.crt --cert keys/41df0daa95-certificate.pem.crt --key keys/41df0daa95-private.pem.key -h 'A7WZHYOFSWEOL.iot.us-west-2.amazonaws.com' -p 8883 -q 1 -d -t topic/myTweet -i clientid2 -m "{\"message\": \"$COMMENT $TIME\"}"
  fi

  sleep 0.1
done

2.動作確認

コマンドラインで iot_button.sh を実行します。

$ bash iot_button.sh

ブレッドボード1〜3に設置したPORT15のタクトスイッチを押してみます。

mailボタンが押されました!
Client clientid1 sending CONNECT
Client clientid1 received CONNACK
Client clientid1 sending PUBLISH (d0, q1, r0, m1, 'topic/mysns', ... (45 bytes))
Client clientid1 received PUBACK (Mid: 1)
Client clientid1 sending DISCONNECT

とコマンドラインに表示され、「AWS IoTを使って、IoT Buttonを自作してみた-①」と同様のメールが届きました。

次に、ブレッドボード11〜13に設置したPORT25のタクトスイッチを押してみます。

tweetボタンが押されました!
Client clientid2 sending CONNECT
Client clientid2 received CONNACK
Client clientid2 sending PUBLISH (d0, q1, r0, m1, 'topic/myTweet', ... (60 bytes))
Client clientid2 received PUBACK (Mid: 1)
Client clientid2 sending DISCONNECT

とコマンドラインに表示され、以下のように tweet されました。

10

これで、ボタンがそれぞれ mail や tweet するところまで、できあがりました。

Ⅵ.LEDを点灯させる

タクトスイッチを押して動作している間、LEDを点灯させます。

LED点灯部分を追加したものは下記のようになります。

PORT1=15
PORT2=25
PORT3=5
MESSAGE="ボタンが押されたよ!"
COMMENT="今日もおつかれさまでした!"

gpio -g mode $PORT1 in
gpio -g mode $PORT2 in
gpio -g mode $PORT3 out

echo "ボタンを押してね!"
while true ; do
  if [ `gpio -g read $PORT1` -eq 1 ] ; then
    echo "mailボタンが押されました!"
    gpio -g write $PORT3 1
    mosquitto_pub --cafile keys/aws-iot-rootCA.crt --cert keys/41df0daa95-certificate.pem.crt --key keys/41df0daa95-private.pem.key -h 'A7WZHYOFSWEOL.iot.us-west-2.amazonaws.com' -p 8883 -q 1 -d -t topic/mysns -i clientid1 -m "{\"message\": \"$MESSAGE\"}"
    gpio -g write $PORT3 0
  fi

  if [ `gpio -g read $PORT2` -eq 1 ] ; then
    echo "tweetボタンが押されました!"
    gpio -g write $PORT3 1
    TIME=`date +%H:%M`
    mosquitto_pub --cafile keys/aws-iot-rootCA.crt --cert keys/41df0daa95-certificate.pem.crt --key keys/41df0daa95-private.pem.key -h 'A7WZHYOFSWEOL.iot.us-west-2.amazonaws.com' -p 8883 -q 1 -d -t topic/myTweet -i clientid2 -m "{\"message\": \"$COMMENT $TIME\"}"
    gpio -g write $PORT3 0
  fi

  sleep 0.1
done

各タクトスイッチを押してコマンドが流れている間のみLEDが点灯していれば実装完了です。

 

Ⅶ.まとめ

AWS IoTはAmazon SNS以外のAmazonサービスからも使用できることを確認できました。
なんだか、AWS IoTというと難しそうに感じてしまうところですが、実際にやってみるとこんな風に簡単にプログラムを動かすことができることがわかります。

また、wiringpiによってgpioコマンドが使えるようになったため、コマンドラインから “gpio -g write PortNo 値” で簡単に動作確認を行うことができるようになってます。とても便利ですね。

 

Previous

クライシスマッパーズ・ジャパン、災害時に空撮によって地図を迅速につくりあげる「ドローン基地」を伊豆大島、相模原に立ち上げ。クラウドファンディングで4000万円に挑戦。

フォトシンス、スマホをかざすだけでスマートロック「Akerun」のiBeaconを用いた追加アクセサリ「Akerun Touch」を提供開始

Next