#ひげボタン を使って "郵便受け通知システム" を作ってみた
この記事は、 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 的なものを作っていきたいと思います。