はじめに
raspberryPiで温度センサーのデータをAWS IoT Coreで受信してlambdaと連携しslackに送信する所までやってみようと思います。
AWS IoT Coreの作り方などは、前の記事で書いています.
開発構成
検証環境
- raspberryPi3B+
- 温湿度センサー(DHT22)
- AWS IoT Core
- AWS Lambda
前提
- デバイスから送られてくるデータをAWS IoT Coreで受信出来ていること
Lambdaの作成
- マネージメントコンソールにログインしてLambdaサービスを開き、「関数」→ 「関数の作成」をクリックします
- lambda作成に必要な項目を入力して「関数の作成」をクリックします
- オプション:一から作成
- 関数名:任意の名前
- ランタイム:今回は、node.js 14x
- 「関数の概要」をクリックして「トリガーを追加」をクリックします
- トリガーの追加で「AWS IoT」を追加します
- トリガーの設定で必要な項目を入力して「追加」をクリックします
- IoTタイプ:カスタムIoTルール
- ルール:新規ルールの作成
- ルール名:任意の名前
- ルールクエリステートメント:SELECT * FROM 'iot/topic'
- これでIoT Coreとlambdaの紐づけることができました。
- IoT Coreサービスを開いてルールに作成したルールが作成されている事が確認できます
slack webhook作成
- slackを開き「slackをブラウズする」→ 「App」をクリックする
- 検索欄に「Incoming Webhook」で検索してIncoming Webhookを追加します
- 「Incoming Webhook インテグレーションの追加」をクリックします
- 「Webhook URL」をコピーしておきます
プログラム開発
- フォルダーを作成します
$ mkdir slack
- プロジェクトを作成します
$ cd slack
$ npm init -y
$ npm install
- モジュールのインストール
$ npm install --save-dev @slack/webhook
- ファイルを作成します
MACの場合
$ touch index.js
Windowsの場合
$ type nul > index.js
- index.jsファイルに以下のソースをペーストしてください
index.js
const { IncomingWebhook } = require('@slack/webhook');
exports.handler = async (event) => {
const Channel = '#general';
const hostName = event.deviceid;
const text = `温度: ${event.temp} 湿度: ${event.humid}`;
const webhook = new IncomingWebhook('-- web hook URL --'); //WebHook URLをペーストしてください
const res = await webhook.send({
text: text, //通知内容
channel: Channel, //通知先チャンネル
username: hostName, //通知時ユーザー名
icon_emoji: ":ghost:", //アイコン絵文字
});
return res;
};
- 作成したプロジェクトをzipにして圧縮します
# 完成フォルダー
slack.zip
- lambdaを開き「アップロード元」をクリックして先ほど、zipフォルダーをアップロードします
- 「Deploy」をクリックします
動作テスト
- 実際にraspberryPiからデータをIoT Coreに送ってlambdaが正常に動作するか確認します。
raspberryPi側
pi@raspberrypi:~/sensor_aws $ node main.js
connect
published message for 1 time
published message for 2 time
published message for 3 time
published message for 4 time
published message for 5 time
- Lambda実行によりセンサーのデータがslackに送信されている事が確認できました。
まとめ
lambdaを使ってみましたが、使いやすくて他のAWSサービスとの連携もしやすいなと感じました。
今回は、IoT Coreとlambdaを連携してみましたが、他のサービスとも連携させてみたいと思います。