【IoT入門】AWS IoT ルールを使用してデバイスから送信されたデータをSlack通知してみる
こんにちは!
製造ビジネステクノロジー部のたかみです!
今回はAWS IoT Coreへの入門として、デバイスから送信したデータをAWS IoT ルール経由でLambdaに送信し、その内容をSlackに送信してみようと思います。
構成
今回作成するシステムの構成図は以下のようになっています。

デバイス(MQTTX)からデータを送信
↓
IoT Core(ルール)で取得
↓
Lambda
↓
Slackに通知(LambdaからIncoming Webhook URLを使用してPOST)
という流れです。
今回はデバイスの代わりにMQTTXというMQTTクライアントを使用してみます。
MQTTXとIoT Coreの連携およびPublish/Subscribeの手順は以下の記事の通りなので、本記事では割愛します。
AWS IoT ルールを使用してみる
トピックとメッセージの前提条件
MQTTXからはtopic/mqttxというトピックでメッセージを送信するものとします。
また、MQTTXから送信されるメッセージは以下のようなJSONの形式であるものとします。
{
"msg": "hogehoge"
}
このメッセージを受け取れるよう、ルールを作成していきたいと思います。
SQLステートメントを設定する
ルールはAWS IoT コンソールの「メッセージのルーティング」>「ルール」 から作成できます。
今回はmqttx_message_to_lambdaという名前でルールを作成してみましょう。

ルール名を決めると、次のような画面に遷移しSQLステートメントを記述することができます。

今回は以下のように記述してみました。
SELECT *, topic() AS topic, timestamp() AS ts FROM 'topic/mqttx'
SELECT句に取得したいデータを羅列し、FROM句にはどのトピックからデータを取得するのかを記述します。
これでtopic/mqttxに届いたメッセージを対象にできました。
次はSELECT句についてもう少し詳しくみてみましょう。
今回は、*, topic(), timestamp()という3つの情報を取得しています。
まず、*の部分ですが、これは受信したペイロード全体(JSONオブジェクトのトップレベルの要素すべて)を表しています。
つまり今回の場合だと、
{
"msg": "hogehoge"
}
が取得できます。
次にtopic()ですが、これは文字通りデータを取得してきたトピックを返却します。
つまり、今回だとtopic/mqttxとなります。
最後にtimestamp()は、ルールエンジンがメッセージを処理した時点の時刻を、Unixエポックからのミリ秒(例: 1481825251155)で返します。
今回は3種類のデータを取得してみましたが、その他にも使用できる関数がたくさんあります。
一覧はこちらのページをご覧ください。
ルールアクションの設定
SQLステートメントが設定できたら、次はルールアクションを設定します。
これにより、取得したデータをどこに送信するかを決めることができます。
今回はデータの送信先として事前に作成していたLambdaを選択します(Lambda関数の中身については後述)。

Lambda以外のサービスを選択することも可能です。
選択可能なサービスは以下のリンクをご参照ください。
Lambda関数の中身
実際にLambdaには以下のようなコードを書いてみました。
コードをざっくりと説明すると、
ルールから送られてきたデータをeventとして受け取る
↓
データのバリデーション
↓
Secrets Managerに保存しているWebhook URLを取得
↓
Webhook URLを利用してSlack通知
といったような流れです。
コードの内容自体はこの記事の本筋から外れるので、一部のみ抜粋して記述します。
export const handler = async (event: unknown): Promise<void> => {
console.log("受信イベント:", JSON.stringify(event));
// 送信されたデータのバリデーション
if (!isValidIotRuleEvent(event)) {
// msg が存在しない/型が不正 → ログのみで正常終了(throwしない)
console.error(
"無効なイベント形式です。msg/topic/ts のいずれかが欠落または型不正です:",
JSON.stringify(event)
);
return;
}
// Secrets ManagerからSlack通知用のWebhook URLを取得
const webhookUrl = await getSlackWebhookUrl();
// 通知用にデータを整形してSlack通知
await postToSlack(webhookUrl, event);
console.log("Slack への通知に成功しました");
};
動作確認
MQTTXからメッセージを送信してみましょう。

すると、想定通りSlackにメッセージが送信されました。

まとめ
今回はAWS IoT ルールを利用し、デバイスから送信されたメッセージをSlackに送信してみました。
簡単な構成ではありますが、AWS IoTの基礎編として参考にしていただけると幸いです。



