如何使用 Javascript AWS CDK 部署 Python AWS Lambda 及其依赖项?
How to deploy Python AWS Lambda with its dependencies using Javascript AWS CDK?
我有一个使用 javascript 构建的 AWS CDK 堆栈。 Stack 有多个 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 指的是我要导入的任何包名称)
我的javascriptCDK库代码是这样的:
// 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": []
}
为 Python 创建一个 Lambda 层。将所有依赖项打包为 zip 文件并将其上传到创建的层。
请参考 link 相同 https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
使用 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
});
它将从诗歌文件、pipfile 或 requiremenets.txt
安装依赖项
我的解决方案
首先,我使用
在 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],
})
我有一个使用 javascript 构建的 AWS CDK 堆栈。 Stack 有多个 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 指的是我要导入的任何包名称)
我的javascriptCDK库代码是这样的:
// 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": []
}
为 Python 创建一个 Lambda 层。将所有依赖项打包为 zip 文件并将其上传到创建的层。 请参考 link 相同 https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
使用 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
});
它将从诗歌文件、pipfile 或 requiremenets.txt
安装依赖项我的解决方案
首先,我使用
在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],
})