【问题标题】:Download files using AWS Lambda使用 AWS Lambda 下载文件
【发布时间】:2018-07-08 01:23:22
【问题描述】:

我有一个调用 AWS Lambda 函数的 iOS 应用程序。我希望 Lambda 函数通过 Lambda 代理功能从服务器获取一些文件并将其发送回 iOS 应用程序。

我使用生成的 SDK 从我的应用程序中直接调用 Lambda 函数。我找不到解释如何交换 JSON 编码请求以外的数据的文档。

我该怎么办?

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    Lambda 与外界的唯一接口是 JSON。

    要从 Lambda 返回文本数据,您必须将其作为字符串返回,并从 JSON 响应中反序列化该字符串。

    要从 Lambda 返回二进制数据,必须首先使用一种编码对数据进行转换(编码),该编码不能产生一系列字节,也不是有效的 UTF-8 字符序列,因为 JSON 不能序列化非字符数据(并非所有可能的字节组合都对应一个或多个有效字符)。执行此操作的常用策略是使用 base-64 编码。 Base-64 使用 8:6 的转换比率(每字节编码 6 位)无损地将一系列字节(八位字节)转换为不同的字节系列,这些字节也始终是有效的 7 位 ASCII 字符。然后,您需要将此数据从 base-64 解码回二进制。

    您可以在客户端对 JSON 和 base-64 进行解码,但如果您不喜欢这个想法,也可以使用其他一些选项。

    API Gateway 和 CloudFront 的 Lambda@Edge 功能都提供内置转换功能,可将 base-64 负载(来自 JSON Lambda 响应)转换回二进制,如果您不想在客户端上执行此操作。

    API Gateway 支持所有 Lambda 运行时,并且expects 这种格式...

    "isBase64Encoded": true,
    "body": "the-base-64-encoded-body",
    

    Lambda@Edge 仅支持 Node.js Lambda 函数,但比 API Gateway 便宜。它expects 包含一个 base-64 响应...

    "body": "the-base-64-encoded-body",
    "bodyEncoding": "base64",
    

    这两种方法的可行性取决于您的安全需求。 API Gateway 支持通过 IAM 以及其他机制进行身份验证。 CloudFront + Lambda@Edge 不支持 IAM 身份验证,但可以与 CloudFront 签名 URL 或 Cognito 或其他自定义授权机制一起使用。

    如果您提到的“文件”来自服务器,API Gateway 也可以直接从服务器代理这些文件,无需 Lambda 函数处理内容(尽管根据您的安全需求,可能需要 Lambda 自定义授权器, 对请求进行身份验证,然后简单地告诉 API Gateway 允许将请求转发到后端)。

    或者,如果文件是来自 S3 的对象,那么您可以直接访问 S3,类似于您现在访问 Lambda 的方式。

    【讨论】:

    • 感谢您的详细解答。澄清一下,Lambda 函数能否从 SFTP 服务器抓取文件,然后使用二进制/base64 技术将文件发送回客户端?
    • 是的,只要响应在 Lambda 和调用 Lambda 的服务的大小限制内,就可以完成。 Lambda 将整个响应 JSON 对象的大小限制为6MB,小于 API Gateway 的限制,但大于 Lambda@Edge 的限制。 Base-64 将大小扩大了 4/3(每 8 位输出 6 位输入),因此使用 API Gateway,您的文件需要小于 6 MB ÷ 4/3 ≈ 4.5 MB(并且由于以下原因要小一点响应中所需的 JSON 的其余部分)。
    猜你喜欢
    • 2022-10-15
    • 2021-12-19
    • 2021-10-13
    • 1970-01-01
    • 2017-05-25
    • 2018-08-29
    • 2021-02-23
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多