本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
部署 。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 | .NET 8 on 的 Dockerfile GitHub |
未排程 |
6 |
。NET 6 | Amazon Linux 2 | .NET 6 on 的 Dockerfile GitHub |
2024 年 12 月 20 日 |
Amazon ECR儲存庫:Galage.ecr.aws/lambda/dotnet
使用 AWS 的基礎映像。NET
必要條件
使用基礎映像建立和部署映像
在下列步驟中,您可以使用 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。如果使用自己的,請確保:MyFunction
-
將
FROM
屬性設定為URI基本映像 的。您的 .NET 版本必須與基礎映像的版本相符。 -
將
CMD
引數設定為 Lambda 函數處理常式。這應符合aws-lambda-tools-defaults.json
中的image-command
。
請注意,範例 Dockerfile 不包含USER指令
。當您將容器映像部署至 Lambda 時,Lambda 會自動定義具有最低權限許可的預設 Linux 使用者。這與標準 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 全域工具
。 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 Resource Name (ARN)。例如:lambda-role
。dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
如需 Amazon.Lambda.Tools 的詳細資訊。NET 全域工具,請參閱 上的 AWS .NET 儲存庫的擴充CLI
功能 GitHub。 -
調用函數。
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
透過執行期介面用戶端使用替代基礎映像
如果您使用僅限作業系統的基礎映像或替代的基礎映像,則必須在映像中加入執行期介面用戶端。執行期介面用戶端會讓您擴充 API針對自訂執行階段使用 Lambda 執行階段,管理 Lambda 與函數程式碼之間的互動。
下列範例示範如何使用非AWS 基礎映像為 建置NET容器映像,以及如何新增 Amazon.Lambda.RuntimeSupport package
必要條件
使用替代基礎映像建立和部署映像
-
安裝 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:此程式碼含有一個類別,其中包含可將
Amazon.Lambda.RuntimeSupport
程式庫初始化為自舉的Main
方法。Main
方法是函數處理過程的進入點。Main
方法會將函數處理常式包裝在自舉可以使用的包裝函式之中。如需詳細資訊,請參閱在儲存庫中使用 Amazon.Lambda. RuntimeSupport 作為類別程式庫。 GitHub -
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 行為不同,該行為在未提供 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 全域工具延伸模組
。 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 Resource Name (ARN)。例如:lambda-role
。dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
如需 Amazon.Lambda.Tools .NET CLI延伸模組的詳細資訊,請參閱 上的 AWS .NET 儲存庫的延伸CLI
模組 GitHub。 -
調用函數。
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