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

この記事は、 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.yml
と handler.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
IMSI
と SLACK_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 的なものを作っていきたいと思います。