创建 Docker 映像的基本 AWS Lambda 项目
您可以使用 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 项目
-
在 Visual Studio 中,展开文件菜单,展开新建,然后选择项目。
-
在新建项目对话框中,将语言、平台和项目类型下拉框都设置为“全部”,然后在搜索字段中键入
aws lambda。选择 AWS Lambda 项目(.NET Core - C#)模板。 -
在项目名称字段中输入
AWSLambdaDocker,指定您的文件位置,然后选择创建。 -
在选择蓝图页面上,选择 .NET 8(容器映像)蓝图,然后选择完成,以创建 Visual Studio 项目。您可以现在复查项目的结构和代码。
审查项目文件
以下各节分析了 .NET 8(容器映像)蓝图创建的三个项目文件:
-
Dockerfile -
aws-lambda-tools-defaults.json -
Function.cs
1. Dockerfile
一个 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 文件用于为 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 的“发布”向导中预填充此值。
以下是 .NET 8(容器映像)蓝图创建的 aws-lambda-tools-defaults.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
-
在解决方案浏览器中,(右键单击)打开项目的上下文菜单,然后选择发布到 AWS Lambda 以打开上传 Lambda 函数窗口。
-
在上传 Lambda 函数页面上,执行以下操作:
-
对于包类型,
Image已被自动选为包类型,因为发布向导在项目中检测到了Dockerfile。 -
对于函数名称,为 Lambda 实例输入显示名称。此名称是在 Visual Studio 的 AWS 各区服务浏览器中和 AWS 管理控制台中显示的引用名称。
-
对于描述,输入要在 AWS 管理控制台中与您的实例一起显示的文本。
-
对于映像命令,输入希望 Lambda 函数运行的方法的完全限定路径:
AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler注意
此处输入的任何方法名称都将覆盖 Dockerfile 中的任何 CMD 指令。只有在
Dockerfile包含用于指示如何启动 Lambda 函数的CMD时,输入映像命令才是可选的。 -
对于映像存储库,输入新的或现有 Amazon Elastic Container Registry 的名称。构建过程创建的 Docker 映像将上传到此映像库。要发布的 Lambda 定义将引用该 Amazon ECR 映像。
-
对于映像标签,输入一个 Docker 标签以与存储库中的映像相关联。
-
选择下一步。
-
-
在高级函数详细信息页面的角色名称中,选择与您的账户关联的角色。该角色用于为函数中的代码所发起的任何 Amazon Web Services 调用提供临时凭证。如果您没有角色,请选择基于 AWS 托管策略新建角色,然后选择 AWSLambdaBasicExecutionRole。
注意
您的账户必须有权运行 IAM ListPolicies 操作,否则角色名称列表将为空。
-
选择上传以启动上传和发布过程。
注意
上传函数时,将显示正在上传函数页面。然后,发布过程根据配置参数构建映像,必要时创建 Amazon ECR 存储库,将映像上传到存储库,然后创建引用包含该映像的存储库的 Lambda。
上传函数后,函数页面将打开并显示新 Lambda 函数的配置。
-
要手动调用 Lambda 函数,请在测试函数选项卡上,在请求的自由文本输入字段输入
hello image based lambda,然后选择调用。您的文本将转换为大写并显示在响应中。
-
要查看存储库,请在 AWS 各区服务浏览器中的 Amazon Elastic Container Service 下选择存储库。
您可以随时通过双击 AWS Explorer 内 AWS Lambda 节点下已部署的实例来重新打开函数:视图。
注意
如果 AWS 各区服务浏览器窗口未打开,可以通过视图 -> AWS 各区服务浏览器将其固定
-
请注意配置选项卡上其他特定于映像的配置选项。此选项卡提供了一种覆盖可能已在 Dockerfile 中指定的
ENTRYPOINT、CMD、和WORKDIR的方法。描述是您在上传/发布期间输入的描述(如果有)。
清理
如果您不打算继续使用此示例进行开发,请记得删除已部署的函数和 ECR 映像,这样就不会为账户中未使用的资源付费。
-
右键单击位于 AWS 各区服务浏览器中 AWS Lambda 节点下的已部署实例,即可删除函数。
-
可以在 AWS 各区服务浏览器中的 Amazon Elastic Container Service -> 存储库下删除存储库。
后续步骤
有关创建和测试 Lambda 映像的信息,请参阅使用 Lambda 容器映像。
有关容器映像部署、权限和覆盖配置设置的信息,请参阅配置函数。