こんにちは。スタディプラスでインフラ周りを担当している id:rmanzoku です。 先日、国内での発売が開始されたAWS IoT Enterprise Buttonを使ってオフィスの小さな改善を行ったのでご紹介します。
弊社の課題
弊社のオフィスは、ビルの4Fと6Fに分かれており、6Fは会議室となっております。 6Fは「なんとなく自分が最後だ」、という人が施錠しSlackにて報告していました。
(採用面接がある日は遅くなりがち)
この報告は忘れやすいですし、毎日行うことから非常に手間です。 今回、この報告をIoTボタンを使って簡略化することにしました。
AWS IoT Enterprise Buttonとは
先日、国内で発売されたIoTボタンです。 以前、Amazon Dashボタンを見て、ハックを試みたエンジニアの方は多いはずです。
このIoTボタンでは、なんと、リンクしたAWS Lambdaを呼び出すことができます!
実装
今回、解決したい課題は「施錠したときの報告を簡略化したい」でした。 ですので、シンプルにSlackへ通知するボタンを実装することにしました。
アクティベートの方法は公式ブログが詳しいです。
サンプルアプリケーションによると、次のようなJSONがLambda eventとして渡されます。
{ "deviceInfo": { "deviceId": "GXXXXXXXXXXXXXXX", "type": "button", "remainingLife": 98.7, "attributes": { "projectName": "Sample-Project", "projectRegion": "us-west-2", "placementName": "Room-1", "deviceTemplateName": "lightButton" } }, "deviceEvent": { "buttonClicked": { "clickType": "SINGLE", "reportedTime": 1521159287205 } }, "placementInfo": { "projectName": "Sample-Project", "placementName": "Room-1", "attributes": { "key1": "value1" }, "devices": { "lightButton":"GXXXXXXXXXXXXXXX" } } }
この値のうち、placementInfo
内は、ある程度自由に入力できます。
また、IoT 1-Clickのコンソールを見ると、
placementName
にIoTボタンのある場所、attributes
にカスタマイズ情報を入力する思想ということが推察できます。
画像のようにAttributeを設定し、 次のLambdaスクリプトを実行するようにします。 (弊社はRubyの強い会社ですが、手慣れているPythonです)
import os import json import logging import urllib.request import urllib.parse logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): webhook_url = os.environ.get('WEBHOOK_URL') logger.info('Received event: ' + json.dumps(event)) text = ''' %s %s ''' % ( event["placementInfo"]["placementName"], event["placementInfo"]["attributes"].get("msg") ) body = { "link_names": 1, 'username': event["placementInfo"]["attributes"].get("username", "AWS IoT"), 'text': text, 'icon_emoji': event["placementInfo"]["attributes"].get("icon_emoji", ":aws:") } encoded_post_data = urllib.parse.urlencode({"payload": body}).encode(encoding='ascii') urllib.request.urlopen(url=webhook_url, data=encoded_post_data)
内容は至ってシンプルなSlack Incoming webhookのスクリプトです。GitHub
WEBHOOK_URLはLambdaの環境変数から指定することにし、 SlackのusernameとiconはAttributeで渡すようにしました。
結果
IoTボタンを施錠記名簿のところに置くことで簡単にSlackへ施錠通知ができるようになりました。
イケているオフィスや自宅などではある程度自動化が可能かもしれませんが、弊社オフィスのように自動化できない状況は多いと思います。 なにか1つだけでも改善することで、働きやすいオフィスに近づいていけると思います。
今回の例では、改善案を思いついて1時間くらいで実装が終わりました。 小さな改善でもすぐに実行して結果が出せるのはエンジニアの楽しみの1つだと思いました。