创建 Docker 映像的基本 AWS Lambda 项目 - AWS Toolkit for Visual Studio
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建 Docker 映像的基本 AWS Lambda 项目

您可以使用 Toolkit for Visual Studio 将 Lambda 函数部署为 Docker 映像。使用 Docker,您可以更好地控制运行时,例如,您可以选择自定义运行时,如 .NET 5.0。您部署 Docker 映像的方式与部署任何其他容器映像的方式相同。本教程紧密模拟 教程: 基本 Lambda 项目,有两个区别:

  • 项目中包含 Dockerfile

  • 更改的发布配置

有关 Lambda 容器映像的信息,请参阅 中的 Lambda 部署程序包AWS Lambda Developer Guide

有关设置 AWS Toolkit for Visual Studio 的先决条件和信息,请参阅在 AWS Toolkit for Visual Studio 中使用 AWS Lambda 模板

创建 Visual Studio.NET 内核 Lambda 项目

内置 Lambda Visual Studio 蓝图支持快速项目初始化。蓝图是一组标准文件和函数,用于快速演示功能,并为以后的修改提供了很好的起点。

创建 Visual Studio.NET 内核 Lambda 项目

  1. 打开 Visual Studio,在 File (文件) 菜单上,选择 New (新建)Project (项目)

  2. 执行以下任一操作:

    • 对于 Visual Studio 2017,在 New Project 对话框中,展开 Installed,展开 Visual C#,选择 AWS Lambda,选择 AWS Lambda Project (.NET Core - C#) 模板,然后选择 OK

    • 对于 Visual Studio 2019,在 New Project 对话框中,确保 LanguagePlatformProject type 下拉框设置为“All”,然后在 Search 字段中键入 aws lambda。然后选择 AWS Lambda Project (.NET Core - C#) (AWS Lambda 项目(.NET 内核 - C#)) 模板,然后选择 Next (下一步)

  3. 执行以下任一操作:

    • 对于 Visual Studio 2017,对于 Name (名称),输入 AWSLambdaDocker,输入所需文件位置,然后选择 OK (确定)

    • 对于 Visual Studio 2019,对于 Name (名称),输入 AWSLambdaDocker,输入所需的文件 Location (位置),然后选择 Create (创建)

  4. Select Blueprint 页面上,选择 .NET 5 (Container Image) 蓝图,然后选择 Finish 以创建 Visual Studio 项目。您可以现在复查项目的结构和代码。

复查项目文件

有三个项目文件需要查看:Dockerfileaws-lambda-tools-defaults.jsonFunction.cs

以下代码显示了使用所选蓝图创建的 Dockerfile。它执行三个操作:

FROM:

建立要用于此映像的基本映像。此基本映像提供了 .NET 运行时、Lambda 运行时以及为 Lambda .NET 进程提供入口点的 shell 脚本。

工作线程

将映像的内部工作目录建立为 /var/task

COPY

会将构建过程中生成的文件从本地位置复制到映像的工作目录。

FROM ecr.aws/lambda/dotnet:5.0 WORKDIR /var/task # This COPY command copies the .NET Lambda project's build artifacts from the host machine into the image. # The source of the COPY should match where the .NET Lambda project publishes its build artifacts. If the Lambda function is being built # with the AWS .NET Lambda Tooling, the `--docker-host-build-output-dir` switch controls where the .NET Lambda project # will be built. The .NET Lambda project templates default to having `--docker-host-build-output-dir` # set in the aws-lambda-tools-defaults.json file to "bin/Release/net5.0/linux-x64/publish". # # Alternatively Docker multi-stage build could be used to build the .NET Lambda project inside the image. # For more information on this approach checkout the project's README.md file. COPY "bin/Release/net5.0/linux-x64/publish" .

要进一步自定义您的 Dockerfile,您还可以 utlize:

  • ENTRYPOINT:基本映像已包含 ENTRYPOINT,这是映像启动时执行的启动过程。如果您要指定自己的入口点,则将覆盖该基本入口点。

  • CMDCMD 指示 AWS 要执行的自定义代码。它需要使用自定义方法的完全限定名称。此行需要直接包含在 Dockerfile 中,也可以在发布过程中指定。

# Example of alternative way to specify the Lambda target method rather than during the publish process. CMD [ "AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler"]

检查 aws-lambda-tools-defaults.json 文件。

  • 字段 docker-host-build-output-dir 设置与 Dockerfile 中的说明关联的构建过程的输出目录。

  • 字段 image-command 是您的方法的完全限定名称,您希望 Lambda 函数运行的代码。语法如下:{Assembly}::{Namespace}.{ClassName}::{MethodName}。 有关更多信息,请参阅处理程序签名。设置 image-command 将在此处的 Visual Studio 的“Publish (发布)”向导中预填充此值。

{ "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", "dotnet lambda help", "All the command line options for the Lambda command can be specified in this file." ], "profile": "default", "region": "us-east-2", "configuration": "Release", "package-type": "image", "function-memory-size": 256, "function-timeout": 30, "image-command": "AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler", "docker-host-build-output-dir": "./bin/Release/net5.0/linux-x64/publish" }

检查 Function.cs 文件。Function.cs 定义 c# 函数以作为 Lambda 函数公开。是在 FunctionHandler 函数运行时运行的 Lambda 功能。Lambda在此项目中,定义了一个 函数:FunctionHandler ,对输入文本调用 ToUpper()。

您的项目现在可发布到 Lambda。

发布到 Lambda

构建过程生成的 Docker 映像将上传到 Amazon Elastic Container Registry (Amazon ECR)。Amazon ECR 是一个完全托管的 Docker 容器注册表,可用于存储、管理和部署 Docker 容器映像。Amazon ECR 托管映像,Lambda 随后引用该映像以在调用时提供编程的 Lambda 功能。

将函数发布到Lambda

  1. Solution Explorer (解决方案资源管理器) 中,打开项目的上下文(右键单击)菜单,然后选择 Publish to AWS Lambda (发布到 AWS Lambda)

  2. Upload Lambda Function 页面上,执行以下操作:

    
                  将基于图像的 Lambda 函数发布到 AWS 的上传屏幕
    1. 对于 Package Type (软件包类型),已自动选择 Image 作为您的 Package Type (软件包类型),因为发布向导在项目中检测到 Dockerfile

    2. 对于 Function Name (函数名称),输入 Lambda 实例的显示名称。此名称是在 Visual Studio 中的 AWS Explorer 和 AWS 管理控制台 中显示的引用名称。

    3. 对于 Description (描述),输入要在AWS 管理控制台中与实例一起显示的文本。

    4. 对于 Image Command,输入您希望 Lambda 函数运行的方法的完全限定路径:AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler

      注意

      此处输入的任何方法名称都将覆盖 Dockerfile 中的任何 CMD 指令。输入 Image Command (映像命令) 是可选的,仅 Dockerfile 包含 CMD 以指示如何启动 Lambda 函数的 IF。

    5. 对于 Image Repo (映像存储库),输入新 Amazon Elastic Container Registry 或现有 的名称。构建过程创建的 Docker 映像将上传到此注册表。正在发布的 Lambda 定义将引用该 Amazon ECR 映像。

    6. 对于 Image Tag (映像标签),输入要与存储库中的映像关联的 Docker 标签。

    7. 选择 Next (下一步)

  3. Advanced Function Details (高级函数详细信息) 页面上的 Role Name (角色名称) 中,选择与您的账户关联的角色。该角色用于为 函数中的代码所发起的任何 AWS 服务调用提供临时凭证。如果您没有角色,请选择 New Role based on AWS Managed Policy,然后选择 AWSLambdaBasicExecutionRole。

    注意

    您的账户必须有权运行 IAM ListPolicies 操作,否则 Role Name (角色名称) 列表将为空。

  4. 选择 Upload (上传)

    上传函数时,将显示 Uploading Function 页面。然后,发布过程根据配置参数构建映像,根据需要创建 Amazon ECR 存储库,将映像上传到存储库中,并使用该映像创建引用该存储库的 Lambda。

    上传函数后,Function (函数) 页面将打开并显示新 Lambda 函数的配置。

  5. 要手动调用 Lambda 函数,请在 Test Function (测试函数) 选项卡上,在请求自由文本输入字段中输入 hello image based lambda,然后选择 Invoke (调用)。您的文本(转换为大写)将显示在 Response (响应) 中。

    
                  发布的 Function 视图页面的 Test Functions 选项卡具有手动调用 Lambda 方法的按钮。
  6. 要查看存储库,请在 AWS Explorer 中的 Amazon Elastic Container Service 下,选择 Repositories (存储库)

    您可以随时通过双击位于 AWS Explorer 中的 AWS Lambda 节点下的已部署实例来重新打开 Function: 视图。

    重要

    如果您的 AWS Explorer 窗口未打开,您可以通过 将其停靠 View -> AWS Explorer

  7. 请注意 Configuration (配置) 选项卡上的其他特定于映像的配置选项。此选项卡提供一种方法来覆盖可能已在 Dockerfile 中指定的 ENTRYPOINTCMDWORKDIR 描述是您在上传/发布期间输入的描述(如果有)。

清除

如果您不打算继续使用此示例进行开发,请记住删除已部署的 函数和 ECR 映像,以免因账户中的未使用资源而产生费用。

  • 可以通过右键单击位于 AWS Explorer 中的已部署实例来删除 函数 AWS Lambda 节点。

  • 存储库可在 下的 AWS Explorer 中删除 Amazon Elastic Container Service -> Repositories.

后续步骤

有关创建和测试 Lambda 映像的信息,请参阅将容器映像与 Lambda 结合使用

有关容器映像部署、权限和覆盖配置设置的信息,请参阅配置 函数