我正在进行一个利用AWS Lambda构建模型和生成预测的机器学习项目。Lambda函数使用Python编写,并使用了多个机器学习库,如pandas, sklearn, numpy和scikit-learn。这些Lambda函数使用了通过Lambda层打包的共享代码。我使用AWS CDK进行项目部署。CDK代码使用TypeScript编写,不要问我为什么混合使用Python和TypeScript,这在这种情况下并不相关。
由于机器学习库的原因,包的大小(Lambda代码 + 层)超过了允许的最大大小250MB。
在AWS宣布支持容器化Lambda后,我决定尝试使用它来克服250MB的限制。然而,我没有找到任何适合我情况的好例子,所以我尝试自己构建它。
CDK代码看起来像这样:
...// 从代码创建一个lambda层// 代码位于lambda-code/ml目录,看起来像// 任何Python包,包含主要的ML和数据库连接函数const mlLayer = new PythonLayerVersion(this, 'mlLayer', { entry: './lambda-code/ml/',})...// Lambda函数定义如下const classifyTransactionLambda = new DockerImageFunction(this, 'classifyTransactionLambda', { code: DockerImageCode.fromImageAsset('./lambda-code/classify'), memorySize: 512, layers: [mlLayer], tracing: Tracing.ACTIVE, environment: { BUCKET_NAME: mlModelsBucket.bucketName, ENV: env }});...
代码结构如下:
classify Lambda中的Dockerfile:
# 使用AWS ECR中的python lambda镜像FROM public.ecr.aws/lambda/python:3.7COPY requirements.txt ./RUN pip3 install -r requirements.txtCOPY index.py ./CMD ["index.classify_transaction_handler"]
当我运行cdk deploy时,得到以下错误:
此Lambda函数使用的运行时与此层不兼容(FROM_IMAGE不在[python3.7]中)
有没有人遇到过类似的问题?这个错误是否意味着mlLayer版本与Lambda函数classifyTransactionLambda不兼容?
任何帮助将不胜感激!
回答:
在这一点上
定义为容器镜像的函数不支持层。当您构建容器镜像时,您可以将首选的运行时和依赖项作为镜像的一部分打包。
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
所以我修改了我的构建过程,在构建镜像之前将所有层/库代码复制到每个Lambda函数中。