はじめに
LambdaをトリガーするIot topic ruleのtopic名を取得する必要があったので、そのやり方について調べてみました。
やりたいこと
Iot topicへのメッセージ発行をトリガーにLambda関数を実行し、そのLambda関数のhandlerのeventに渡されるpayloadに、該当topicのtopic名を含めたい。
やり方
結論から言うと、topic ruleのクエリでtopic()関数を使うことで実現可能です。
試しにIot topic ruleを作成し、Lambdaトリガーを設定してみます。
Iot Core管理コンソールを開き、「メッセージのルーティング > ルール」をクリックします。
「ルールを作成」をクリックします。
「2016-03-23」のSQLバージョンを選択し、以下のSQLステートメントを入力します。
※topic()関数はSQLバージョン2015-10-08以降
でサポートされているようです
SELECT topic() as topic, * FROM 'test/topic'
ルールアクションの設定で事前に用意したLambdaを指定します。
動作確認
まず対象Lambdaのトリガーに該当Iot ruleが追加されていることを確認します。
runtimeをpython3.9に設定しているので、以下のコードを作成して、deployします。渡されるpayloadをそのまま出力する処理です。
def lambda_handler(event, context):
print(event)
IoT Core管理コンソールに戻り、「MQTTテストクライアント」をクリックして、「トピックに公開する」タブをクリックします。
トピック名に「test/topic」を入力し、メッセージペイロードに以下のメッセージを入力します。
{
"message": "hello world"
}
「発行」をクリックすると、対象Lambdaが実行されます。
CloudWatchロググループで対象Lambdaの実行ログを見てみると、以下のようにtopic名がpayloadに入っていることがわかります。(eventをそのままprintしているので、pythonのdictとして出力されています)
さらに、topic()関数の引数を指定することで、取得したいtopic名のセグメントを指定することができます。(引数が指定されていない場合はtopic名全体が返されます)
例えば、「test/topic」の1番目のセグメントである「test」のみ取得したい場合は、以下のようなクエリになります。
SELECT topic(1) as topic, * FROM 'test/topic'