[遊び]AWS IoTエンタープライズボタンでサーバーレスピタゴラ装置を作る
サーバーレス開発部の阿部です。
弊部でターゲットに見据えている主要技術の一つにAWS IoTがあります。前職から通して利用したことのない技術なので、実際に少し触ってみようとIoT Enterpriseボタンを買いました。
何に使うかはっきりしないまま買ったので、半分どうしようかな、とか思いながら届くのを待っていたわけですが、使い道思い浮かばないんだったら使い道のないものを作れば良いんじゃないかと思い立って、サーバーレスでピタゴラ装置を作ってみることにしました。
ピタゴラ装置とは
ある特定のこと(大抵は朝の目覚ましを鳴らすとか他愛のないこと)に無駄な手間と壮大な仕掛けを作って対応する一種の遊びです。海外ではルーブゴールドバーグマシンというそうですね。「ゴールドバーグ」と聞いて「天使にラブソングを」や「ゴースト」を思い出すあなたはきっと私と同世代です。
今回のピタゴラ装置の要件
ピタゴラ装置ですので、思いっきり無駄になることを考えます。今回はゴールを「AWS IoTボタンをクリックしたことを通知する」こととして、そのために以下を重視して考えることにしました。
- なるべくプログラミングレスで
- IoT Enterpriseボタンをクリックしてから通知を出すまでに
- どれだけ手間をかけて複数のサービスを渡り歩けるか
- 一つの工程でなるべく複数のことをしない
構成案
LambdaがキックされたらTrelloにカードを作成して、私をアサインします。そのアサインまで終わったら私に通知する、という構成にしてみました。なるべくプログラミングレスで他サービスのイベントやアクションを実行/管理するためにAWSの外ではIFTTTとzapierを使うことにしました。処理が流れる順序は以下です。
- IoT EnterpriseボタンのクリックからLambdaを発火
- LambdaはIFTTTのWebhookにイベントを投げる
- IFTTTはWebhookでイベントを受け取るとTrelloの特定のボード、リストにカードを追加
- ZaiperがTrelloの指定のボード、リストを監視していて、カードが追加されたらメンバーをアサイン
- IFTTTがTrelloの指定のボード、リストのカードを監視していて、カードにメンバーがアサインされたらIFTTTアプリを通じて通知
作って見る
さて、早速作ってみましょう。今回のコンセプト的には、コードを書かないといけない部分はLambdaのみで、後は各サービスをつなぐ設定をして行くだけです。
IFTTTの設定
IFTTTでやる想定なのは以下の2イベントです。
- Lambdaからのリクエストを受けて、Trelloのカードを作る
- Trelloの特定のリストにあるカードに特定のメンバーがアサインされたらTrello App通知を出す
なるべく一つのアクションで多くのことをしすぎないようにしていきます。Trelloのカードを作るときにアサインメンバーを指定することもできるのですが、工程が一つ減ってしまうのでぐっと我慢しました。
基本的には登録されているサービスから選択していくのですが、残念ながらAWSはありませんし、ユーザカスタムのAPIを登録することはできません。しかし、webhookはタスクのトリガーとして許可されているので、カード作成についてはLambdaからHTTPリクエストを飛ばして実現させてみます。
Zapierの設定
IFTTTではTrelloのアクションの中にメンバーのアサインはありません。カードを作るときにアサインするのは楽なのですが、今回のコンセプトに反します。というわけで他のサービスを利用することにしました。
Zapier | The easiest way to automate your work
ZapierはIFTTTの競合にあたるサービス(他にはMicrosoft Flowなどがあります)で、IFTTTよりももう少し処理を細かく指定できます。トリガーとアクションだけではなく、トリガーに対するフィルターも指定可能です。アクションにメンバーのアサインがあるのを見つけたのでzapierを使うことにしました。
特定のボード/リストにカードが追加されたら自分をアサインするようなタスクを作りました。
AWS Lambdaを作る
今回、ちょっと触ってみたかったのでGoで作りました。ちなみに今回一番時間がかかったところはここ。内容はリポジトリみてください。TrelloのwebhookにアクセスするためのキーはSystems ManagerのParameter Storeに保存してあります。
ServerlessPItagoraSwitch - Github
なお、IoT Enterpriseボタンからのjsonイベントは以下のドキュメントの内容が渡ってくると思ってたんですが、どうもこの通りに拾えてない模様。
イベントソースによって公開されたサンプルイベント
{ "serialNumber": "ABCDEFG12345", "clickType": "SINGLE", "batteryVoltage": "2000 mV" }
ちょっとこの辺は調査が必要ですね。
Enterprise IoTボタンの登録、Lambdaの関連付け
弊社ブログでこの辺はすでに試している人がいたので特に迷いませんでした。
【国内販売開始】AWS IoT Enterprise Button試してみたらホンマに簡単にLambda関数を実行できた
タイトル通りむちゃくちゃ簡単です。ただ、ボタンのDSN(デバイス番号)を普通に箱横に印刷してあるのはちょっとびっくりしました。まあ、店頭で売ってるようなものでもないですしいいといえばいいのかな。
実行
実行するとしばらくして(zapierのポーリングは15分ごとなので、少し時間がかかります)通知が飛んできました。うまいこといきました。
これから
もう少し進めたいと思ってたんですが、AWS認定ソリューションアーキテクト(アソシエイトレベル)の試験勉強も進めたいし、GoでLambdaを書くところで少し時間を食ってしまったので、今日はこのくらいにしておきます。これからやりたいことは以下のようなことです。
- AWSを出るまでの経路をもっと複雑化したい(各サービス無駄に通るようにしたい)
- Lamdbaに届くボタン押下のイベントメッセージを使って何か処理に変化をつけたい
- 処理の流れを分岐させて二つのイベントが合流するとか
これらをやっていって、最終的にボタン押したら2〜3時間くらい経って通知がくる、みたいなものを作りたいですね。
凄まじく無駄なことこの上ないですが、フルマネージドサービスを使い倒しながら作って行く練習としては良いのかな、と感じました。