8
5

More than 1 year has passed since last update.

[AWS]Lambdaに送られるIot topicのpayloadにtopic名を含める方法

Last updated at Posted at 2023-01-23

はじめに

LambdaをトリガーするIot topic ruleのtopic名を取得する必要があったので、そのやり方について調べてみました。

やりたいこと

Iot topicへのメッセージ発行をトリガーにLambda関数を実行し、そのLambda関数のhandlerのeventに渡されるpayloadに、該当topicのtopic名を含めたい。

図で表すとこのようなイメージ
image.png

やり方

結論から言うと、topic ruleのクエリでtopic()関数を使うことで実現可能です。

試しにIot topic ruleを作成し、Lambdaトリガーを設定してみます。
Iot Core管理コンソールを開き、「メッセージのルーティング > ルール」をクリックします。
「ルールを作成」をクリックします。
image.png

ルール名を入力します。
image.png

「2016-03-23」のSQLバージョンを選択し、以下のSQLステートメントを入力します。
※topic()関数はSQLバージョン2015-10-08以降でサポートされているようです

SELECT topic() as topic, * FROM 'test/topic'

image.png

ルールアクションの設定で事前に用意したLambdaを指定します。
image.png

動作確認

まず対象Lambdaのトリガーに該当Iot ruleが追加されていることを確認します。
image.png

runtimeをpython3.9に設定しているので、以下のコードを作成して、deployします。渡されるpayloadをそのまま出力する処理です。

def lambda_handler(event, context):
    print(event)

IoT Core管理コンソールに戻り、「MQTTテストクライアント」をクリックして、「トピックに公開する」タブをクリックします。
トピック名に「test/topic」を入力し、メッセージペイロードに以下のメッセージを入力します。

{
  "message": "hello world"
}

image.png

「発行」をクリックすると、対象Lambdaが実行されます。

CloudWatchロググループで対象Lambdaの実行ログを見てみると、以下のようにtopic名がpayloadに入っていることがわかります。(eventをそのままprintしているので、pythonのdictとして出力されています)
image.png

さらに、topic()関数の引数を指定することで、取得したいtopic名のセグメントを指定することができます。(引数が指定されていない場合はtopic名全体が返されます)
例えば、「test/topic」の1番目のセグメントである「test」のみ取得したい場合は、以下のようなクエリになります。

SELECT topic(1) as topic, * FROM 'test/topic'

参考

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5