[AWS] IoTエンタープライズボタンとLambdaでSlackへ様々な通知を送る

AWSには様々なサービス充実していることが他のパブリッククラウドとの大きな違いでしょう。

今回はその中でもあまり触れることのなかったIoTのサービスについて触ってみました。

ということで皆さんはAWS IoT 1-clickというサービスをご存知でしょうか?
(私は知りませんでした!!)

シンプルな物理デバイスをトリガーにして、Lambda関数を呼び出すことができるサービスです。
物理デバイスでボタンを押すと、スプレットシートに勤怠を記録したり、ナースコールなどの押しボタンの代わりにできたり、電話やメールを送信することだってできてしまうなど使い方はたくさんありそうですね。

用途は実装者の発想次第でいくらでも考えられるでしょう。
今回はIoT 1-clickを実際に触って、Slackへの通知を送ってみました。

IoTボタンの設定


添付画像のデバイスが「AWS IoT Enterpriseボタン」というデバイスです。
以前流行したAmazon Dashボタンにそっくりですね。
このデバイスはAmazonから2,500円で購入することができます。
また、この他にはSIMカードが挿入されているタイプのデバイスもあるようです。


スマートフォンから専用アプリをインストールしてIoTデバイスの登録とWi-Fi設定を行います。
専用アプリはiOSはこちらから、Androidはこちらからダウンロードします。

登録手順についてはアプリの誘導に従えば良いので割愛します。

Slackの設定


Slackへ[incomming-webhook]のアプリを追加します。


通知先のチャンネルを設定します。
この時にWebHook用のURLが生成されるので控えておきます。

Slack通知のLambda作成

AWSTemplateFormatVersion: '2010-09-09'
Description: >
  IoT button actions are notified to Slack using Lambda.

Parameters:
  HookURL:
    Type: String
    Description: >
      Enter the URL for the Imccoming-webhook.
    Default: 'https://hooks.slack.com/services/XXXXXXXX/XXXXXXXXXX/XXXXXXXXXXXXXXXX'

Resources:
  LambdaExecutionRole:
    Type: "AWS::IAM::Role"
    Properties:
      Policies:
        -
          PolicyName: "LambdaLogPutPolicy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: "Allow"
                Action:
                - logs:CreateLogGroup
                - logs:CreateLogStream
                - logs:PutLogEvents
                Resource: "*"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"

  LambdaFunctionForSlack:
    Type: "AWS::Lambda::Function"
    Properties:
      Description: IoT button actions are notified to Slack using Lambda.
      Handler: index.lambda_handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Runtime: python3.7
      MemorySize: 128
      Timeout: 60
      Code:
        ZipFile: !Sub |
          import os
          import json
          from urllib.request import Request, urlopen

          HOOK_URL = "${HookURL}"

          def lambda_handler(event, context):
              # Slackで表示するbotの名前とアイコン    
              username = "AWS Iot Button"
              icon = ":put_litter_in_its_place:"

              # 1回押しの場合
              if event['deviceEvent']['buttonClicked']['clickType'] == 'SINGLE':
                  color = "#ff0000"
                  text_message = event['placementInfo']['attributes']['place']+"のゴミ箱が一杯になりました。\n担当者は対応をお願いします。\n対応完了後は、AWS IoT ボタンをダブルクリックしてください。"
              # 2回押しの場合
              elif event['deviceEvent']['buttonClicked']['clickType'] == 'DOUBLE':
                  color = "#2eb886"
                  text_message = event['placementInfo']['attributes']['place']+"のゴミ箱を空にしました。"
              # 長押しの場合
              elif event['deviceEvent']['buttonClicked']['clickType'] == 'LONG':
                  color = "#2eb886"
                  text_message = event['placementInfo']['attributes']['place']+"のゴミ箱を空にしました。"

              # Slackのメッセージを作成
              slack_message = {
                  'username': username,
                  'icon_emoji': icon,
                  'attachments': [
                      {
                          'color': color,
                          'fields': [
                              {
                                  'value': text_message
                              }
                          ]
                      }
                  ]
              }

              # メッセージの送信
              req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
              response = urlopen(req)
              return 0

LambdaについてはCloudFormationでサクッと作成しました。


CloudFormationのスタック作成時にWebHookのURLをパラメーターとして渡してください。


CloudFormationが通ったらLambda関数が作成されたことを確認してください。

ちなみに今回はゴミ箱の横にボタンを設置するシチュエーションを想定しています。

・ゴミ箱が一杯になったことに気がついた人がシングルプッシュを押すと、Slackへ担当者向けのメッセージが送られます。
・ゴミ箱を空にした担当者はボタンをダブルプッシュすることで、Slackへ対応完了のメッセージを送信します。
といった感じの想定のLambdaです。

1-clickの設定


AWSのコンソールから1-clickの管理ページを開きます。

スマホで登録したIoTデバイスはデフォルトで無効状態になっているはずなので有効に切り替えておきます。


続いてプロジェクトを作成します。


作成したLambdaでは[place]というパラメータを使っているので、プレイスメント属性に追加をしておきます。
ここにはゴミ箱が複数の部屋に設置されていることを想定して、場所の名前を入れておきます。


プロジェクト内にプレイスメントというデバイスとパラメータを組み合わせの単位を作成できます。
複数の部屋にIoTデバイスを設置する場合にはここで複数のデバイスの設定を行います。

これで準備は完了です。

デバイスの挙動確認


実際にデバイスを押して挙動を確認してみました。

想定通りの通知が送られていることがわかります。

おわりに

IoTデバイスを使えばボタンを押すだけでLambdaを呼び出すことができます。

今回は単純なSlackへの通知でしたが、Slackに限らずLINEや、メール、ショートメッセージなど様々な通知を行うことができます。

また、外部のAPIをコールして結果を送ることもできたり、スプレットシートへの書き込みなど様々な用途がありそうですね。

ただIoTデバイスを購入してみて思ったのですが、個人で使おうとするとあまり用途が思い浮かびません。
せっかく購入したので何か面白い使い方が思い浮かべば、また記事にしたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)