【问题标题】:How to reduce the size of packaged python zip files for AWS Lambda如何减少 AWS Lambda 的打包 python zip 文件的大小
【发布时间】:2020-02-11 17:22:25
【问题描述】:

下午,

我最近遇到了 AWS Lambda 和 Azure Functions。 AWS 对压缩和解压缩文件的大小施加了限制,python 脚本需要包含所有依赖模块。我一直在使用 lambda-uploader 来打包我的脚本和它的模块依赖,但是 pandas 包太大了。

我见过有人在 AWS Lambda 上完成机器学习并使用 pandas 的例子(虽然有点过时),但我看不出他们是如何做到的。有什么建议吗?

【问题讨论】:

  • 和天蓝色函数有什么关系???
  • Azure Functions 还允许您在 python 中部署无服务器代码,例如 AWS Lambda。 Azure 不对函数应用实施大小限制。在 AWS Lambda 中,对于 python,您必须将脚本以及任何依赖项作为 zip 文件上传,并且存在大小限制。
  • 适用于 python 的 Azure 函数是一项实验性功能,即使在预览版中也没有。在做出任何技术决策之前,您需要意识到这一点
  • @Thomas 我是你,谢谢

标签: python amazon-web-services aws-lambda


【解决方案1】:

您上传到 lambda 的包不应包含任何内容,只包含 Lambda 运行您的代码所需的代码和支持模块。 Lambda 控制台 UI limits 文件大小为 10MB,但如果您将 zip 文件放在 S3 存储桶中,然后请求 Lambda 从 S3 加载它们,您最多可以上传 50MB。

您需要执行的任何其他资产(例如机器学习模型)应单独上传到 S3,然后在执行时从您的 Lambda 函数中下载。 Lambda 函数可以写入 /tmp 文件夹,但请记住,它只能访问 512MB 的磁盘空间。另请注意,Lambda 函数的最长运行时间为 300 秒,因此下载非常大的文件将占用您的函数对正在下载的数据进行实际工作的时间。

【讨论】:

  • 啊,好的,我已经尝试通过 S3 上传,但我仍然达到了大小限制(大约 250mb?当我解压缩文件时)。我如何具体知道我需要包的哪些部分来运行我的功能?我没有意识到最长运行时间为 300 秒,我的一些 ETL 过程需要几个小时(如果我扩大 cpu/ram 的规模,我可能会变得更短)。
  • 还有一个 250MB 的未压缩限制(有关其余限制,请参阅我的答案中的限制链接)。需要打包什么以及以后可以下载什么的答案在很大程度上取决于您的软件的结构,所以我不能肯定地说,但我猜只是您的 python 代码需要在包中。对于长时间运行的 ETL 作业,您可能需要考虑 AWS Batch 或 Elastic Container Service (ECS)。设置需要更多的工作,但限制更少。
【解决方案2】:

尝试使用Zappa。在您使用zappa init 创建的zappa_settings.json 中将slim_handler 添加到true

【讨论】:

    【解决方案3】:

    如果您使用的是 Python 库,则可以摆脱 botocore、boto3,因为它们已经存在于 AWS 的 lambdas 函数中。

    【讨论】:

    【解决方案4】:

    要获得尽可能小的 zip 文件,请使用选项-9

    $ zip -9
    

    【讨论】:

      【解决方案5】:

      如果您正在使用无服务器 slim 选项并且仍然达到 250MB 的限制,您可以使用选项 zip: true。这样可以通过部署压缩所有包,您只需将它们解压缩到处理程序模块中,如 here 所述:

      try:
        import unzip_requirements
      except ImportError:
        pass
      

      【讨论】:

        猜你喜欢
        • 2023-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2023-02-08
        • 2020-09-24
        • 1970-01-01
        • 2020-08-18
        相关资源
        最近更新 更多