AWS Lambda Python - 返回 BytesIO 文件?

Moj*_*imi 8 amazon-web-services python-3.x aws-lambda serverless-framework

我正在使用 python 3.7 在 AWS Lambda 中设置一个函数,它不会让我返回字节类型

请注意,这不是 API Gateway 的问题,我是直接调用 lambda 的。

错误是:Runtime.MarshalError, ... is not JSON serializable

output = BytesIO()
#Code that puts an excel file into output...
return {
        'Content-Disposition': 'attachment; filename="export.xlsx"',
        'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'body' : output.getvalue()
    }
Run Code Online (Sandbox Code Playgroud)

如果我做 :

'body' : str(output.getvalue())
Run Code Online (Sandbox Code Playgroud)

它输出损坏的文件,因为它添加b''到字符串

如果我做 :

'body' : base64.b64encode(output.getvalue()).decode()
Run Code Online (Sandbox Code Playgroud)

它还输出损坏的文件,可能是因为它更改了文件的二进制表示。

也许我需要上传到 S3?但它不适合我的流程,这是一次性文件创建,它会一直停留在“S3 Limbo”中,直到 TTL

Eri*_*rik 2

无法从直接调用的 AWS Lambda 函数返回未编码的二进制数据。

根据文档

如果处理程序返回无法由 json.dumps 序列化的对象,则运行时将返回错误。

您可以使用 API Gateway 执行此操作的原因是,API Gateway 正在将您的函数返回的 Base64 JSON 内容转换为二进制文件。(请参阅此处的文档)

我需要更多地了解您如何调用 Lambda,但我怀疑您可以在直接调用客户端中实现相同的 Base64 解码逻辑。或者,如果您想让客户端尽可能简单,请使用带有生命周期挂钩的 S3,以防止存储桶被临时文件填满。