使用容器映像部署 .NET Lambda 函数 - AWS Lambda

使用容器映像部署 .NET Lambda 函数

有三种方法可以为 .NET Lambda 函数构建容器映像:

提示

要缩短 Lambda 容器函数激活所需的时间,请参阅 Docker 文档中的使用多阶段构建。要构建高效的容器映像,请遵循编写 Dockerfiles 的最佳实践

此页面介绍了如何为 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 基本映像

先决条件

要完成本节中的步骤,您必须满足以下条件:

使用基本映像创建和部署映像

在以下步骤中,您将使用 Amazon.Lambda.TemplatesAmazon.Lambda.Tools 创建 .NET 项目。然后,构建 Docker 映像,将该映像上传到 Amazon ECR,并将其部署到 Lambda 函数。

  1. 安装 Amazon.Lambda.Templates NuGet 程序包。

    dotnet new install Amazon.Lambda.Templates
  2. 使用 lambda.image.EmptyFunction 模板创建 .NET 项目。

    dotnet new lambda.image.EmptyFunction --name MyFunction --region us-east-1
  3. 导航到 MyFunction/src/MyFunction 目录。这是存储项目文件的位置。检查以下文件:

    • aws-lambda-tools-defaults.json – 此文件是您部署 Lambda 函数时指定命令行选项的位置。

    • Function.cs – 您的 Lambda 处理程序函数代码。这是一个 C# 模板,该模板包含默认 Amazon.Lambda.Core 库和默认 LambdaSerializer 属性。有关序列化要求和选项的更多信息,请参阅 Lambda 函数中的序列化。您可以使用提供的代码进行测试,也可以将其替换为您自己的代码。

    • MyFunction.csproj – 列出构成您应用程序的文件和程序集的 .NET 项目文件

    • Readme.md – 此文件包含有关示例 Lambda 函数的更多信息。

  4. 检查 src/MyFunction 目录中的 Dockerfile。您可以使用提供的 Dockerfile 进行测试,也可以将其替换为您自己的 Dockerfile。如果您使用自己的 Dockerfile,请确保:

    • 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" ]
  5. 安装 Amazon.Lambda.Tools .NET Global Tool.

    dotnet tool install -g Amazon.Lambda.Tools

    如果已安装 Amazon.Lambda.Tools,请确保您使用的是最新版本。

    dotnet tool update -g Amazon.Lambda.Tools
  6. 如果尚未安装,请将目录更改为 MyFunction/src/MyFunction

    cd src/MyFunction
  7. 使用 Amazon.Lambda.Tools 构建 Docker 映像,将其推送到新的 Amazon ECR 存储库,然后部署 Lambda 函数。

    对于 --function-role,指定函数执行角色的角色名称,而不是 Amazon 资源名称(ARN)。例如,lambda-role

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    有关 Amazon.Lambda.Tools .NET Global Tool 的更多信息,请参阅 GitHub 上的AWS适用于 .NET CLI 的扩展程序存储库。

  8. 调用函数。

    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
  9. 删除 Lambda 函数。

    dotnet lambda delete-function MyFunction

将备用基本映像与运行时系统接口客户端配合使用

如果使用仅限操作系统的基础映像或者备用基础映像,则必须在映像中包括运行时系统接口客户端。运行时系统接口客户端可扩展 将 Lambda 运行时 API 用于自定义运行时,用于管理 Lambda 和函数代码之间的交互。

以下示例演示如何使用非 AWS 基础映像构建 .NET 的容器映像,以及如何添加 Amazon.Lambda.RuntimeSupport 程序包,该程序包是 .NET 的 Lambda 运行时系统接口客户端。示例 Dockerfile 使用 Microsoft .NET 8 基本映像。

先决条件

要完成本节中的步骤,您必须满足以下条件:

  • .NET SDK – 以下步骤使用 .NET 8 基本映像。确保 .NET 版本与您在 Dockerfile 中指定的基本映像版本相符。

  • Docker

使用备用基本映像创建和部署映像

  1. 安装 Amazon.Lambda.Templates NuGet 程序包。

    dotnet new install Amazon.Lambda.Templates
  2. 使用 lambda.CustomRuntimeFunction 模板创建 .NET 项目。此模板包括 Amazon.Lambda.RuntimeSupport 程序包。

    dotnet new lambda.CustomRuntimeFunction --name MyFunction --region us-east-1
  3. 导航到 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 函数的更多信息。

  4. 打开 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" }
  5. MyFunction/src/MyFunction 目录中创建一个 Dockerfile。以下示例 Dockerfile 使用 Microsoft .NET 基本映像而不是 AWS 基本映像

    • 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"]
  6. 安装 Amazon.Lambda.Tools .NET Global Tools 扩展

    dotnet tool install -g Amazon.Lambda.Tools

    如果已安装 Amazon.Lambda.Tools,请确保您使用的是最新版本。

    dotnet tool update -g Amazon.Lambda.Tools
  7. 使用 Amazon.Lambda.Tools 构建 Docker 映像,将其推送到新的 Amazon ECR 存储库,然后部署 Lambda 函数。

    对于 --function-role,指定函数执行角色的角色名称,而不是 Amazon 资源名称(ARN)。例如,lambda-role

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    有关 Amazon.Lambda.Tools .NET CLI 扩展程序的更多信息,请参阅 GitHub 上的适用于 .NET CLI 的 AWS 扩展程序存储库。

  8. 调用函数。

    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
  9. 删除 Lambda 函数。

    dotnet lambda delete-function MyFunction