使用容器映像部署 .NET Lambda 函数
有三种方法可以为 .NET Lambda 函数构建容器映像:
-
AWS 基本映像会预加载一个语言运行时系统、一个用于管理 Lambda 和函数代码之间交互的运行时系统接口客户端,以及一个用于本地测试的运行时系统接口仿真器。
-
AWS 仅限操作系统的运行时系统
包含 Amazon Linux 发行版和运行时系统接口模拟器 。这些镜像通常用于为编译语言(例如 Go 和 Rust)以及 Lambda 未提供基础映像的语言或语言版本(例如 Node.js 19)创建容器镜像。您也可以使用仅限操作系统的基础映像来实施自定义运行时系统。要使映像与 Lambda 兼容,您必须在映像中包含 .NET 的运行时系统接口客户端。 -
您还可以使用其他容器注册表的备用基本映像,例如 Alpine Linux 或 Debian。您还可以使用您的组织创建的自定义映像。要使映像与 Lambda 兼容,您必须在映像中包含 .NET 的运行时系统接口客户端。
提示
要缩短 Lambda 容器函数激活所需的时间,请参阅 Docker 文档中的使用多阶段构建
此页面介绍了如何为 Lambda 构建、测试和部署容器映像。
AWS.NET 的基本映像
AWS 为 .NET 提供了以下基本映像:
标签 | 运行时 | 操作系统 | Dockerfile | 淘汰 |
---|---|---|---|---|
8 |
.NET 8 | Amazon Linux 2023 | GitHub 上适用于 .NET 8 的 Dockerfile |
未计划 |
6 |
.NET 6 | Amazon Linux 2 | GitHub 上适用于 .NET 6 的 Dockerfile |
2024 年 12 月 20 日 |
Amazon ECR 存储库:gallery.ecr.aws/lambda/dotnet
使用 .NET 的 AWS 基本映像
先决条件
要完成本节中的步骤,您必须满足以下条件:
-
.NET 开发工具包
– 以下步骤使用 .NET 8 基本映像。确保 .NET 版本与您在 Dockerfile 中指定的基本映像 版本相符。
使用基本映像创建和部署映像
在以下步骤中,您将使用 Amazon.Lambda.Templates
-
安装 Amazon.Lambda.Templates
NuGet 程序包。 dotnet new install Amazon.Lambda.Templates
-
使用
lambda.image.EmptyFunction
模板创建 .NET 项目。dotnet new lambda.image.EmptyFunction --name
MyFunction
--regionus-east-1
-
导航到
目录。这是存储项目文件的位置。检查以下文件:MyFunction
/src/MyFunction
-
aws-lambda-tools-defaults.json – 此文件是您部署 Lambda 函数时指定命令行选项的位置。
-
Function.cs – 您的 Lambda 处理程序函数代码。这是一个 C# 模板,该模板包含默认
Amazon.Lambda.Core
库和默认LambdaSerializer
属性。有关序列化要求和选项的更多信息,请参阅 Lambda 函数中的序列化。您可以使用提供的代码进行测试,也可以将其替换为您自己的代码。 -
MyFunction.csproj – 列出构成您应用程序的文件和程序集的 .NET 项目文件
。 -
Readme.md – 此文件包含有关示例 Lambda 函数的更多信息。
-
-
检查
src/
目录中的 Dockerfile。您可以使用提供的 Dockerfile 进行测试,也可以将其替换为您自己的 Dockerfile。如果您使用自己的 Dockerfile,请确保:MyFunction
-
将
FROM
属性设置为基本映像的 URI。.NET 版本必须与基本映像版本相符。 -
将
CMD
参数设置为 Lambda 函数处理程序。这应与aws-lambda-tools-defaults.json
中的image-command
相符。
请注意,示例 Dockerfile 不包含 USER 指令
。当您将容器映像部署到 Lambda 时,Lambda 会自动定义具有最低权限的默认 Linux 用户。这与标准 Docker 行为不同,标准 Docker 在未提供 USER
指令时默认为root
用户。例 Dockerfile
# You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM
public.ecr.aws/lambda/dotnet:8
# Copy function code to Lambda-defined environment variable COPY publish/* ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "MyFunction::MyFunction.Function::FunctionHandler
" ] -
-
安装 Amazon.Lambda.Tools .NET Global Tool
. dotnet tool install -g Amazon.Lambda.Tools
如果已安装 Amazon.Lambda.Tools,请确保您使用的是最新版本。
dotnet tool update -g Amazon.Lambda.Tools
-
如果尚未安装,请将目录更改为
。MyFunction
/src/MyFunction
cd src/
MyFunction
-
使用 Amazon.Lambda.Tools 构建 Docker 映像,将其推送到新的 Amazon ECR 存储库,然后部署 Lambda 函数。
对于
--function-role
,指定函数执行角色的角色名称,而不是 Amazon 资源名称(ARN)。例如,lambda-role
。dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
有关 Amazon.Lambda.Tools .NET Global Tool 的更多信息,请参阅 GitHub 上的AWS适用于 .NET CLI 的扩展程序
存储库。 -
调用函数。
dotnet lambda invoke-function
MyFunction
--payload "Testing the function"如果所有操作成功,您将看到以下内容:
Payload: "TESTING THE FUNCTION" Log Tail: START RequestId:
id
Version: $LATEST END RequestId:id
REPORT RequestId:id
Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB -
删除 Lambda 函数。
dotnet lambda delete-function
MyFunction
将备用基本映像与运行时系统接口客户端配合使用
如果使用仅限操作系统的基础映像或者备用基础映像,则必须在映像中包括运行时系统接口客户端。运行时系统接口客户端可扩展 将 Lambda 运行时 API 用于自定义运行时,用于管理 Lambda 和函数代码之间的交互。
以下示例演示如何使用非 AWS 基础映像构建 .NET 的容器映像,以及如何添加 Amazon.Lambda.RuntimeSupport 程序包
先决条件
使用备用基本映像创建和部署映像
-
安装 Amazon.Lambda.Templates
NuGet 程序包。 dotnet new install Amazon.Lambda.Templates
-
使用
lambda.CustomRuntimeFunction
模板创建 .NET 项目。此模板包括 Amazon.Lambda.RuntimeSupport程序包。 dotnet new lambda.CustomRuntimeFunction --name
MyFunction
--regionus-east-1
-
导航到
目录。这是存储项目文件的位置。检查以下文件:MyFunction
/src/MyFunction
-
aws-lambda-tools-defaults.json – 此文件是您部署 Lambda 函数时指定命令行选项的位置。
-
Function.cs – 该代码包含一个类,其
Main
方法将Amazon.Lambda.RuntimeSupport
库初始化为引导。Main
方法是函数进程的入口点。Main
方法将函数处理程序封装在引导可以使用的包装器中。有关更多信息,请参阅 GitHub 存储库中的使用 Amazon.Lambda.RuntimeSupport 作为类库。 -
MyFunction.csproj – 列出构成您应用程序的文件和程序集的 .NET 项目文件
。 -
Readme.md – 此文件包含有关示例 Lambda 函数的更多信息。
-
-
打开
aws-lambda-tools-defaults.json
文件,然后添加以下各行:"package-type": "image",
"docker-host-build-output-dir": "./bin/Release/lambda-publish"
-
package-type:将部署包定义为容器映像。
-
docker-host-build-output-dir:设置构建过程的输出目录。
例 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": "", "region": "us-east-1", "configuration": "Release", "function-runtime": "provided.al2023", "function-memory-size": 256, "function-timeout": 30, "function-handler": "bootstrap", "msbuild-parameters": "--self-contained true",
"package-type": "image",
"docker-host-build-output-dir": "./bin/Release/lambda-publish"
} -
-
在
目录中创建一个 Dockerfile。以下示例 Dockerfile 使用 Microsoft .NET 基本映像而不是 AWS 基本映像。MyFunction
/src/MyFunction
-
将
FROM
属性设置为基本映像标识符。.NET 版本必须与基本映像版本相符。 -
使用
COPY
命令将函数复制到/var/task
目录中。 -
将
ENTRYPOINT
设置为您希望 Docker 容器在启动时运行的模块。在这种情况下,该模块是引导,它会初始化Amazon.Lambda.RuntimeSupport
库。
请注意,示例 Dockerfile 不包含 USER 指令
。当您将容器映像部署到 Lambda 时,Lambda 会自动定义具有最低权限的默认 Linux 用户。这与标准 Docker 行为不同,标准 Docker 在未提供 USER
指令时默认为root
用户。例 Dockerfile
# You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM
mcr.microsoft.com/dotnet/runtime:8.0
# Set the image's internal work directory WORKDIR /var/task # Copy function code to Lambda-defined environment variable COPY "bin/Release/net8.0/linux-x64" . # Set the entrypoint to the bootstrap ENTRYPOINT ["/usr/bin/dotnet", "exec", "/var/task/bootstrap.dll
"] -
-
安装 Amazon.Lambda.Tools .NET Global Tools 扩展
。 dotnet tool install -g Amazon.Lambda.Tools
如果已安装 Amazon.Lambda.Tools,请确保您使用的是最新版本。
dotnet tool update -g Amazon.Lambda.Tools
-
使用 Amazon.Lambda.Tools 构建 Docker 映像,将其推送到新的 Amazon ECR 存储库,然后部署 Lambda 函数。
对于
--function-role
,指定函数执行角色的角色名称,而不是 Amazon 资源名称(ARN)。例如,lambda-role
。dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
有关 Amazon.Lambda.Tools .NET CLI 扩展程序的更多信息,请参阅 GitHub 上的适用于 .NET CLI 的 AWS 扩展程序
存储库。 -
调用函数。
dotnet lambda invoke-function
MyFunction
--payload "Testing the function"如果所有操作成功,您将看到以下内容:
Payload: "TESTING THE FUNCTION" Log Tail: START RequestId:
id
Version: $LATEST END RequestId:id
REPORT RequestId:id
Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB -
删除 Lambda 函数。
dotnet lambda delete-function
MyFunction