首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Javascript AWS CDK部署Python AWS Lambda及其依赖项?

如何使用Javascript AWS CDK部署Python AWS Lambda及其依赖项?
EN

Stack Overflow用户
提问于 2021-11-04 00:21:11
回答 3查看 778关注 0票数 1

我有一个使用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
运行
复制
// 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中安装了依赖项

代码语言:javascript
运行
复制
pip install x
pip install --target ./package x
pip install -t python/ x

之后我拉上了拉链

我的python代码是用assets/lambdapy/py1.py编写的

代码语言:javascript
运行
复制
# 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时,我得到

代码语言:javascript
运行
复制
{
  "errorMessage": "Unable to import module 'py1': No module named 'x'",
  "errorType": "Runtime.ImportModuleError",
  "stackTrace": []
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-20 05:42:38

我的解决方案

首先,我在assets/lambdapylibs中安装了两个依赖项(一个在本地机器上工作,另一个在lambda上工作),使用以下命令

代码语言:javascript
运行
复制
# 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

代码语言:javascript
运行
复制
import x

def handler(event, context):
    return { 
        'statusCode': 200
    }

第三,我在javascript CDK库中添加了一个层。图层具有python依赖项。

代码语言:javascript
运行
复制
// 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],
})
票数 0
EN

Stack Overflow用户

发布于 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示例:

代码语言:javascript
运行
复制
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安装依赖项

票数 3
EN

Stack Overflow用户

发布于 2021-11-04 00:31:34

为Python创建Lambda层。将所有依赖项打包为zip文件,并将其上传到创建的层。请参考相同https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html的链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69833190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档