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

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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

您可以透過三種方式為 .NET Lambda 函數建置容器映像:

提示

若要縮短 Lambda 容器函數變成作用中狀態所需的時間,請參閱 Docker 文件中的使用多階段建置。若要建置有效率的容器映像,請遵循撰寫 Dockerfiles 的最佳實務

本頁面會說明如何為 Lambda 建置、測試和部署容器映像。

AWS 適用於 .NET 的基本映

AWS 為 .NET 提供下列基本影像:

標籤 執行期 作業系統 Dockerfile 棄用

8

。淨值 8 Amazon Linux 2023 適用於 .NET 8 的碼頭文件 GitHub

7

.NET 7 Amazon Linux 2 適用於 .NET 7 的碼頭文件 GitHub

2024 年 5 月 14 日

6

.NET 6 Amazon Linux 2 適用於 .NET 6 的碼頭文件 GitHub

2024 年 11 月 12 日

Amazon ECR 儲存庫︰gallery.ecr.aws/lambda/dotnet

使用 .NET 的 AWS 基本映像

必要條件

若要完成本節中的步驟,您必須執行下列各項:

  • .NET SDK — 下列步驟使用 .NET 8 基本映像檔。確保您的 .NET 版本與您在 Dockerfile 中指定的基礎映像的版本相符。

  • Docker

使用基礎映像建立和部署映像

在下面的步驟中,您可以使用 Amazon.Lambda.TemplatesAmazon.Lambda.Tools 來建立 .NET 專案。然後,您可以建置 Docker 映像檔,將該映像檔上傳到 Amazon ECR,然後將其部署到 Lambda 函數。

  1. 安裝亞馬遜. 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。如果使用自己的,請確保:

    • FROM 屬性設定為基礎映像的 URI。您的 .NET 版本必須與基礎映像的版本相符。

    • CMD 引數設定為 Lambda 函數處理常式。這應符合 aws-lambda-tools-defaults.json 中的 image-command

    範例 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 Resource Name (ARN))。例如 lambda-role

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

    如需有關. NET 全域工具的詳細資訊,請參閱上的 .NET CLI 存放庫的AWS 擴充功能。 GitHub

  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 的容器映像檔,以及如何新增亞馬遜。 RuntimeSupport 套件,也就是 .NET 的 Lambda 執行階段介面用戶端。該示例碼頭文件使用 Microsoft .NET 8 基本映像。

必要條件

若要完成本節中的步驟,您必須執行下列各項:

  • .NET SDK — 下列步驟使用 .NET 8 基本映像檔。確保您的 .NET 版本與您在 Dockerfile 中指定的基礎映像的版本相符。

  • Docker

使用替代基礎映像建立和部署映像

  1. 安裝亞馬遜. NuGet

    dotnet new install Amazon.Lambda.Templates
  2. 使用 lambda.CustomRuntimeFunction 範本建立 .NET 專案。這個模板包括亞馬遜。 RuntimeSupport包裝。

    dotnet new lambda.CustomRuntimeFunction --name MyFunction --region us-east-1
  3. 請前往 MyFunction/src/MyFunction 目錄。這是儲存專案檔案的位置。檢查下列檔案:

    • aws-lambda-tools-defaults.json — 此檔案是您在部署 Lambda 函數時指定命令列選項的位置。

    • Function.cs:此程式碼含有一個類別,其中包含可將 Amazon.Lambda.RuntimeSupport 程式庫初始化為自舉的 Main 方法。Main 方法是函數處理過程的進入點。Main 方法會將函數處理常式包裝在自舉可以使用的包裝函式之中。如需詳細資訊,請參閱使用亞馬遜。 RuntimeSupport 作為存儲庫中的類 GitHub 庫。

    • 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
    # 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 Resource Name (ARN))。例如 lambda-role

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

    如需有關. NET CLI 延AWS 伸模組的詳細資訊,請參閱上的. GitHub

  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