为 AWS Lambda 创建 Python 库 ZIP

creating python library zip for aws lambda

提问人:WindSwept 提问时间:7/14/2021 更新时间:7/12/2023 访问量:2171

问:

我有一些使用 Visual Studio 开发的 python 代码。我想在 aws 中将此 python 代码作为 lambda 函数运行。为此,我需要创建一个包含代码及其使用的库的 zip 包。

我是否可以简单地将软件包依赖项从其安装目录复制到另一个目录,然后将其压缩以上传到 aws?

谢谢。

蟒蛇 amazon-web-services aws-lambda

评论


答:

1赞 Ryan Schaefer 7/14/2021 #1

基于 https://docs.aws.amazon.com/lambda/latest/dg/python-package-create.html#python-package-create-with-dependency

您的依赖项需要位于要上传的任何目录的根目录下。

deployment/
├─ handler.py
├─ dependency1/
│  ├─ ...files
├─ dependency2/
│  ├─ ...files

因此,亚马逊本质上得到的是一个平面目录中的所有代码。


一种更简单的开发方法是使用 AWS Sam 为您构建和部署这些软件包。然后,您只需要一个 requirements.txt,它将使用以下命令自动为您打包和部署它。

您确实需要学习模板格式 (https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html),但它在轻松重新创建函数方面极大地加快了您的开发速度。

下面是上述函数的示例:

Transform: AWS::Serverless-2016-10-31

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: handler.main
      Runtime: python3.8
      CodeUri: .

然后我在我的目录中只需要 ,a with 和 in it,以及上面的模板(默认命名)handler.pyrequirements.txtdependency1dependency2template.yml

然后,您可以使用它来构建、测试和部署到 AWS。sam buildsam local invokesam deploy

0赞 Sovan Misra 7/14/2021 #2

在这种情况下,如果要将依赖项与实际代码分开,则可以将它们作为层。AWS Lambda 提供了此可共享层,可以保存 dePandancis。如果需要,还可以在不同的 Lambda 函数中使用 depandancis。

请遵循以下来自 aws 的文档,了解如何为 Python 创建层。https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

为了提高可维护性,您还可以使用 SAM 或 CDK 自动将更改推送到 Lambda,而无需手动上传压缩版本。谢谢!

评论

0赞 WindSwept 7/14/2021
将依赖项放入 zip 文件的过程是什么。例如,如果我需要使用 requests 库,是否可以将 requests 文件夹复制到另一个文件夹,然后将其压缩起来,或者是否需要使用 pip 安装到该文件夹,然后将其压缩起来。我发现 aws 文档不清楚。
0赞 Sovan Misra 7/14/2021
medium.com/the-cloud-architect/......
0赞 Sovan Misra 7/14/2021
查看上面的链接是否有助于创建具有去显示的图层。如果没有,将尝试解释该过程。
0赞 WindSwept 7/14/2021
好的,所以我按照这个例子,它奏效了。如果我需要导入请求库,我是否也会做同样的事情 - 只需复制请求库文件夹(和相关文件夹)并将其压缩并上传到 aws?
0赞 WindSwept 7/14/2021
当我尝试将请求安装到我的文件夹时,出现以下错误:C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe:没有名为 install.__main__ 的模块;'install' 是一个包,不能直接执行,这是什么意思?
1赞 Sunil Ram 7/12/2023 #3

在此示例中,我将使用“requests”模块。

  1. 导航到包含lambda_function.py的项目目录 源代码文件,然后运行以下命令。

pip install --target ./ 请求

  1. 所有依赖项都将在项目目录中创建。

  2. 像下面的结构一样将它们全部压缩。

├my_deployment_package.zip ├──bin/ ├──requests/


├──...AllOtherFolders/
├──lambda_function.py

  1. 在您的 lambda 函数中上传 zip 文件。
  2. 从那时起,您可以在 AWS 控制台中编辑 lambda_function.py 文件。