AWS Lambda
开发人员指南

Python 中的 AWS Lambda 部署程序包

部署程序包是包含函数代码和依赖项的 ZIP 存档。如果您使用 Lambda API 管理函数,或者需要包含 AWS 开发工具包以外的库和依赖项,则需要创建部署程序包。您可以将程序包直接上传到 Lambda,也可以使用 Amazon S3 存储桶、然后再将其上传到 Lambda。如果部署包大于 50 MB,则必须使用 Amazon S3。

如果您使用 Lambda 控制台编辑器编写您的函数,则控制台会管理部署程序包。如果您不需要添加任何库,则可以使用此方法。您也可以使用此方法更新在部署程序包中已经存在库的函数,前提是总大小不超过 3 MB。

注意

您可以使用 AWS SAM CLI build 命令为 Python 函数代码和依赖项创建部署包。AWS SAM CLI 还提供了在与 Lambda 执行环境兼容的 Docker 镜像内构建部署包的选项。有关说明,请参阅《AWS SAM 开发人员指南》中的构建具有依赖项的应用程序

先决条件

以下说明假定您已有一个函数。如果您尚未创建函数,请参阅使用 Python 构建 Lambda 函数

为了遵循本指南中的步骤,您需要命令行终端或外壳,以便运行命令。命令显示在列表中,以提示符 ($) 和当前目录名称(如果有)开头:

~/lambda-project$ this is a command this is output

对于长命令,使用转义字符 (\) 将命令拆分到多行中。

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

更新没有依赖项的函数

要使用 Lambda API 创建或更新函数,请创建包含函数代码的存档,并使用 AWS CLI 上传。

更新没有依赖项的 Python 函数

  1. 创建 ZIP 存档。

    ~/my-function$ zip function.zip function.py adding: function.py (deflated 17%)
  2. 使用 update-function-code 命令上传程序包。

    ~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "python3.7", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 815, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2018-11-20T20:41:16.647+0000", "CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=", "Version": "$LATEST", "VpcConfig": { "SubnetIds": [], "SecurityGroupIds": [], "VpcId": "" }, "TracingConfig": { "Mode": "Active" }, "RevisionId": "d1e983e3-ca8e-434b-8dc1-7add83d72ebd" }

更新具有额外依赖项的函数

如果您的函数依赖于 适用于 Python 的 开发工具包 (Boto3) 之外的库,请使用 pip 将它们安装到本地目录中,并将它们包含在部署包程序中。

更新有依赖项的 Python 函数

  1. 使用 pip--target 选项在新的项目本地 package 目录中安装库。

    ~/my-function$ pip install --target ./package Pillow Collecting Pillow Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl Installing collected packages: Pillow Successfully installed Pillow-5.3.0

    注意

    为了使 --target 能够在基于 Debian 的系统(例如 Ubuntu)上正常工作,可能还需要传递 --system 标志来避免 distutils 错误。

  2. 创建包含依赖项的 ZIP 存档。

    ~/my-function$ cd package ~/my-function/package$ zip -r9 ${OLDPWD}/function.zip . adding: PIL/ (stored 0%) adding: PIL/.libs/ (stored 0%) adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%) adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%) adding: PIL/.libs/liblcms2-a6801db4.so.2.0.8 (deflated 67%) ...
  3. 将您的函数代码添加到存档中。

    ~/my-function/package$ cd $OLDPWD ~/my-function$ zip -g function.zip function.py adding: function.py (deflated 56%)
  4. 更新函数代码。

    ~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "python3.7", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 2269409, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2018-11-20T20:51:35.871+0000", "CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=", "Version": "$LATEST", "VpcConfig": { "SubnetIds": [], "SecurityGroupIds": [], "VpcId": "" }, "TracingConfig": { "Mode": "Active" }, "RevisionId": "a9c05ffd-8ad6-4d22-b6cd-d34a00c1702c" }

使用虚拟环境

有些情况下,您可能需要使用虚拟环境来安装函数的依赖项。如果您的函数或其依赖项依赖于本机库,或者您使用 Homebrew 安装 Python,则会发生这种情况。

使用虚拟环境更新 Python 函数

  1. 创建虚拟环境。

    ~/my-function$ virtualenv v-env Using base prefix '~/.local/python-3.7.0' New python executable in v-env/bin/python3.7 Also creating executable in v-env/bin/python Installing setuptools, pip, wheel... done.

    注意

    对于 Python 3.3 及更高版本,可以使用内置的 venv 模块创建虚拟环境,而不是安装 virtualenv

    ~/my-function$ python3 -m venv v-env
  2. 激活环境。

    ~/my-function$ source v-env/bin/activate (v-env) ~/my-function$
  3. 使用 pip 安装库。

    (v-env) ~/my-function$ pip install Pillow Collecting Pillow Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl Installing collected packages: Pillow Successfully installed Pillow-5.3.0
  4. 停用虚拟环境。

    (v-env) ~/my-function$ deactivate
  5. 使用库内容创建一个 ZIP 存档。

    ~/my-function$ cd v-env/lib/python3.7/site-packages ~/my-function/v-env/lib/python3.7/site-packages$ zip -r9 ${OLDPWD}/function.zip . adding: easy_install.py (deflated 17%) adding: PIL/ (stored 0%) adding: PIL/.libs/ (stored 0%) adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%) adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%) ...

    根据库的情况,依赖项可能出现在 site-packagesdist-packages 中,而虚拟环境中的第一个文件夹可能是 liblib64。可以使用 pip show 命令来定位特定包。

  6. 将您的函数代码添加到存档中。

    ~/my-function/v-env/lib/python3.7/site-packages$ cd $OLDPWD ~/my-function$ zip -g function.zip function.py adding: function.py (deflated 56%)
  7. 更新函数代码。

    ~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "python3.7", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 5912988, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2018-11-20T21:08:26.326+0000", "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "VpcConfig": { "SubnetIds": [], "SecurityGroupIds": [], "VpcId": "" }, "TracingConfig": { "Mode": "Active" }, "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f" }