资源处理程序返回消息:“解压缩后的大小必须小于 262144000 字节 AWS Lambda 和 CDK,没有 serverless.yaml 文件

Resource handler returned message: "Unzipped size must be smaller than 262144000 bytes AWS Lambda and CDK, no serverless.yaml file

我正在尝试获取与 AWS CDK 一起使用的 Lambda 函数。我在 python 中实现了 lambda 函数,并希望在我的 Lambda 代码中包含外部库。目前这是我的 CDK 代码:

import aws_cdk as core
from aws_cdk import (
    Stack,
    aws_lambda as _lambda,
    aws_apigateway as apigw,
)


class SportsTeamGeneratorStack(Stack):

    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)
        
        my_lambda = _lambda.Function(self, 'HelloHandler',
            runtime=_lambda.Runtime.PYTHON_3_8,
                code=_lambda.Code.from_asset("lambda",
                    bundling= core.BundlingOptions(
                        image=_lambda.Runtime.PYTHON_3_8.bundling_image,
                        command=[
                            "bash", "-c",
                            "pip install --no-cache -r requirements.txt -t /asset-output && cp -au . /asset-output"
                        ],
                    ),
                ),
            handler='hello.handler',
        )

        apigw.LambdaRestApi(
            self, 'Endpoint',
            handler=my_lambda,
        )

这是我的 Lambda 代码:

import json
import pandas

def handler(event, context):
    print('request: {}'.format(json.dumps(event)))
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'text/plain'
        },
        'body': 'Hello, CDK! You have hit {}\n'.format(event['path'])
    }

cdk 代码位于名为 sports_team_generator 的目录中,lambda 代码位于名为“lambda”的目录中的 hello.py 文件中。在“lambda”目录中,我还有我的 requirements.txt 文件,其中包含以下内容:

aws-cdk-lib==2.19.0
constructs>=10.0.0,<11.0.0
pytz==2022.1
requests==2.27.1
sportsipy==0.6.0
numpy==1.22.3
pandas==1.4.2
pyquery >= 1.4.0

我目前正在尝试避免使用 ECR 上传 docker 图像,然后将这些图像 link 上传到控制台中的 lambda 函数,因为我想通过 CDK 完成所有操作。我觉得好像 lambda 本身很小,并且不知道为什么它可能会超过大小要求。似乎 requirements.txt 导致了问题,我不确定是否有一些解决方法。最好我会修复此错误,尽管如果不可能,我可以开放创建 docker 图像并上传到 ECR,并且如果可能的话,通过 cdk link 将该 ECR 实例发送到 lambda 函数。如果有人有 solution/suggestions 请告诉我。

恐怕您唯一的选择是从容器中部署 lambda,请参阅 https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html

从 zip 解压缩的最大部署包大小为 250 MB。 Lambda 层也无济于事,因为所有层的组合部署包大小需要低于 250 MB。

但是,容器图像代码包大小限制为 10 GB。因此,如果您不能将 lambda 的包大小降低到 250 MB 以下,那么容器就是您的最佳选择。如何注册容器并将其用于 lambda 部署的指南位于 https://docs.aws.amazon.com/lambda/latest/dg/images-create.html and https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/