[AWS IoT Core] boto3 を使用して Lambda から MQTT v5 で新たに拡張されたプロパティを送受信してみました

2022.12.07

1 はじめに

re:Invent 2022 で AWS IoT Core の MQTT v5 対応が発表されましたが、boto3IoTDataPlane でも MQTT v5 で拡張されたプロパティを扱うことが可能になっていました。

なお、boto3IoTDataPlane は、Signature Version 4 signing processで署名して HTTPS で PUBLISH リクエストができるもので、MQTT v5 で定義されている CONNECT や SUBSCRIBE リクエストに関するものはありません。

今回は、boto3 を使用して、Lambda から MQTT v5 で新たに拡張されたプロパティを Publish してみました。

2 Publish

boto3IoTDataPlane Publish のドキュメントには、拡張されたプロパティが指定できるようになっていました。


https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iot-data.html#IoTDataPlane.Client.publish

3 Lambda

Lambda に書いてみたコードは、以下の通りです。

import boto3
import base64

def lambda_handler(event, context):

    try:
        client = boto3.client('iot-data')
        response = client.publish(
            topic='sensor/device1',
            qos=1,
            payload='hello world.',
            contentType='text/plain',
            responseTopic='response/device1',
            messageExpiry=120,
            correlationData=base64.b64encode(b'test-data').decode(),
            payloadFormatIndicator='UTF8_DATA',
            userProperties=[{'key1': 'value1'}, {'key2': 'value2'},{'key3': 'value3'}]
        )
    except Exception as e:
        print(e)

必要なパーミッションを付与して実行すると、出力は以下のようになりました。

Function Logs
START RequestId: 13e163d2-1a74-48a8-9e08-22740f0fa0bf Version: $LATEST
Parameter validation failed:
Unknown parameter in input: "contentType", must be one of: topic, qos, retain, payload
Unknown parameter in input: "responseTopic", must be one of: topic, qos, retain, payload
Unknown parameter in input: "messageExpiry", must be one of: topic, qos, retain, payload
Unknown parameter in input: "correlationData", must be one of: topic, qos, retain, payload
Unknown parameter in input: "payloadFormatIndicator", must be one of: topic, qos, retain, payload
Unknown parameter in input: "userProperties", must be one of: topic, qos, retain, payload
END RequestId: 13e163d2-1a74-48a8-9e08-22740f0fa0bf
REPORT RequestId: 13e163d2-1a74-48a8-9e08-22740f0fa0bf  Duration: 775.58 ms Billed Duration: 776 ms Memory Size: 128 MB Max Memory Used: 62 MB  Init Duration: 239.19 ms

どうやら、Lambda で利用できる プレインストールのboto3 は、まだ新しいパラメータに対応していないもののようです。

4 Layer

2022/12/07 現在、利用できるバージョンは、1.20.32 のようです。

import botocore
import boto3

def lambda_handler(event, context):
    print('botocore vertion: {0}'.format(botocore.__version__))
    print('boto3 vertion: {0}'.format(boto3.__version__))
botocore vertion: 1.23.32
boto3 vertion: 1.20.32

そこで、Layers を使用して、最新の boto3 を利用可能にしました。

参考:Python (Boto 3) Lambda 関数からの「不明なサービス」、「パラメータの検証に失敗しました」、「オブジェクトには属性がありません」というエラーを解決するにはどうすればよいですか?

% LIB_DIR=boto3-mylayer/python
% mkdir -p $LIB_DIR
% pip3 install boto3 -t $LIB_DIR
% cd boto3-mylayer
% zip -r /tmp/boto3-mylayer.zip .
% aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip
{
    "Content": {
        "Location": "https://****
        ・・・略・・・
        "CodeSize": 12003232
    },
    "LayerArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:boto3-mylayer",
    "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:boto3-mylayer:1",
    "Description": "",
    "CreatedDate": "2022-12-06T16:46:52.694+0000",
    "Version": 1
}

追加した Layer を Lambda で利用します。

バージョンは、 最新の 1.26.23になりました。

botocore vertion: 1.29.23
boto3 vertion: 1.26.23

5 動作確認

boto3 のバージョンを 1.26.23にすると、エラーなく実行できます。

MQTT テストクライアントで確認してみます。

表示された内容です。 設定した拡張プロパティの値が確認できます。

6 最後に

今回は、Lambda から MQTT v5 で新たに拡張されたプロパティを Publish してみました。

実は、今回、Publish のパラメータにあった、messageExpiryに値を設定したのですが、MQTT テストクライアントメッセージの有効期間には、残り有効期間(秒)が表示されませんでした。

何か、分かる方おられましたら、ぜひ、教えてやってください。

7 参考リンク


[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました
[AWS IoT Core] MQTT v5 を使用してユーザープロパティを実装して見ました
[AWS IoT Core] MQTT v5 を使用してトピック・エイリアスを実装して見ました
[AWS IoT Core] MQTT v5 を使用してメッセージ及び、セッション有効期限とクリーンスタートを実装して見ました
[AWS IoT Core] MQTT v5 を使用してレスポンスコードの確認を実装して見ました
[AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました
[AWS IoT Core] MQTT v5 に対応した 「MQTT テストクライアント」の動作を確認して見ました
[AWS IoT Core] MQTT v5 で追加されたユーザープロパティを ルール で取得して Lambda で使用してみました
[AWS IoT Core] AWS IoT Device SDK v2 for Python で MQTT5 のサポートが始まりました (Developer Preview)
[AWS IoT Core] MQTT v5 で新たに追加されたプロパティ値を Republish で追加してみました
[AWS IoT Core] AWS IoT Device SDK v2 for Python を使用して MQTT v5 で新たに拡張されたプロパティを送受信してみました