如何使用 boto3 手动将 DynamoDB 有线协议转换为本机 Python 对象?

How to convert from DynamoDB wire protocol to native Python object manually with boto3?

我有一个由 DynamoDB 流触发的 Lambda。 Lambda 进行一些处理,然后在 SNS 中创建关于主题的通知。理想情况下,我想在发送到 SNS 的通知中包含整个新文档,这样下游客户端就不必访问 DynamoDB 来获取数据。

我遇到的问题 运行 是来自 DynamoDB 流的数据是 DynamoDB 有线格式(映射包括数据类型作为键)。当我向下游客户端发送通知时,我不希望他们必须理解 DynamoDB 有线格式来解析消息(例如,如果我切换到一个新的底层数据存储,我将不得不重新创建该格式)。

显然 boto3 客户端能够将这种格式解析为 Python 对象,有没有办法让我自己访问解析器?据我所知,它作为从 DynamoDB 获取数据的一部分被调用,但我找不到自己调用它的方法。

我有类似的情况,我使用了如下方法:

from boto3.dynamodb.types import TypeDeserializer

deser = TypeDeserializer()

...
<in handler>
    for record in event['Records']:
        old = record['dynamodb'].get('OldImage')
        new = record['dynamodb'].get('NewImage')
        if old:
            d = {}
            for key in old:
                d[key] = deser.deserialize(old[key])

这种方法对我有用。生成的字典 d 包含转换后的对象,而不是传递给处理程序的有线格式版本。

出于某种原因,使用 TypeDeserializer 对我不起作用。但是,此实用程序确实做到了:

https://github.com/Alonreznik/dynamodb-json

那些不想在 Lambda 函数中处理模拟 pip install 的人,您可以将此源文件(包含 loads() 函数)复制并粘贴到您自己的代码中:

https://github.com/Alonreznik/dynamodb-json/blob/master/dynamodb_json/json_util.py