教程:在 Python 3.8 中创建 Lambda 函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

教程:在 Python 3.8 中创建 Lambda 函数

本教程将指导构建代码和资产,从而在 Python 3.8 中使用 Amazon Command Line Interface (Amazon CLI) 创建 Lambda 函数。

先决条件

本小节介绍完成本教程中的步骤所需的工具和资源。

安装 Amazon CLI

Amazon CLI 是一种开源工具,让您能够在命令行 Shell 中使用命令与 Amazon 服务进行交互。要完成本节中的步骤,您必须满足以下条件:

创建执行角色

您的 Lambda 函数的执行角色是 Amazon Identity and Access Management (IAM) 角色,用于向您的函数授予 Amazon 服务和资源的访问权限。在 IAM 中创建具有调用权限的执行角色。

创建执行角色

  1. 打开命令提示符并使用 create-role 命令创建名为 lambda-ex 的执行角色。

    macOS/Linux
    aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
    Windows
    aws iam create-role --role-name lambda-ex --assume-role-policy-document "{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}"

    此命令将生成以下输出。在 Arn 中保存返回的值。

    { "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAWNZPPVHULXRJXQJD5", "Arn": "arn:aws-cn:iam::your-account-id:role/lambda-ex", "CreateDate": "2021-01-05T18:00:30Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }
  2. 使用 attach-role-policy 命令,为角色添加 AWSLambdaBasicExecutionRole 权限。

    $ aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws-cn:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

    此命令不会生成任何输出。

创建没有运行时依赖项的函数

依赖项可以是函数代码的 Lambda 运行时环境中未包含的任何程序包、模块或其他程序集依赖项。有关更多信息,请参阅 什么是运行时依赖项?

有关更多信息,请参阅 什么是运行时依赖项?

本小节介绍如何创建没有运行时依赖项的 Lambda 函数。

概述

在本教程中,您将在 GitHub 上使用 Amazon SDK for Python (Boto3) 项目中的示例代码,通过 Amazon CLI 创建 Lambda 函数。您将了解如何:

  • 设置部署程序包(.zip 文件)的目录结构。

  • 为没有任何运行时依赖项的 Lambda 函数创建部署程序包。

  • 使用 Amazon CLI 上传部署程序包并创建 Lambda 函数。

  • 调用 Lambda 函数以返回数学计算结果。

示例代码包含标准的数学和日志记录 Python 库,用于根据用户输入返回计算结果。python3.8 运行时中包含标准 Python 库。虽然该函数的代码不依赖于任何其他 Python 库,也没有额外的应用程序依赖项,但是 Lambda 仍然需要部署程序包来创建函数。

创建部署程序包

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

创建 Lambda 用作部署程序包的 .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%)

创建 Lambda 函数

Lambda 需要了解函数代码使用的运行时环境、函数代码中的处理程序,以及可用于调用函数的执行角色

使用您在之前的步骤中创建的执行角色和部署程序包创建 Lambda 函数。

创建函数

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

    cd my-math-function
  2. 创建名为 my-math-function 的函数。Substitute the value for role with the Arn you copied in previous steps.

    aws lambda create-function --function-name my-math-function --zip-file fileb://my-deployment-package.zip --handler lambda_function.lambda_handler --runtime python3.8 --role arn:aws-cn:iam::your-account-id:role/lambda-ex

    此命令将生成以下输出:

    { "FunctionName": "my-math-function", "FunctionArn": "arn:aws-cn:lambda:us-east-1:123456789012:function:my-math-function", "Runtime": "python3.8", "Role": "arn:aws-cn:iam::123456789012:role/lambda-ex", "Handler": "lambda_function.lambda_handler", "CodeSize": 753, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2021-01-05T18:39:44.847+0000", "CodeSha256": "82RtIE7p1ET5Od6bk4xSleJbUybUnZX52m92x/fEH84=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "589e5115-f3c0-446c-bc62-4e05cf0a3c85", "State": "Active", "LastUpdateStatus": "Successful" }

    本步骤中的 Lambda 函数使用 lambda_function.lambda_handler 的函数处理程序。有关函数处理程序命名约定的更多信息,请参阅 Python 中的 Amazon Lambda 函数处理程序 中的命名

调用 Lambda 函数

使用为示例代码定义的事件输入同步调用 Lambda 函数。有关更多信息,请参阅 Python 中的 Amazon Lambda 函数处理程序中的工作原理

调用函数

  • 使用 invoke 命令。

    aws lambda invoke --function-name my-math-function --payload '{"action": "square","number": 3}' output.txt
    注意

    如果您使用的是 Amazon CLI 版本 2,请添加以下命令参数:

    --cli-binary-format raw-in-base64-out

    此命令将生成以下输出:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    对于 RequestResponse 调用类型,状态代码为 200。有关更多信息,请参阅 Invoke API 参考。

    您应该会在 output.txt 中看到以下数学计算结果:

    {"result": 9}

接下来做什么?

清除资源

如果您不想保留为本教程创建的资源,可以立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。

删除 Lambda 函数

  • 使用 delete-function 命令。

    aws lambda delete-function --function-name my-function

    此命令不会生成任何输出。

删除执行角色策略

  • 使用 delete-policy 命令。

    aws iam delete-role-policy --role-name lambda-ex --policy-name AWSLambdaBasicExecutionRole

删除执行角色

  • 使用 delete-role 命令。

    aws iam delete-role --role-name lambda-ex

创建具有运行时依赖项的函数

依赖项可以是函数代码的 Lambda 运行时环境中未包含的任何程序包、模块或其他程序集依赖项。有关更多信息,请参阅 什么是运行时依赖项?

有关更多信息,请参阅 什么是运行时依赖项?

本小节介绍如何创建具有运行时依赖项的 Lambda 函数。

概述

在本教程中,您将使用示例代码通过 Amazon CLI 创建 Lambda 函数。示例代码使用请求库获取 https://www.test.com/ 的源代码。python3.8 运行时不包含请求库,因此您需要在 package 目录中安装该库。

您将了解如何:

  • 设置部署程序包(.zip 文件)的目录结构。

  • 为具有运行时依赖项的 Lambda 函数创建部署程序包。

  • 使用 Amazon CLI 上传部署程序包并创建 Lambda 函数。

  • 调用 Lambda 函数以返回源代码。

创建部署程序包

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

创建 Lambda 用作部署程序包的 .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 main(event, context): response = requests.get("https://www.test.com/") print(response.text) return response.text if __name__ == "__main__": main('', '')

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

    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 -g my-deployment-package.zip lambda_function.py

创建 Lambda 函数

Lambda 需要了解函数代码使用的运行时环境、函数代码中的处理程序,以及可用于调用函数的执行角色

使用您在之前的步骤中创建的执行角色和部署程序包创建 Lambda 函数。

创建函数

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

    cd my-sourcecode-function
  2. 创建名为 my-sourcecode-function 的函数。Substitute the value for role with the Arn you copied in previous steps.

    aws lambda create-function --function-name my-sourcecode-function --zip-file fileb://my-deployment-package.zip --handler lambda_function.main --runtime python3.8 --role arn:aws-cn:iam::your-account-id:role/lambda-ex

    此命令将生成以下输出:

    { "FunctionName": "my-sourcecode-function", "FunctionArn": "arn:aws-cn:lambda:us-east-1:123456789012:function:my-sourcecode-function", "Runtime": "python3.8", "Role": "arn:aws-cn:iam::123456789012:role/lambda-ex", "Handler": "lambda_function.main", "CodeSize": 753, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2021-01-11T18:39:44.847+0000", "CodeSha256": "82RtIE7p1ET5Od6bk4xSleJbUybUnZX52m92x/fEH84=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "589e5115-f3c0-446c-bc62-4e05cf0a3c85", "State": "Active", "LastUpdateStatus": "Successful" }

    本步骤中的 Lambda 函数使用 lambda_function.main 的函数处理程序。有关函数处理程序命名惯例的更多信息,请参阅 Python 中的 Amazon Lambda 函数处理程序中的 命名

调用 Lambda 函数

使用为示例代码定义的事件输入同步调用 Lambda 函数。有关更多信息,请参阅 Python 中的 Amazon Lambda 函数处理程序中的工作原理

调用函数

  • 使用 invoke 命令。

    macOS/Linux
    aws lambda invoke --function-name my-sourcecode-function --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt
    Windows
    aws lambda invoke --function-name my-sourcecode-function --cli-binary-format raw-in-base64-out --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt
    注意

    如果您使用的是 Amazon CLI 版本 2,请添加以下命令参数:

    --cli-binary-format raw-in-base64-out

    此命令将生成以下输出:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    对于 RequestResponse 调用类型,状态代码为 200。有关更多信息,请参阅 Invoke API 参考。

    您应该会在 output.txt 中看到源代码。

接下来做什么?

清除资源

如果您不想保留为本教程创建的资源,可以立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。

删除 Lambda 函数

  • 使用 delete-function 命令。

    aws lambda delete-function --function-name my-function

    此命令不会生成任何输出。

删除执行角色策略

  • 使用 delete-policy 命令。

    aws iam delete-role-policy --role-name lambda-ex --policy-name AWSLambdaBasicExecutionRole

删除执行角色

  • 使用 delete-role 命令。

    aws iam delete-role --role-name lambda-ex