【问题标题】:aws_cdk python error: Unzipped size must be smaller than 262144000 bytesaws_cdk python 错误:解压后的大小必须小于 262144000 字节
【发布时间】:2021-10-17 22:04:35
【问题描述】:

我使用 CDK 部署一个使用多个 python 模块的 lambda 函数。 但是我在部署时遇到了以下错误。

Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInte
rnal; Status Code: 400; Error Code: InvalidParameterValueException;

我搜索了以下与此问题相关的其他问题。

question1 question2

但他们专注于 serverless.yaml 并没有解决我的问题。 有没有办法解决这个问题?

这是我用于 CDK 的 app.py。

from aws_cdk import (
    aws_events as events,
    aws_lambda as lam,
    core,
)

class MyStack(core.Stack):
    def __init__(self, app: core.App, id: str) -> None:
        super().__init__(app, id)

        layer = lam.LayerVersion(
            self, "MyLayer",
            code=lam.AssetCode.from_asset('./lib'),
        );

        makeQFn = lam.Function(
            self, "Singleton", 
            function_name='makeQ',
            code=lam.AssetCode.from_asset('./code'),
            handler="makeQ.main",
            timeout=core.Duration.seconds(300),
            layers=[layer],
            runtime=lam.Runtime.PYTHON_3_7,
        )


app = core.App()
MyStack(app, "MS")
app.synth()

在 ./lib 目录中,我放置了类似的 python 模块,

python -m pip install numpy -t lib/python

【问题讨论】:

    标签: python aws-lambda aws-cdk


    【解决方案1】:

    我建议查看aws-cdk-lambda-asset 项目,这将有助于捆绑存储在requirements.txt 文件中的内部项目依赖项。它的工作原理是,它将需求文件中指定的依赖项安装到本地文件夹,然后将其捆绑在一个 zip 文件中,然后用于 CDK 部署。

    对于 Windows/Mac 等非 Linux 环境,它会将依赖项安装在 Docker 映像中,因此首先确保您拥有 Docker installed 并在您的系统上运行。

    注意,上面的代码似乎使用了poetry,这是一个依赖管理工具。我不知道poetry 做了什么,也不知道为什么用它来代替setup.py 文件。因此,我在要点here 中进行了轻微修改,以防万一;这将使用常规的pip install 命令而不是我不太熟悉的poetry 工具安装所有本地依赖项。

    【讨论】:

    • 谢谢,但这似乎不是标准解决方案。我也不明白为什么它解决了这个问题。它仍然尝试上传所有模块。理想的方式是我们在部署时只上传 requirements.txt,然后将所有 python 模块安装在服务器端。 CDK有这样的功能吗?
    • 据我所知,该错误表明存在与部署的解压缩大小相关的限制。 IIRC 我之前确实遇到了同样的问题,因为我的需求文件中的一些依赖项太大(例如opencv 库)。据我所知,通过 CDK 进行 lambda 部署的 压缩大小 没有这样的大小限制(尽管我可能是错的)。
    • 我同意 CDK 部署应该更容易。我知道例如通过无服务器部署捆绑的源代码要容易得多。我不知道是否有办法只上传上面提到的requirements.txt 文件,但我建议在aws-cdk repo 上打开一个问题,因为他们可能有其他建议。
    【解决方案2】:

    非常感谢。

    在我的情况下,只需在部署之前删除本地模块中的所有 __pycache__ 即可解决问题。

    我希望情况会有所改善,我们只需上传 requirements.txt,而不是在本地准备所有模块。

    【讨论】:

      【解决方案3】:

      不,单次设置无法绕过该限制。

      您需要做的是将您的依赖项安装到成为多层的多个 zip 中。

      基本上,将几个依赖项安装到 python 文件夹。然后将该文件夹压缩到类似 intergration_layer 的文件中。清除 python 文件夹并安装下一组并将其命名为其他名称。像 data_manipilation。

      然后你在 cdk 中有两个层(使用aws_lambda.LayerVersion)并将这些层添加到每个 lambda。您必须将层分解为足够小。

      您可以使用 makefile 自动生成层,然后将 makefile、cdk deploy 和一些清理内容绑定到 bash 脚本中,然后将它们绑定在一起。

      注意。您的层数仍然有限,并且限制为 5 层。如果您的依赖项超出了该范围,请查看 Elastic File System。您可以在那里安装依赖项并将单个 EFS 绑定到任何 lambda,以通过 EFS lambda 连接中内置的 PYTHONPATH 操作来引用它们

      Basic makefile idea (but not exact for CDK, but still close) (and if you never have, a good tutorial on how to use a makefile)

      CDK documentation for Layers (use from AssetCode for the location)

      AWS dev blog on EFS for Lambdas

      【讨论】:

        猜你喜欢
        • 2018-01-02
        • 2021-04-30
        • 2021-09-22
        • 2021-07-18
        • 1970-01-01
        • 2021-07-27
        • 2021-11-16
        • 2021-10-16
        • 1970-01-01
        相关资源
        最近更新 更多