.NET 10 runtime hiện đã có sẵn trong AWS Lambda

Tác giả: Henrique Graca và Jonathan Tuliani
Ngày phát hành: 08 JAN 2026
Chuyên mục: Announcements, AWS .NET Development, AWS CLI, AWS Lambda

AWS Lambda hiện hỗ trợ .NET 10 dưới dạng cả runtime được quản lý và image container cơ sở. .NET là một ngôn ngữ phổ biến để xây dựng các ứng dụng serverless. Giờ đây, các nhà phát triển có thể sử dụng các tính năng và cải tiến mới trong .NET khi tạo ứng dụng serverless trên Lambda. Điều này bao gồm hỗ trợ các ứng dụng dựa trên tệp (file-based apps) để hợp lý hóa các dự án của bạn bằng cách triển khai các hàm chỉ bằng một tệp duy nhất.

.NET 10 mang đến các tối ưu hóa về runtime và compiler, bao gồm các cải tiến cho JIT compiler và nâng cấp Native AOT giúp giảm kích thước tệp thực thi và thời gian khởi động. Để biết chi tiết về các tính năng của .NET 10, bạn có thể truy cập tổng quan về .NET 10.

Bạn có thể phát triển các hàm Lambda trong .NET 10 bằng cách sử dụng AWS Management Console, AWS Command Line Interface (AWS CLI), AWS Toolkit for Visual Studio, AWS Extensions for .NET CLI (Amazon.Lambda.Tools), AWS Serverless Application Model (AWS SAM), AWS Cloud Development Kit (AWS CDK) và các công cụ cơ sở hạ tầng dưới dạng mã (IaC) khác.

Bạn cũng có thể sử dụng .NET 10 với Powertools for AWS Lambda (.NET), một bộ công cụ dành cho nhà phát triển giúp bạn triển khai các phương pháp hay nhất về serverless. Các trường hợp sử dụng bao gồm observability, xử lý hàng loạt (batch processing), tích hợp AWS Systems Manager Parameter Store, idempotency và nhiều tính năng khác.

Bài viết này trình bày những điểm mới trong runtime .NET 10 của Lambda và cách bạn có thể sử dụng runtime .NET 10 mới trong các ứng dụng serverless của mình.

Ứng dụng C# dựa trên tệp

.NET 10 giới thiệu các ứng dụng dựa trên tệp (file-based apps), là các chương trình được chứa trong một tệp .cs duy nhất, không cần tệp .csproj hoặc cấu trúc thư mục phức tạp. Các ứng dụng dựa trên tệp là một cách lý tưởng để hợp lý hóa việc phát triển và quản lý các hàm Lambda của .NET. Chúng được hỗ trợ đầy đủ bởi runtime .NET 10 của Lambda và các công cụ phát triển liên quan.

Tạo ứng dụng C# dựa trên tệp

Cách nhanh nhất để bắt đầu tạo một hàm Lambda C# dựa trên tệp là sử dụng gói Amazon.Lambda.Templates. Phiên bản 8.0.1 của gói này bổ sung template lambda.FileBased cũng như cập nhật các template còn lại trong gói lên .NET 10.

Cài đặt gói bằng cách chạy lệnh sau:

dotnet new install Amazon.Lambda.Templates

Tạo một hàm Lambda C# dựa trên tệp mới bằng cách chạy lệnh sau:

dotnet new lambda.FileBased -n MyLambdaFunction

Thao tác này tạo một tệp trong thư mục hiện tại có tên MyLambdaFunction.cs với tất cả mã khởi động cần thiết cho một hàm Lambda. Sau đây là nội dung ban đầu của tệp:

// C# file-based Lambda functions can be deployed to Lambda using the
// .NET Tool Amazon.Lambda.Tools version 6.0.0 or later.
//
// Command to install Amazon.Lambda.Tools
//   dotnet tool install -g Amazon.Lambda.Tools
//
// Command to deploy function
//    dotnet lambda deploy-function <lambda-function-name> MyLambdaFunction.cs
//
// Command to package function
//    dotnet lambda package MyLambdaFunction.zip MyLambdaFunction.cs


#:package Amazon.Lambda.Core@2.8.0
#:package Amazon.Lambda.RuntimeSupport@1.14.1
#:package Amazon.Lambda.Serialization.SystemTextJson@2.4.4

// Explicitly setting TargetFramework here is done to avoid
// having to specify it when packaging the function with Amazon.Lambda.Tools
#:property TargetFramework=net10.0

// By default File-based C# apps publish as Native AOT. When packaging Lambda function
// unless the host machine is Amazon Linux a container build will be required.
// Amazon.Lambda.Tools will automatically initate a container build if docker is installed.
// Native AOT also requires the code and dependencies be Native AOT compatible.
//
// To disable Native AOT uncomment the following line to add the .NET build directive
// that disables Native AOT.
//#:property PublishAot=false

using Amazon.Lambda.Core;
using Amazon.Lambda.RuntimeSupport;
using Amazon.Lambda.Serialization.SystemTextJson;
using System.Text.Json.Serialization;

// The function handler that will be called for each Lambda event
var handler = (string input, ILambdaContext context) =>
{
    return input.ToUpper();
};

// Build the Lambda runtime client passing in the handler to call for each
// event and the JSON serializer to use for translating Lambda JSON documents
// to .NET types.
await LambdaBootstrapBuilder.Create(handler, new SourceGeneratorLambdaJsonSerializer<LambdaSerializerContext>())
        .Build()
        .RunAsync();

// Since Native AOT is used by default with C# file-based Lambda functions the source generator
// based Lambda serializer is used. Ensure the input type and return type used by the function
// handler are registered on the JsonSerializerContext using the JsonSerializable attribute.
[JsonSerializable(typeof(string))]
public partial class LambdaSerializerContext : JsonSerializerContext
{
}

Các hàm dựa trên tệp sử dụng executable assembly handlers, trong đó compiler tạo phương thức Main() chứa mã hàm của bạn. Do đó, mã của bạn phải bao gồm gói NuGet Amazon.Lambda.RuntimeSupport và triển khai phương thức LambdaBootstrapBuilder.Create để khởi động runtime client.

Các ứng dụng dựa trên tệp cũng sử dụng .NET Native AOT theo mặc định. Bạn có thể tắt Native AOT bằng cách thêm #:property PublishAot=false vào đầu tệp. Để biết thêm thông tin về việc sử dụng Native AOT trong Lambda, hãy truy cập Biên dịch mã hàm Lambda .NET sang định dạng runtime gốc trong tài liệu Lambda.

Triển khai ứng dụng C# dựa trên tệp

Để triển khai hàm của bạn bằng dotnet CLI với tiện ích mở rộng Amazon.Lambda.Tools, hãy truyền tên tệp .cs làm đối số bổ sung. Native AOT được bật theo mặc định, do đó bản dựng phải khớp với kiến trúc đích. Nếu bạn đang xây dựng trên cùng kiến trúc với hàm Lambda đích và trên Amazon Linux 2023, thì bản dựng sẽ chạy nguyên bản. Ngược lại, Amazon.Lambda.Tools sử dụng một Docker container để xây dựng hàm.

Ví dụ, để triển khai cho x86_64 (kiến trúc mặc định):

dotnet lambda deploy-function ToUpper ToUpper.cs --function-runtime
dotnet10 --function-role <role-arn>

Ngoài ra, để triển khai cho arm64:

dotnet lambda deploy-function ToUpper ToUpper.cs --function-runtime
dotnet10 --function-role <role-arn> --function-architecture arm64

Gỡ lỗi ứng dụng C# dựa trên tệp

Visual Studio Code với C# Dev Kit hỗ trợ gỡ lỗi các ứng dụng C# dựa trên tệp.

  1. Cài đặt công cụ kiểm thử.
dotnet tool install -g Amazon.Lambda.TestTool
  1. Khởi động trình giả lập.
dotnet lambda-test-tool start --lambda-emulator-port 5050
  1. Cấu hình .vscode/launch.json để đính kèm vào tiến trình.
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "LambdaDebugFile",
      "type": "coreclr",
      "request": "launch",
      "program": "${fileDirname}/artifacts/Debug/${fileBasenameNoExtension}.dll",
      "cwd": "${workspaceFolder}",
      "console": "internalConsole",
      "stopAtEntry": false,
      "env": {
        "AWS_LAMBDA_RUNTIME_API": "localhost:5050/${fileBasenameNoExtension}"
      },
      "preLaunchTask": "build-active-file"
    }
  ]
}
  1. Cấu hình .vscode/tasks.json để xây dựng tệp đang hoạt động.
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build-active-file",
      "command": "dotnet",
      "type": "process",
      "args": [
        "build",
        "${file}",
        "--output",
        "./artifacts/Debug"
      ],
      "problemMatcher": "$msCompile"
    }
  ]
}

Cấu hình sử dụng ${file}, cho phép tác vụ xây dựng nhắm mục tiêu vào bất kỳ tệp C# nào đang hoạt động trong trình chỉnh sửa của bạn. Điều này cho phép gỡ lỗi liền mạch trên nhiều hàm tệp đơn.

Lambda Managed Instances

Runtime Lambda cho .NET 10 bao gồm hỗ trợ Lambda Managed Instances, để bạn có thể chạy các hàm Lambda .NET 10 trên các phiên bản Amazon Elastic Compute Cloud (Amazon EC2) trong khi vẫn duy trì sự rõ ràng trong hoạt động serverless. Do đó, bạn có thể sử dụng các phiên bản EC2 thế hệ hiện tại, bao gồm Graviton4, các phiên bản tối ưu hóa mạng và các tùy chọn tính toán chuyên biệt khác, mà không cần quản lý vòng đời phiên bản, vá lỗi hệ điều hành hoặc chính sách mở rộng quy mô. Lambda Managed Instances cung cấp quyền truy cập vào các mô hình định giá dựa trên cam kết của Amazon EC2, chẳng hạn như Compute Savings PlansReserved Instances, có thể giảm giá tới 72% so với giá theo yêu cầu của Amazon EC2 (On-Demand pricing). Điều này mang lại khoản tiết kiệm chi phí đáng kể cho các khối lượng công việc ổn định trong khi vẫn duy trì mô hình lập trình Lambda quen thuộc. Để biết thêm thông tin, hãy truy cập Lambda Managed Instances.

Với Lambda Managed Instances, mỗi môi trường thực thi hàm có thể xử lý nhiều lời gọi hàm cùng một lúc. Trong .NET, Lambda sử dụng .NET Tasks để xử lý không đồng bộ nhiều yêu cầu đồng thời. Bạn nên áp dụng các thực hành an toàn đồng thời tương tự khi sử dụng Lambda Managed Instances như bạn sẽ làm trong bất kỳ môi trường đa đồng thời nào khác. Ví dụ, bất kỳ trạng thái có thể thay đổi nào—bao gồm các bộ sưu tập được chia sẻ, kết nối cơ sở dữ liệu và các đối tượng tĩnh—phải an toàn cho luồng (thread safe). Để biết thêm thông tin, hãy truy cập .NET runtime cho Lambda Managed Instances.

Các cân nhắc về hiệu suất

Khi ra mắt, các runtime Lambda mới nhận được ít lượt sử dụng hơn so với các runtime hiện có đã được thiết lập. Điều này có thể dẫn đến thời gian khởi động lạnh (cold start) lâu hơn do giảm khả năng lưu trữ cache trong các hệ thống con nội bộ của Lambda. Thời gian khởi động lạnh thường cải thiện trong những tuần sau khi ra mắt khi mức độ sử dụng tăng lên. Do đó, AWS khuyến nghị không nên đưa ra kết luận từ các so sánh hiệu suất song song với các runtime Lambda khác cho đến khi hiệu suất ổn định.

Hiệu suất phụ thuộc rất nhiều vào khối lượng công việc, do đó bạn nên tự tiến hành kiểm thử thay vì dựa vào các điểm chuẩn kiểm thử chung. Có một loạt các tính năng có sẵn để giảm tác động của cold start đối với các hàm Lambda sử dụng .NET 10, bao gồm SnapStart, provisioned concurrency, Native AOTLambda Managed Instances.

Ngoài ra, các khối lượng công việc Lambda .NET 10 có thể gặp hiệu suất thấp hơn một chút cho đến khi một số cải tiến runtime bổ sung được phát hành. Truy cập dotnet/runtime#120288 để biết chi tiết.

Di chuyển từ .NET 8 sang .NET 10

Để sử dụng .NET 10 và các tính năng dựa trên tệp mới, bạn phải cập nhật các công cụ của mình.

  1. Cài đặt hoặc cập nhật .NET 10 SDK.
  2. Nếu bạn đang sử dụng AWS SAM, hãy cài đặt hoặc cập nhật lên phiên bản mới nhất.
  3. Nếu bạn đang sử dụng Visual Studio, hãy cài đặt hoặc cập nhật AWS Toolkit for Visual Studio lên phiên bản 1.83.0.0 trở lên.
  4. Nếu bạn sử dụng tiện ích mở rộng .NET Lambda Global Tools (Amazon.Lambda.Tools) cho .NET CLI, hãy cập nhật lên phiên bản 6.0.0 trở lên để hỗ trợ C# dựa trên tệp.

Để nâng cấp một hàm lên .NET 10, hãy kiểm tra mã và các dependency của bạn để đảm bảo khả năng tương thích với .NET 10, chạy các bài kiểm thử và cập nhật nếu cần. AI tạo sinh có thể hỗ trợ: hãy cân nhắc sử dụng AWS Transform custom hoặc các trợ lý mã hóa như Kiro để giúp quá trình nâng cấp.

Nâng cấp bằng dotnet CLI

Đối với các dự án sử dụng dotnet CLI với tiện ích mở rộng Amazon.Lambda.tools:

  1. Mở tệp dự án .csproj.
  2. Cập nhật TargetFramework thành net10.0.
  3. Cập nhật các gói NuGet Amazon.Lambda.* lên các phiên bản mới nhất.
  4. Nếu sử dụng aws-lambda-tools-defaults.json, hãy đặt function-runtime thành dotnet10.
  5. Chạy dotnet lambda deploy-function để triển khai.

Nâng cấp bằng AWS Toolkit for Visual Studio

Để nâng cấp một hàm lên .NET 10:

  1. Mở tệp dự án .csproj và cập nhật TargetFramework thành net10.0.
  2. Cập nhật các gói NuGet lên các phiên bản mới nhất.
  3. Nhấp chuột phải vào dự án trong Solution Explorer và chọn Publish to AWS Lambda.

Nâng cấp các hàm image container

Cùng với những thay đổi trên, các runtime .NET 8 và .NET 10 được xây dựng trên runtime provided.al2023, dựa trên image container tối thiểu của Amazon Linux 2023. Image tối thiểu của Amazon Linux 2023 sử dụng microdnf làm trình quản lý gói, được liên kết tượng trưng (symlinked) dưới dạng dnf. Điều này thay thế trình quản lý gói yum được sử dụng trong .NET 6 và các image dựa trên Amazon Linux 2 trước đó. Nếu bạn triển khai các hàm Lambda của mình dưới dạng image container, thì bạn phải cập nhật Dockerfile của mình để sử dụng dnf thay vì yum khi nâng cấp lên image cơ sở .NET 10 từ .NET 6 hoặc các image cơ sở trước đó.

Tìm hiểu thêm về runtime provided.al2023 trong bài viết Giới thiệu runtime Amazon Linux 2023 cho AWS Lambda.

Sử dụng runtime .NET 10 trong Lambda

Các phần sau đây trình bày cách sử dụng runtime .NET 10 trong Lambda.

Console

Trên trang Create Function của console Lambda, chọn .NET 10 trong menu thả xuống Runtime, như thể hiện trong hình sau.


Hình 1: Tạo một hàm .NET 10 trong console Lambda

Để cập nhật một hàm Lambda hiện có lên .NET 10, hãy điều hướng đến hàm đó trong console Lambda. Chọn Edit trong bảng Runtime settings, sau đó chọn .NET 10 từ menu thả xuống Runtime, như thể hiện trong hình sau.


Hình 2: Chỉnh sửa cài đặt runtime để chọn .NET 10

Image container Lambda

Thay đổi phiên bản image cơ sở .NET bằng cách sửa đổi câu lệnh FROM trong Dockerfile của bạn:

FROM public.ecr.aws/lambda/dotnet:10
# Copy function code
COPY artifacts/publish/ ${LAMBDA_TASK_ROOT}

AWS SAM

Trong AWS SAM, đặt thuộc tính Runtime thành dotnet10:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Simple Lambda Function
Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Description: My .NET Lambda Function
      CodeUri: ./src/MyFunction/
      Handler: MyFunction::MyFunction.Function::FunctionHandler
      Runtime: dotnet10

Đối với các hàm dựa trên tệp, hãy đặt CodeUri thành đường dẫn tệp C# tương đối so với template AWS SAM. Các lệnh AWS CloudFormation như deploy-serverlesspackage-ci đóng gói hàm Lambda dựa trên tệp dưới dạng tệp thực thi .NET. Trường Handler phải được đặt thành tên assembly .NET, đối với các ứng dụng C# dựa trên tệp là tên tệp trừ đi phần mở rộng .cs:

ToUpperFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: ToUpperFunction
    Runtime: dotnet10
    CodeUri: ./ToUpperFunction.cs
    MemorySize: 512
    Timeout: 30

AWS SAM hỗ trợ tạo các ứng dụng serverless .NET 10 mới bằng lệnh sam init. Tham khảo tài liệu AWS SAM để biết chi tiết.

Kết luận

AWS Lambda hiện hỗ trợ .NET 10 dưới dạng runtime ngôn ngữ được quản lý để giúp các nhà phát triển xây dựng các ứng dụng serverless hiệu quả hơn, mạnh mẽ hơn và có khả năng mở rộng. Các bổ sung ngôn ngữ của .NET 10 bao gồm các tính năng C# 14, tối ưu hóa runtime và hỗ trợ Native AOT được cải thiện. Bản phát hành này cũng giới thiệu các ứng dụng C# dựa trên tệp cho các hàm Lambda tệp đơn được hợp lý hóa, và nó bao gồm hỗ trợ Lambda Managed Instances cho các yêu cầu tính toán chuyên biệt và hiệu quả chi phí ở quy mô lớn.

Bạn có thể xây dựng và triển khai các hàm bằng .NET 10 bằng cách sử dụng AWS Management Console, AWS CLI, AWS SDK, AWS SAM, AWS CDK hoặc công cụ IaC mà bạn chọn. Bạn cũng có thể sử dụng image cơ sở container .NET 10 nếu bạn muốn xây dựng và triển khai các hàm của mình bằng image container.

Hãy thử runtime .NET 10 trong Lambda ngay hôm nay và trải nghiệm những lợi ích của phiên bản ngôn ngữ cập nhật này.

Để tìm thêm các ví dụ về .NET, hãy sử dụng Serverless Patterns Collection. Để có thêm tài nguyên học tập về serverless, hãy truy cập Serverless Land.