如何使用 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],
})