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

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

创建 Docker 镜像的基础Amazon Lambda项目

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

  • 项目中包含一个 Dockerfile

  • 修改后的发布配置

有关 Lambda 容器镜像的信息,请参阅《Amazon Lambda开发者指南》中的 Lambda 部署包

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

创建 Visual Studio .NET 核心 Lam

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

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

  2. 请执行下列操作之一:

    • 对于 Visual Studio 2017,在 “新建项目” 对话框中,展开 “已安装”,展开 Visu al C#,选择,选择 “Amazon Lambda项目 (.NET Core-C#)” 模板,然后选择 “确定”Amazon Lambda

    • 对于 Visual Studio 2019,在 “新建项目” 对话框中,确保 “语言”、“平台” 和 “项目类型” 下拉框设置为 “全部”,然后aws lambda在 “搜索” 字段中键入。然后选择Amazon Lambda项目 (.NET Core-C#) 模板并选择 “下一步”。

  3. 请执行下列操作之一:

    • 对于 Visual Studio 2017AWSLambdaDocker,在 “名称” 中,输入所需的文件位置,然后选择 “确定”

    • 对于 Visual Studio 2019AWSLambdaDocker,在 “名称” 中,输入所需的文件位置,然后选择 “创建”。

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

复查项目文件

有三个项目文件需要审查:Dockerfileaws-lambda-tools-defaults.json、和Function.cs

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

来自的:

建立用于此图像的基础映像。此基础镜像提供.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,你也可以使用:

  • ENTRYPOINT:基础映像已包含ENTRYPOINT,这是启动映像时执行的启动过程。如果你想指定自己的入口点,那么你就是在重写该基本入口点。

  • CMD:CMD 指示您要执行Amazon哪个自定义代码。它要求您的自定义方法使用完全限定的名称。这行要么需要直接包含在 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

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

{ "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the Amazon 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. 解决方案资源管理器中,打开该项目的上下文(右键单击)菜单,然后选择 Publish (发布到)Amazon Lambda。

  2. 在 Tate (上传 Lambda) 页面上,执行以下操作:

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

    2. 函数名称中,输入您的 Lambda 实例的显示名称。此名称是 Visual Studio 的 “Amazon资源管理器” 和 “” 中显示的参考名称Amazon Web Services Management Console。

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

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

      注意

      此处输入的任何方法名称都将覆盖 Dockerfile 中的任何 CMD 指令。仅当您Dockerfile包含指导如何启动 Lambda 函数时CMD,输入 Im age Co mmand 才是可选的。

    5. 对于 Image Repo,输入新的或现有的 Amazon Elastic 容器注册表的名称。构建过程创建的 Docker 镜像已上传到此注册表。正在发布的 Lambda 定义将引用该亚马逊 ECR 镜像。

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

    7. 选择 Next(下一步)

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

    注意

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

  4. 请选择 Upload(上传)。

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

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

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

    
                  已发布的函数视图页面的 “测试函数” 选项卡包含用于手动调用 Lambda 方法的按钮。
  6. 要查看存储库,请在Amazon资源管理器Amazon Elastic 容器服务下选择存储库

    您可以随时重新打开 F unction: view,方法是双击位于Amazon Lambda节点下方的Amazon资源管理器中的已部署实例。

    重要

    如果你的Amazon资源管理器窗口没有打开,你可以通过 V iew-> AmazonExplorer 将其停用

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

清理

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

  • 可以通过右键单击位于Amazon资源管理器Amazon Lambda节点下方的已部署实例来删除函数。

  • 可以在Amazon资源管理器中的 Amazon Elastic 容器服务-> 存储库下删除存储库

后续步骤

有关创建和测试 Lambda 镜像的信息,请参阅在 Lam bda 中使用容器镜像

有关容器镜像部署、权限和替代配置设置的信息,请参阅配置函数