こんにちは、Michaelです。
今回は、AWS LambdaからAWS IoTにメッセージをPublishしてみます。
今回の構成
Lambdaが起動されると、AWS IoTのトピック「test/pub」に対してメッセージをPublishします。IoTデバイス側で「test/pub」をSubscribeすることで、Lambdaからのメッセージを受け取ることができます。
IAMロールの設定
LambdaからAWS IoTにPublishするため、以下のポリシーを作成し、Lambdaに適用するIAMロールにアタッチします。
1 2 3 4 5 6 7 8 |
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iot:Publish", "Resource": "*" } } |
コード
コードは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# coding: utf-8 # ①ライブラリのimport import json import boto3 # ②Functionのロードをログに出力 print('Loading function') # ③ AWS IoT Data Planeオブジェクトを取得 iot = boto3.client('iot-data') # ④Lambdaのメイン関数 def lambda_handler(event, context): # ⑤トピックを指定 topic = 'test/pub' # ⑥メッセージの内容 payload = { "message": "Lambda test" } try: # ⑦メッセージをPublish iot.publish( topic=topic, qos=0, payload=json.dumps(payload, ensure_ascii=False) ) return "Succeeeded." except Exception as e: print(e) return "Failed." |
コードの説明
コードの内容は以下の通りです。
項番 | 項目 | 内容 |
① | ライブラリのimpor | 処理に必要なライブラリを指定してインポートします。 |
② | Functionのロードをログに出力 | Lambdaのコードがロードされたことが分かるようにログにメッセージを出力します。 |
③ | AWS IoT Data Planeオブジェクトを取得 | AWS IoTに対してメッセージを送信できるようにインスタンスを生成します。 |
④ | Lambdaのメイン関数 | トリガーにより実行される関数。 |
⑤ | トピックを指定 | Publish先のトピックを設定します |
⑥ | メッセージの内容 | AWS IoTにPublishされるメッセージ内容です。 |
⑦ | メッセージをPublish | AWS IoTにメッセージをPublishします。 |
実行結果
Lambdaのコードエディタの上部にある[テスト]をクリックすると、テスト実行されます。
AWS IoTのテストコンソールでトピック「test/pub」をSubscribeした状態でLambdaをテスト実行すると、「⑥メッセージの内容」に設定したメッセージが出力されました。
また、IoTデバイスとしてMQTT.fxクライアントで「test/pub」をSubscribeし、テスト実行をすると、MQTT.fxクライアント側でも同じメッセージを受け取ることができました。
まとめ
Lambdaはトリガー設定次第で様々な挙動ができるため、IoTデバイスに対して意図したタイミングでメッセージを飛ばすといった運用ができます。
例えば、CloudWatch Eventsで1時間に1回デバイスにメッセージを飛ばしたり、AWS IoTをトリガーとしてIoTデバイスからのメッセージに応答させたりといった応用が可能です。
今回は以上となります。次回もお楽しみに!