Studyplus Engineering Blog

スタディプラスの開発者が発信するブログ

AWS IoT Enterprise Buttonを使ってSlack通知ボタンを作る

こんにちは。スタディプラスでインフラ周りを担当している id:rmanzoku です。 先日、国内での発売が開始されたAWS IoT Enterprise Buttonを使ってオフィスの小さな改善を行ったのでご紹介します。

f:id:rmanzoku:20180522171742p:plain

弊社の課題

弊社のオフィスは、ビルの4Fと6Fに分かれており、6Fは会議室となっております。 6Fは「なんとなく自分が最後だ」、という人が施錠しSlackにて報告していました。

f:id:rmanzoku:20180522171736p:plain

(採用面接がある日は遅くなりがち)

この報告は忘れやすいですし、毎日行うことから非常に手間です。 今回、この報告を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にカスタマイズ情報を入力する思想ということが推察できます。

f:id:rmanzoku:20180522171746p:plain

画像のように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へ施錠通知ができるようになりました。

f:id:rmanzoku:20180522171739p:plain

イケているオフィスや自宅などではある程度自動化が可能かもしれませんが、弊社オフィスのように自動化できない状況は多いと思います。 なにか1つだけでも改善することで、働きやすいオフィスに近づいていけると思います。

今回の例では、改善案を思いついて1時間くらいで実装が終わりました。 小さな改善でもすぐに実行して結果が出せるのはエンジニアの楽しみの1つだと思いました。