AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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
  2. 使用 update-function-code 命令上传程序包。

    ~/my-function$ aws lambda update-function-code --function-name python37 --zip-file fileb://function.zip { "FunctionName": "python37", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:python37", "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 python37 --zip-file fileb://function.zip { "FunctionName": "python37", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:python37", "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 python37 --zip-file fileb://function.zip { "FunctionName": "python37", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:python37", "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" }