我有一个使用javascript构建的AWS CDK堆栈。堆栈有多个lambda。大多数都是用javascript编写的。我想在python中添加一个lambda。当我不导入外部依赖项时,python lambda工作得很好,但在我安装它们时却无法理解它们。我曾尝试将这些包安装在package
文件夹或python
文件夹中,并按照这些文章的建议将其压缩,但不起作用:
https://docs.aws.amazon.com/lambda/latest/dg/python-package.html https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/
我得到的错误是"Unable to import module 'py1': No module named 'x'"
(x指的是我试图导入的任何包的名称)
我的javascript CDK库代码如下:
// javascript lambda
new lambda.Function(this, 'lambda-js1', {
functionName: `js1`,
code: lambda.Code.fromAsset('assets/lambdajs'),
handler: 'js1.handler',
runtime: lambda.Runtime.NODEJS_14_X,
})
// python lambda
new lambda.Function(this, 'lambda-py1', {
functionName: `py1`,
code: lambda.Code.fromAsset('assets/lambdapy'),
handler: 'py1.handler',
runtime: lambda.Runtime.PYTHON_3_8,
})
我使用以下命令在assets/lambdapy
中安装了依赖项
pip install x
pip install --target ./package x
pip install -t python/ x
之后我拉上了拉链
我的python代码是用assets/lambdapy/py1.py
编写的
# not sure how to import. none of the below worked
import x
import package.x
import python.x
def handler(event, context):
return {
'statusCode': 200
}
在调用python lambda时,我得到
{
"errorMessage": "Unable to import module 'py1': No module named 'x'",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}
发布于 2021-11-20 05:42:38
我的解决方案
首先,我在assets/lambdapylibs
中安装了两个依赖项(一个在本地机器上工作,另一个在lambda上工作),使用以下命令
# to work on local machine
pip install x
# to work on lambda. it has to be under python folder (assets/lambdapylibs/python)
pip install --target ./python x
其次,我编写了assets/lambdapy/py1.py
并正常导入了x
import x
def handler(event, context):
return {
'statusCode': 200
}
第三,我在javascript CDK库中添加了一个层。图层具有python依赖项。
// javascript lambda
new lambda.Function(this, 'lambda-js1', {
functionName: `js1`,
code: lambda.Code.fromAsset('assets/lambdajs'),
handler: 'js1.handler',
runtime: lambda.Runtime.NODEJS_14_X,
})
// python libs layer
const layerPythonLibs = new lambda.LayerVersion(this, 'layer-python-libs', {
code: lambda.Code.fromAsset('assets/lambdapylibs'),
compatibleRuntimes: [lambda.Runtime.PYTHON_3_8],
})
// python lambda
new lambda.Function(this, 'lambda-py1', {
functionName: `py1`,
code: lambda.Code.fromAsset('assets/lambdapy'),
handler: 'py1.handler',
runtime: lambda.Runtime.PYTHON_3_8,
layers: [layerPythonLibs],
})
发布于 2021-11-04 09:52:48
使用aws-cdk.aws-lambda-python
L2结构,它会自动安装依赖项。
以下是文档:
https://docs.aws.amazon.com/cdk/api/latest/docs/aws-lambda-python-readme.html
上面文档中的Typescript示例:
import * as lambda from "@aws-cdk/aws-lambda";
import { PythonFunction } from "@aws-cdk/aws-lambda-python";
new PythonFunction(this, 'MyFunction', {
entry: '/path/to/my/function', // required
index: 'my_index.py', // optional, defaults to 'index.py'
handler: 'my_exported_func', // optional, defaults to 'handler'
runtime: lambda.Runtime.PYTHON_3_6, // optional, defaults to lambda.Runtime.PYTHON_3_7
});
它将从poetry文件、管道文件或requiremenets.txt安装依赖项
发布于 2021-11-04 00:31:34
为Python创建Lambda层。将所有依赖项打包为zip文件,并将其上传到创建的层。请参考相同https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html的链接
https://stackoverflow.com/questions/69833190
复制相似问题