使用 .zip 文件归档部署 Python Lambda 函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 .zip 文件归档部署 Python Lambda 函数

您的 Amazon Lambda 函数代码由脚本或编译的程序及其依赖项组成。您可以使用部署程序包将函数代码部署到 Lambda。Lambda 支持两种类型的部署程序包:容器镜像和 .zip 文件归档。

要为 .zip 文件归档创建部署程序包,可以使用内置的 .zip 文件归档实用工具或任何其他 .zip 文件实用工具(例如 7zip)作为命令行工具。将 .zip 文件用作部署程序包,需遵循以下要求:

  • .zip 文件会包含函数的代码以及用于在 Lambda 上运行函数代码的所有依赖项(如果适用)。如果函数仅依赖于标准库或 Amazon 开发工具包库,则 .zip 文件中无需包含这些库。受支持的 Lambda 运行时环境中包含这些库。

  • 如果 .zip 文件大于 50 MB,我们建议将其从 Amazon Simple Storage Service (Amazon S3) 存储桶上载到您的函数。

  • 如果您的部署程序包包含本机库,则可以使用Amazon Serverless Application Model(Amazon SAM) 构建部署程序包。您可以将 Amazon SAM CLI sam build 命令与 --use-container 配合使用来创建部署程序包。此选项在与 Lambda 执行环境兼容的 Docker 映像内构建部署程序包。

    有关更多信息,请参阅 Amazon Serverless Application Model 开发人员指南中的 sam build

  • 您需要构建部署程序包才能与函数的此指令集架构兼容。

  • Lambda 使用 POSIX 文件权限,因此在创建 .zip 文件归档之前,您可能需要为部署程序包文件夹设置权限

注意

Python 程序包可能包含 __init__.py 文件中的初始化代码。在 Python 3.9 之前,Lambda 没有为函数处理程序的目录或父目录中的包运行 __init__.py 代码。在 Python 3.9 及更高版本中,Lambda 在初始化期间为这些目录中的包运行 init 代码。

请注意,Lambda 仅在执行环境首次初始化时运行 init 代码,而不会为该初始化环境中的每个函数调用运行该代码。

先决条件

您需要 Amazon Command Line Interface(Amazon CLI)来调用服务 API 操作。要安装 Amazon CLI,请参阅 Amazon Command Line Interface 用户指南中的安装 Amazon CLI

什么是运行时依赖项?

创建或更新具有或不具有运行时依赖项的 Lambda 函数时,需要部署程序包。部署程序包充当源代码包,用于在 Lambda 上运行函数的代码和依赖项(如果适用)。

依赖项可以是任何包、模块或其他程序集依赖项,不包含在 Lambda 运行时环境中的函数代码。

以下示例描述了不具有运行时依赖项的 Lambda 函数:

  • 如果函数的代码位于 Python 3.8 或更新版本中,且它仅依赖于标准的 Python 数学和日志记录库,则 .zip 文件无需中包含这些库。Python 运行时中包含这些库。

  • 如果函数的代码依赖于 Amazon SDK for Python (Boto3),则 .zip 文件中无需包含 boto3 库。Python 3.8 和更新版本的运行时中包含这些库。

请注意:Lambda 会定期更新 Boto3 库,以支持最新的功能集和安全更新。要完全控制您的函数所用的依赖项,请使用部署程序包来打包所有依赖项。

没有依赖关系的部署程序包

创建用作部署程序包的 .zip 文件。

创建部署程序包
  1. 打开命令提示符并创建 my-math-function 项目目录。例如,在 macOS 上,请执行以下操作:

    mkdir my-math-function
  2. 导航到 my-math-function 项目目录。

    cd my-math-function
  3. 从 GitHub 中复制 Python 示例代码的内容,并且使用名为 lambda_function.py 的新文件将其保存。您的目录结构应如下所示:

    my-math-function$ | lambda_function.py
  4. lambda_function.py 文件添加到 .zip 文件的根目录。

    zip my-deployment-package.zip lambda_function.py

    这样会在您的项目目录中生成一个 my-deployment-package.zip 文件。该命令将生成以下输出:

    adding: lambda_function.py (deflated 50%)

有依赖关系的部署程序包

创建用作部署程序包的 .zip 文件。

创建部署程序包
  1. 打开命令提示符并创建 my-sourcecode-function 项目目录。例如,在 macOS 上,请执行以下操作:

    mkdir my-sourcecode-function
  2. 导航到 my-sourcecode-function 项目目录。

    cd my-sourcecode-function
  3. 复制以下 Python 示例代码的内容,并且使用名为 lambda_function.py 的新文件将其保存:

    import requests def lambda_handler(event, context): response = requests.get("https://www.example.com/") print(response.text) return response.text

    您的目录结构应如下所示:

    my-sourcecode-function$ | lambda_function.py
  4. 在新的 package 目录中安装请求库。

    pip install --target ./package requests
  5. 使用已安装库在根目录下创建部署程序包。

    cd package zip -r ../my-deployment-package.zip .

    这样会在您的项目目录中生成一个 my-deployment-package.zip 文件。该命令将生成以下输出:

    adding: chardet/ (stored 0%) adding: chardet/enums.py (deflated 58%) ...
  6. lambda_function.py 文件添加到 zip 文件的根目录。

    cd .. zip my-deployment-package.zip lambda_function.py

使用虚拟环境

使用虚拟环境更新 Python 函数
  1. 激活虚拟环境。例如:

    ~/my-function$ source myvenv/bin/activate
  2. 使用 pip 安装库。

    (myvenv) ~/my-function$ pip install requests
  3. 停用虚拟环境。

    (myvenv) ~/my-function$ deactivate
  4. 使用已安装库在根目录下创建部署程序包。

    ~/my-function$cd myvenv/lib/python3.8/site-packages zip -r ../../../../my-deployment-package.zip .

    最后一个命令将部署程序包保存到 my-function 目录的根目录中。

    提示

    库可能会出现在 site-packages 或者 dist-packages 和第一个文件夹 lib 或者 lib64。您可以使用 pip show 命令查找特定软件包。

  5. 将函数代码文件添加到部署程序包的根目录中。

    ~/my-function/myvenv/lib/python3.8/site-packages$ cd ../../../../ ~/my-function$ zip -g my-deployment-package.zip lambda_function.py

    完成此步骤后,文件目录结构应如下:

    my-deployment-package.zip$ │ lambda_function.py │ __pycache__ │ certifi/ │ certifi-2020.6.20.dist-info/ │ chardet/ │ chardet-3.0.4.dist-info/ ...

将您的 .zip 文件部署到函数

要将新代码部署到您的函数,请上载新的 .zip 文件部署程序包。您可以使用 Lambda 控制台将 .zip 文件上载到函数,也可以使用 UpdateFunctionCode CLI 命令。

以下示例上载名为 my-deployment-package.zip 的文件。使用 fileb:// 文件前缀将二进制 .zip 文件上载到 Lambda。

~/my-function$ aws lambda update-function-code --function-name MyLambdaFunction --zip-file fileb://my-deployment-package.zip { "FunctionName": "mylambdafunction", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:mylambdafunction", "Runtime": "python3.9", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 5912988, "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f", ... }