创建 Docker 映像的基本 AWS Lambda 项目 - AWS 带有 Amazon Q 的工具包

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

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

你可以使用 Visual Studio 的 Toolkit for Visual Studio 将你的 AWS Lambda 函数部署为 Docker 镜像。使用 Docker,您可以更好地控制自己的运行时间。例如,您可以选择自定义运行时,例如.NET 8.0。您可以像部署任何其他容器映像一样部署 Docker 映像。本教程与教程:基本 Lambda 项目非常相似,但有两个区别:

  • 项目中包含一个 Dockerfile。

  • 选择了备用发布配置。

有关 Lambda 容器映像的信息,请参阅《AWS Lambda 开发人员指南》中的 Lambda 部署包

有关使用 Lambda 的更多信息 AWS Toolkit for Visual Studio,请参阅本用户指南 AWS Toolkit for Visual Studio主题中的使用 AWS Lambda 模板

创建 Visual Studio .NET Core Lambda 项目

您可以使用 Lambda Visual Studio 模板和蓝图来帮助加快项目初始化的速度。Lambda 蓝图包含预先编写的函数,可简化灵活项目基础的创建。

创建 Visual Studio .NET Core Lambda 项目
  1. 从 Visual Studio 中展开 “文件” 菜单,展开 “新建”,然后选择 “项目”。

  2. 在 “新建项目” 对话框中,将 “语言”、“平台” 和 “项目类型” 下拉框设置为 “全部”,然后aws lambda在 “搜索” 字段中键入。选择 AWS Lambda 项目(.NET 核心-C#)模板

  3. 在 “项目名称” 字段中输入AWSLambdaDocker,指定您的文件位置,然后选择 “创建”。

  4. “选择蓝图” 页面上,选择 .NET 8(容器映像)蓝图,然后选择 “完成” 创建 Visual Studio 项目。您可以现在复查项目的结构和代码。

查看项目文件

以下各节探讨 .NET 8(容器镜像)蓝图创建的三个项目文件:

  1. Dockerfile

  2. aws-lambda-tools-defaults.json

  3. Function.cs

1. Dockerfile

A Dockerfile 执行三个主要操作:

  • FROM:建立用于此映像的基础映像。此基础映像包含 .NET 运行时系统、Lambda 运行时系统以及为 Lambda .NET 进程提供入口点的 shell 脚本。

  • WORKDIR:将图像的内部工作目录建立为/var/task

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

以下是您可以指定的可选Dockerfile操作:

  • ENTRYPOINT:基础映像已经包含一个ENTRYPOINT,即启动映像时执行的启动过程。如要指定自己的入口点,可以覆盖该基本入口点。

  • CMD: 指示您要执行 AWS 哪个自定义代码。这要求自定义方法有一个完全限定名称。此行可以直接包含在 Dockerfile 中,也可以在发布过程中指定。

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

以下是.NET 8(容器镜像)蓝图创建的 Dockerfile 的示例。

FROM public.ecr.aws/lambda/dotnet:8 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/lambda-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/lambda-publish" .

2。 aws-lambda-tools-defaults.json

aws-lambda-tools-defaults.json文件用于为 Visual Studio 的 Toolkit for Visual Studio 部署向导和.NET Core CLI 指定默认值。以下列表描述了可在aws-lambda-tools-defaults.json文件中设置的字段。

  • profile: 设置您的 AWS 个人资料。

  • region:设置您的资源存储 AWS 区域。

  • configuration:设置用于发布函数的配置。

  • package-type:将部署包类型设置为容器映像或.zip 文件存档。

  • function-memory-size:设置函数的内存分配(以 MB 为单位)。

  • function-timeout: 超时是 Lambda 函数可以运行的最大时间(以秒为单位)。您可以以 1 秒为增量调整此值,最大值为 15 分钟。

  • docker-host-build-output-dir:设置生成过程的输出目录,该目录与中的指令相关联。Dockerfile

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

以下是 aws-lambda-tools-defaults .NET 8(容器镜像)蓝图创建的.json 示例。

{ "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-west-2", "configuration": "Release", "package-type": "image", "function-memory-size": 512, "function-timeout": 30, "image-command": "AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler", "docker-host-build-output-dir": "./bin/Release/lambda-publish" }

3. Function.cs

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

发布到 Lambda

构建过程中生成的 Docker 映像上传到 Amazon Elastic Container Registry(Amazon ECR)。Amazon ECR 一个完全托管式 Docker 容器映像库,您可以使用该映像库存储、管理和部署 Docker 容器映像。Amazon ECR 托管映像,然后 Lambda 会引用该映像,以便在调用时提供编程的 Lambda 功能。

将函数发布到 Lambda
  1. 解决方案资源管理器中,打开(右键单击)项目的快捷菜单,然后选择 “发布” AWS Lambda以打开 “上传 Lambda 函数” 窗口。

  2. 在上传 Lambda 函数页面上,执行以下操作:

    用于将基于图像的 Lambda 函数发布到的上传屏幕 AWS
    1. 对于包类型Image 已被自动选为包类型,因为发布向导在项目中检测到了 Dockerfile

    2. 对于函数名称,为 Lambda 实例输入显示名称。此名称是在 Visual Studio 的 AWS 各区服务浏览器中和 AWS Management Console中显示的引用名称。

    3. 对于描述,输入要在 AWS Management Console中与您的实例一起显示的文本。

    4. 对于映像命令,输入希望 Lambda 函数运行的方法的完全限定路径:AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler

      注意

      此处输入的任何方法名称都将覆盖 Dockerfile 中的任何 CMD 指令。只有在 Dockerfile 包含用于指示如何启动 Lambda 函数的 CMD 时,输入映像命令才是可选的。

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

    6. 对于映像标签,输入一个 Docker 标签以与存储库中的映像相关联。

    7. 选择下一步

  3. 高级函数详细信息页面的角色名称中,选择与您的账户关联的角色。该角色用于为函数中的代码所发起的任何 Amazon Web Services 调用提供临时凭证。如果您没有角色,请选择 “基于 AWS 托管策略新建角色”,然后选择AWSLambdaBasicExecutionRole

    注意

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

  4. 选择 Up load 开始上传和发布过程。

    注意

    上传函数时,将显示正在上传函数页面。然后,发布过程根据配置参数构建映像,必要时创建 Amazon ECR 存储库,将映像上传到存储库,然后创建引用包含该映像的存储库的 Lambda。

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

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

    已发布函数视图页面的“测试函数”选项卡上有用于手动调用 Lambda 方法的按钮。
  6. 要查看存储库,请在 AWS 各区服务浏览器中的 Amazon Elastic Container Service 下选择存储库

    您可以随时重新打开函数:视图,方法是双击位于 AWS 各区服务浏览器AWS Lambda 节点下的已部署实例。

    注意

    如果你的 AWS 资源管理器窗口未打开,你可以通过 “视图”-> “AWS 资源管理器” 将其停靠

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

清理

如果您不打算继续使用此示例进行开发,请记得删除已部署的函数和 ECR 映像,这样就不会为账户中未使用的资源付费。

  • 右键单击位于 AWS 各区服务浏览器AWS Lambda 节点下的已部署实例,即可删除函数。

  • 可以在 AWS 各区服务浏览器中的 Amazon Elastic Container Service -> 存储库下删除存储库。

后续步骤

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

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