そらのうきぶくろ

Blog - Permalink

AWS IoT エンタープライズボタンを使ってTwitterに投稿するまで

AWS IoT エンタープライズボタン – IoT をシンプルに。

こんな素敵な製品があるのをご存知だろうか。
これは、ボタンを押すと何かが起きる、という夢のような出来事を現実にできるデバイスだ。

ところでうちはピルクルが大好きだ。
ピルクルを飲むたびにピルクルおいしいとツイートしたいくらいピルクルが大好き。
ここまで読んだ貴方ならもう分かるだろう。
このボタンがあれば、ピルクルを飲むたびにボタンを押すだけでピルクルおいしいとツイートできるようになるのだ。

というわけでピルクルおいしいボタンが完成するまでにやったことを書く。

用意するもの

・Amazon AWS アカウント
・AWS IoT エンタープライズボタン
・Twitterアカウント

Twitterアプリとして登録

まずは、Twitterに投稿するためのトークンとかそういうやつを取得する必要がある。
Application Managementのページでアプリとして登録する。

こんなかんじでOK。
Websiteはなんでもいい、Callback URLsは空でいけた。

これで完成。

Keys and Access Tokensタブに移動して、このボタンでアクセストークンを発行する。
同じページに表示されているConsumer Key (API Key)、Consumer Secret (API Secret)、Access Token、Access Token Secretは、後々使用する。

AWS Lambda関数を登録

次に、ボタンが押された時に呼ばれる処理を登録する。
AWSのコンソールにログインし、サービスからLambdaを選択する。
一から作成を選んで、以下のように記入する。

Node.jsで開発するのでこんな感じ。
ロール名は適当。
ポリシーテンプレートは、とりあえずIoTボタンから使うということでそれっぽいのを選んでみた。

インラインでコードを編集できるみたいだが、今回はTwitterに投稿できるようにライブラリを使用するので「コードエントリタイプ」は「ZIPファイルをアップロード」を選択。
ここで、ZIPファイルにまとめたソースコードをアップロードできるので、その前にアップロードするソースを書く。
以下を、npmが利用可能な環境で実行する。

mkdir 適当なディレクトリ
npm init -f
touch index.js
npm install twitter --save

これで、適当なディレクトリに空のindex.jsと、Twitter用のライブラリが入る。
日付の処理で楽したいので、更にmomentも入れておく。

npm install moment --save

で、index.jsに以下のように記述する。ES6の記法が使える模様。

const twitter = require('twitter');
const moment = require('moment');

const twitterClient = new twitter({
  consumer_key: '(Your Consumer Key)',
  consumer_secret: '(Your Consumer Secret)',
  access_token_key: '(Your Access Token)',
  access_token_secret: '(Your Access Token Secret)'
});

exports.handler = (event, context, callback) => {
  let date = new Date();
  let dateString = moment(date).format('YYYY/MM/DD HH:mm:ss');
  let tweet = `ピルクルを飲みました!ピルクルおいしい!(${dateString}) #PilkulDelicious`;

  twitterClient.post('statuses/update', { status: tweet },
    function(error, tweet, response) {
      if (error) {
        callback(null, 'Error.');
      }
      callback(null, 'Done.');
  });
};

あとは、ソースをZIPに固める。
必要なのは、プログラム本体のindex.jsと、ライブラリのnode_modules。
修正するたびにZIPに固めるのが面倒なので、以下のシェルスクリプトを作った。

#!/bin/bash
zip -r upload.zip ./index.js ./node_modules/

あとはこれを叩いてupload.zipを作ったら、AWS Lambdaの画面に戻る。

こんな感じでタイムゾーンを環境変数に設定しておく。
で、ZIPファイルをアップロードする。

後は、実際にボタンに関数をつなぐ前にテストする。
右上のテストボタンを押すと、初回はこんなのが出てくる。

ちょっと何言ってるのかわからないけど、とりあえずイベントテンプレート「Hello World」を選んで、イベント名は適当にいれて、右下の保存ボタンを押せばOKだった。
これを設定したうえで、右上の「テスト」ボタンをクリックすると、先程アップロードしたLambda関数が実行される。
無事にツイートされている事を確認したら、いよいよボタンのセットアップとなる。

AWS IoT 1-Clickの設定

AWSのサービスからIoT 1-Clickを選択する。
すると、以下のようなワクワクする画面が表示される。

さっそく、プロジェクトの作成を選択する。

嘘偽りない内容を記入し、次へ。
「デバイステンプレートの定義」と書かれた灰色の部分を選択→「すべてのボタンタイプ」を選択→アクションから「Lambda関数の選択」を選ぶ。

するとこんな感じにいろいろ設定できるようになる。
デバイステンプレート名は適当。
例:OrderRequestって書いてあったのでとりあえずツイートするだけだからtweetでいいだろって思って記入した。
Lambda関数は先程AWS Lambdaで作った関数を選択する。

下のプレイスメントの属性とやらは、ボタンが1個しかないから無視でOK。
プロジェクトの作成を選択して完了。

まだこの時点ではIoTボタンを登録していないので、「プレイスメントをスキップ」を選択。

最初の画面に戻り、デバイスの登録を行う。
ここの登録はやや面倒なので、AWS IoT 1-Click と IoT エンタープライズボタンのセットアップ&動作確認という親切な記事に書かれているアプリを使用するとよい。
登録した直後はデバイスは無効になっているので、デバイスを有効化させておくことを忘れずに。
そうしないとこの次の手順で、ボタンデバイスが一覧に出てこない。

無事にデバイスの登録が終わったら、管理>プロジェクトから先程作ったプロジェクトを選択する。

左のメニューのプレイスメントから、「プレイスメントの作成」を選択する。

プレイスメント(ボタンの場所)は家なのでhomeとした。
「このテンプレートのボタンデバイスを選択する」をクリックすると、登録したボタンデバイスが選べるようになるので選ぶ。
ボタンデバイスを選択したら、「プレイスメントの作成」で完了。

ここまでやれば、あとはボタンを押せば……。

このとおり、ピルクルがおいしいことを手軽にシェアすることができた。

結論

クソみたいなプロダクト作るの最高。

プログラミング | 君はコメントしてもいいししなくても良い

AWS IoT エンタープライズボタンを使ってTwitterに投稿するまでへのコメント (0)

コメントを書く


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>