#ひげボタン を使って “郵便受け通知システム” を作ってみた

この記事は、 SORACOM Advent Calendar 2019 5日目の記事です。

今回は、 2019年11月12日に札幌で行なわれた SORACOM UG 札幌 #1 の LT で発表したものの内容説明を行ないます。

LT資料はこちらになります。
#ひげボタン を使って楽しくちょっと便利な生活

概要

作ったものは “郵便受け通知システム” です。
郵便受けのフタが開かれたことを検知して、スマホ(Slack)へ通知するようにしています。

今回は、郵便受けのフタが開かれたことを検知するために磁気スイッチを SORACOM LTE-M Button Plus に接続して使っています。

過去にいくつか試した知識の組み合わせで実装したので、 SORACOM Beam 、 API Gateway + Lambda 、を選択しています。

AWS 側の構成

今回は、 API Gateway と Lambda を使用しています。 API Gateway では、 APIキー を使うようにもします。

この辺りの設定をコンソールでやっても良いのですが、今回は諸々をまとめてやれる Serverless Framework CLI を使ってみました。

Serverless Framework CLI

Serverless Framework CLI
これを使うと、 API Gateway と Lambda の設定やデプロイがコマンドでできるようになって、とっても便利です。
(他のサービスへも同じようにデプロイできるようです。)

最初に、こんな感じでプロジェクトを作成します。

$ serverless create -t aws-nodejs -p post-notifier
$ cd post-notifier
$ yarn init -y
$ yarn add serverless-http express axios 
$ yarn add -D eslint

プロジェクトができたら、以下の serverless.ymlhandler.js を作成します。

serverless.yml

service: post-notifier

provider:
  name: aws
  runtime: nodejs10.x
  stage: api
  region: ap-northeast-1
  apiKeys:
    - post-notifier-key
  environment:
    IMSI: 000000000000000
    SLACK_WEBHOOK: https://hooks.slack.com/services/XXXXX/XXXXX

functions:
  sendNotification:
    handler: handler.handler
    events:
      - http:
          path: sendNotification
          method: post
          private: true

IMSISLACK_WEBHOOK は、各自の値に置き換えてください。

handler.js

'use strict'

const axios = require('axios')
const serverless = require('serverless-http')
const express = require('express')
const app = express()

app.post('/sendNotification', async (req, res) => {
  // Guard IMSI
  const imsi = req.headers['x-soracom-imsi']
    ? req.headers['x-soracom-imsi']
    : null
  if (!imsi || imsi !== process.env.IMSI) {
    res.status(403).send('Forbidden')
    return
  }

  // Send Notification to Slack
  const message = 'ポストが開かれました。'
  const sendData = {
    username: 'PostNotifier',
    icon_emoji: ':mailbox_with_mail:',
    text: message
  }

  const response = await axios.post(process.env.SLACK_WEBHOOK, sendData)
  res.status(200).send('Success')
  return
})

app.get('/*', (req, res) => {
  res.status(404).send('Not Found')
})

app.post('/*', (req, res) => {
  res.status(404).send('Not Found')
})

module.exports.handler = serverless(app)

別のパッケージを使っても実装できると思いますが、 express を使い慣れているので、これを Lmabda で使えるようになる serverless-http と組み合わせて実装しています。

ファイルを作成できたら、もうデプロイできます。 ( AWS を CLI で操作できる準備はできている前提です。)
デプロイのコマンドを実行すると、下記のようになります。

$ serverless deploy<br>
Serverless: Packaging service…<br>
Serverless: Excluding development dependencies…<br>
Serverless: Uploading CloudFormation file to S3…<br>
Serverless: Uploading artifacts…<br>
Serverless: Uploading service post-notifier.zip file to S3 (875.72 KB)…<br>
Serverless: Validating template…<br>
Serverless: Updating Stack…<br>
Serverless: Checking Stack update progress…<br>
…………..<br>
Serverless: Stack update finished…<br>
Service Information<br>
service: post-notifier<br>
stage: api<br>
region: ap-northeast-1<br>
stack: post-notifier-api<br>
resources: 13<br>
api keys:<br>
  post-notifier-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br>
endpoints:<br>
  POST - https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/sendNotification<br>
functions:<br>
  sendNotification: post-notifier-api-sendNotification<br>
layers:<br>
  None<br>
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.<br>
✨  Done in 35.02s.<br>
$

これで、 API Gateway の設定、 Lambda の設定とコードのデプロイ、 API Gateway と Lambda の連携、すべてが完了します。

SORACOM 側の設定

デプロイが完了したら、 SORACOM のコンソールを使って Beam を下記のように設定します。

項目設定値
エントリポイントUDP → HTTP/HTTPS エントリポイント
プロトコルHTTPS
ホスト名上記デプロイで表示されている endpoints のホスト部分 (XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com)
ポート番号443
パス上記デプロイで表示されている endpoints のパス部分 (/api/sendNotification)
IMSIヘッダON に変更
カスタムヘッダアクション:置換 / ヘッダ名: x-api-key / 値: 上記デプロイで表示されている post-notifier-key の値

これで、準備は完了です!

実行

設置前はボタンを押せば確認できます。 Slack へ通知が出ることが確認できれば、ソフトウェア側の準備は完了です。
後は物理的に設置するだけ!

現在のところ、2週間ほど安定して運用できています。
気になるのは、所在地が札幌なので動作温度の下限(5℃)に引っかかってくるんじゃないかな、というところです。

SORACOM LTE-M Button を実際に試してみて、通信部分を気にせずにものづくりできるのは本当に楽だな、と感じましたね。
これからも DIY 的なものを作っていきたいと思います。

tacck
  • tacck
  • 北の大地の普通のソフトウェアエンジニア。
    インフラ・バックエンド・フロントエンドと、色々やります。

    初心者・若手向けのメンターも希望あればお受けします。

    勉強会運営中
    * ゆるWeb勉強会@札幌
    * スマートスピーカーで遊ぼう会@札幌

コメントする

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください