Giới thiệu Phiên bản .NET 8 cho AWS Lambda.

Bởi  Julian Wood.

Bài đăng được viết bởi  Beau Gosse (Senior Software Engineer) và Paras Jain (Senior Technical Account Manager).


AWS Lambda giờ đây đã hỗ trợ .NET 8 cả dưới dạng môi trường runtime được quản lý quản lý phiên bản và hình ảnh cơ sở container gốc. Với bản phát hành lần này, các nhà phát triển dùng Lambda sẽ được hưởng lợi từ những tính năng của .NET 8 bao gồm các cải tiến về API, các cải tiến hỗ trợ về  Native Ahead of Time (Native AOT) và cải thiện hiệu suất. .NET 8 hỗ trợ C# 12F# 8, và PowerShell 7.4. Bạn có thể phát triển các function của Lambda của .NET 8 sử dụng AWS Toolkit for Visual Studio, AWS Extensions for .NET CLIAWS Serverless Application Model (AWS SAM)AWS CDK hoặc các công cụ IaC khác. 

A screenshot of a computer

Description automatically generated

Hình 1: Khởi tạo các hàm của .NET 8 trong console.

Những cập nhật mới 

Nâng cấp hệ thống hệ điều hành

Phiên bản .NET 8 được xây dựng trên hHình ảnh container vùng chứa tối giản thiểu của Amazon Linux 2023 (Amazon Linux 2023 (AL2023) minimal container image). Điều này cho phép khối lượng mang lại quy mô triển khai nhỏ hơn so với các runtime thời gian chạy dựa trên Amazon Linux 2 (AL2) trước đó và các phiên bản cập nhật của các thư viện phổ biến như glibc 2.34 và OpenSSL 3.

Ảnh container Hình ảnh vùng chứa mới cũng sử dụng  microdnf  như một trình quản lý gói, được liên kết tượng trưng dưới dạng như  dnf . Điều này thay thế trình quản lý gói gói quản lý  yum  được sử dụng trước đó trong các image dựa trên Amazon Linux 2. Nếu bạn triển khai các Lambda functions dưới dạng container images, bạn cần phải cập nhật lại các Dockerfile để sử dụng  dnf  thay vì  yum  khi nâng cấp lên .NET 8 base image. Để biết thêm thông tin, truy cập Introducing the Amazon Linux 2023 runtime for AWS Lambda.

Hiệu Suất

Đã có sẵn Có một số cải tiến về hiệu suất ngôn ngữ có sẵn như một phần của .NET 8. Thời gian khởi tạo có thể ảnh hưởng đến hiệu suất vì Lambda tạo ra các môi trường thực thi mới để tự động mở rộng quy mô hàm chức năng của bạn. Có một số cách để tối ưu hóa hiệu suất cho khối lượng công việc .NET dựa trên Lambda, bao gồm sử dụng trình tạo nguồn trong  System.Text.Json  hoặc sử dụng Native AOT. Lambda đã tăng dung lượng bộ nhớ ban đầu từ 256 MB lên 512 MB trong bản thiết kế và mẫu sử dụng để cải thiện hiệu suất với .NET8. Bạn có thể sử dụng AWS Compute Optimizer hoặc AWS Lambda Power Tuning để lập hồ sơ về hiệu suất.

Tại thời điểm khởi tạo, phiên bản Lambda mới sẽ nhận ít mức sử dụng hơn các bản phiên bản đã phát hành trước đó. Điều này có thể dẫn đến thời gian khởi động nguội lâu hơn do giảm mức khả năng lưu trữ bộ nhớ đệm trong các hệ thống con phụ Lambda nội bộ. Thời gian khởi động nguội 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 so sánh hiệu suất với các thời gian chạy Lambda khác cho đến khi hiệu suất ổn định.

Native AOT

Lambda ra mắt .NET Native AOT support vào tháng 11/2022. Benchmarks cải thiện tới 86% thời gian khởi động nguội bằng cách loại bỏ quá trình biên dịch JIT. Triển khai các function của .NET 8 Native AOT bằng cách sử dụng phiên bản dotnet8 thay vì runtime dành riêng chỉ dành cho hệ điều hành provided.al2023 runtime giúp các function có thể truy cập tới các thư viện hệ thống hệ thống thư viện của .NET.Ví dụ, libicu, được sử dụng cho việc toàn cầu hóa trên toàn cầu, không hỗ trợ trên provided.al2023 runtime nhưng lại hỗ trợ trên phiên bản dotnet8 .

Trong khi Native AOT có thể không phù hợp với tất cả các .NET function, .NET8 lại có cải thiện về hỗ trợ loại bỏ (Trimming Support). ĐIều này giúp bạn có thể dễ dàng chạy các API ASP.NET. Hỗ trợ loại bỏ giúp loại bỏ các cảnh báo về thời gian xây dựng chương trình, điều mà có thể gây ra lỗi ở runtime. Điều này có thể giúp bạn tin tưởng rằng hàm Native AOT gốc của bạn hoạt động giống như hàm do JIT biên dịch. Hỗ trợ loại bỏ đã được thêm vào  Lambda runtime librariesAWS .NET SDK.NET Lambda Annotations, và chính .NET8.

Sử dụng .NET 8 với Lambda

Để sử dụng .NET 8 với Lambda, bạn cần phải cập nhật các công cụ hỗ trợ:

  1. Cài đặt hoặc cập nhật  .NET 8 SDK.
  2. Nếu đ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 đang sử dụng Visual Studio, hãy cài đặt hoặc cập nhật AWS Toolkit for Visual Studio.
  4. Nếu đang sử dụng công cụ mở rộng .NET Lambda Global Tools, cài đặt  install the CLI extension and templates Bạn có thể nâng cấp bộ hỗ trợ đã có với dotnet tool update -g Amazon.Lambda.Tools và với templates đã có với dotnet new install Amazon.Lambda.Templates.

Bạn cũng có thể sử dụng .NET 8 với  Powertools for AWS Lambda (.NET), bộ công cụ dành cho nhà phát triển để khai thác các phương pháp thực hành tốt hay nhất về serverless như khả năng quan sát , xử lý hàng loạt, truy xuất than số, tính tạm thời, và các cờ tính năng.

Xây dựng các hàm .NET 8 mới

Sử dụng AWS SAM

  1. Chạy câu lệnh sam init.
  2. Chọn  1- AWS Quick Start Templates.
  3. Chọn một trong những mẫu hiện có ví dụ như Hello World Example.
  4. Chọn N  cho câu hỏi  Use the most popular runtime and package type?
  5. Chọn phiên bản dotnet8 . Phiên bản đã bao gồm các tùy chọn về Native AOT.
  6. Làm theo các hướng dẫn tiếp theo để tạo ra một hàm .NET 8

Bạn có thể sửa đổi mã hàm chức năng được tạo và sử dụng câu lệnh sam deploy –guided để triển khai chương trình.

Sử dụng AWS ToolKit Tool Kit For Visual Studio

  1. Từ trình hướng dẫn Tạo dự án mới, hãy lọc các mẫu theo loại dự án Lambda hoặc Serverless rồi chọn một mẫu. Sử dụng Lambda để triển khai một chức năng duy nhất. Sử dụng Serverless để triển khai một tập hợp các chức năng bằng cách sử dụng AWS CloudFormation.
  2. Tiếp tục các bước để hoàn thành dự án vừa tạo.
  3. Bạn có thể tùy chỉnh các chức năng vừa tạo.
  4. Để triển khai chương trình, chuột phải vào dự án, trong mục Solution Explorer chọn Publish to AWS Lambda.

Sử dụng các tiện ích mở rộng của AWS cho .NET CLI

  1. Chạy lệnh dotnet new list –tag Lambda để lấy ra các mẫu Lambda có sẵn.
  2. Chọn mẫu và chạy lệnh dotnet new <template name>.Để xây dựng một hàm sử dụng Native AOT, sử dụng lệnh dotnet new lambda.NativeAOT hoặc dotnet new serverless.NativeAOT khi sử dụng .NET Lambda Annotations Framework
  3. Xác định vị trí hàm Lambda được tạo trong thư mục bên dưới src chứa tệp .csproj. Bạn có thể sửa đổi mã chức năng được tạo.
  4. Để triển khai, chạy câu lệnh  dotnet lambda deploy-function và làm theo các hướng dẫn tiếp theo.
  5. Bạn có thể thử nghiệm chương trình trên cloud bằng lệnh dotnet lambda invoke-function hoặc sử dụng  test functionality trong Lambda console.

Bạn có thể xây dựng và triển khai các hàm .NET lambda bằng cách sử dụng các hình ảnh container. Hãy làm theo hướng dẫn trong tài liệu sau.

Dịch chuyển từ .Net 6 sang .NET 8 không sử dụng Native AOT

Sử dụng AWS SAM

  1. Mở file template.yaml .
  2. Cập nhật phiên bản dotnet8 .
  3. Mở Terminal và chạy lại code, sử dụng lệnh sam build.
  4. Chạy lệnh sam deploy để triển khai chương trình.

Sử dụng AWS Tool Kit For Visual Studio

  1. Mở file .csproj và cập nhật TargetFramework thành phiên bản net8.0 Cập nhật gói NuGet cho các hàm Lambda của bạn lên phiên bản mới nhất để nhận các bản cập nhật .NET 8.
  2. Xác minh rằng lệnh xây dựng bạn đang sử dụng đang nhắm mục tiêu thời gian chạy .NET 8.
  3. Có thể có các bước bổ sung tùy thuộc vào công cụ xây dựng/triển khai mà bạn đang sử dụng. 
A screenshot of a computer

Description automatically generated

Sử dụng các tiện ích mở rộng của AWS cho .NET CLI

  1. Mở file aws-lambda-tools-defaults.json nếu file có tồn tại. Chọn Framework là net8.0.
  2. Mở file serverless.template nếu file có tồn tại. Với mọi tài nguyên AWS::Lambda::Function  hoặc AWS::Servereless::Function , Chỉnh phiên bản thành dotnet8.
  3. Mở tệp dự án .csproj nếu nó tồn tại và cập nhật TargetFramework lên net8.0. Cập nhật gói NuGet cho các hàm Lambda của bạn lên phiên bản mới nhất để nhận các bản cập nhật .NET 8.

Dịch chuyển từ .Net 6 sang .NET 8 có sử dụng Native AOT

Ví dụ sau đây sẽ thực hiện dịch chuyển từ hàm thư viện lớp .NET 6 sang hàm thực thi thì Native gốc AOT .NET 8. Ví dụ sử dụng  Lambda Annotations framework cung cấp các khuôn mẫu lập trình của .NET

Cập nhật các thư mục tài liệu của dự án

  1. Mở ra các tài liệu của dự án
  2. Chỉnh TargetFramework về net8.0.
  3. Chỉnh OutputType về exe.
  4. Loại bỏ PublishReadyToRun nếu tồn tại.
  5. Thêm PublishAot và đưa giá trị về true.
  6. Thêm hoặc cập nhật các gói Nuget thành Amazon.Lambda.Annotations và Amazon.Lambda.RuntimeSupport. Bạn có thể cập nhật bằng giao diện người dùng NuGet trong IDE của mình theo cách thủ công hoặc bằng cách chạy dotnet add package Amazon.Lambda.RuntimeSupport và dotnet add package Amazon.Lambda.Annotations từ thư mục dự án của bạn.

Thư mục dự án của bạn sẽ có dạng sau đây:

<Project Sdk=”Microsoft.NET.Sdk”>  <PropertyGroup>    <OutputType>exe</OutputType>    <TargetFramework>net8.0</TargetFramework>    <ImplicitUsings>enable</ImplicitUsings>    <Nullable>enable</Nullable>    <AWSProjectType>Lambda</AWSProjectType>    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>    <!– Generate native aot images during publishing to improve cold start time. –>    <PublishAot>true</PublishAot>   <!– StripSymbols tells the compiler to strip debugging symbols from the final executable if we’re on Linux and put them into their own file.  This will greatly reduce the final executable’s size.–>   <StripSymbols>true</StripSymbols>  </PropertyGroup>  <ItemGroup>    <PackageReference Include=”Amazon.Lambda.Core” Version=”2.2.0″ />    <PackageReference Include=”Amazon.Lambda.RuntimeSupport” Version=”1.10.0″ />    <PackageReference Include=”Amazon.Lambda.Serialization.SystemTextJson” Version=”2.4.0″ />  </ItemGroup></Project> 

Cập nhật các hàm 

  1. Tham khảo thư viện chú thích với using Amazon.Lambda.Annotations;
  2. Thêm [assembly:LambdaGlobalProperties(GenerateMain = true)] để cho phép khung chú thích tạo phương thức chính. Điều này là bắt buộc vì dự án hiện là một tệp thực thi thay vì một thư viện.
  3. Thêm lớp một phần (partial class) bên dưới và bao gồm một thuộc tính JsonSerializable cho bất kỳ kiểu dữ liệu loại nào bạn cần tuần tự hóa, bao gồm cả đầu vào và đầu ra hàm chức năng của bạn. Lớp một phần này được sử dụng tại thời điểm xây dựng để tạo mã không phản chiếu dành riêng cho việc tuần tự hóa các loại được liệt kê. Sau đây là một ví dụ:
/// <summary>/// This class is used to register the input event and return type for the FunctionHandler method with the System.Text.Json source generator./// There must be a JsonSerializable attribute for each type used as the input and return type or a runtime error will occur /// from the JSON serializer unable to find the serialization information for unknown types./// </summary>[JsonSerializable(typeof(APIGatewayHttpApiV2ProxyRequest))][JsonSerializable(typeof(APIGatewayHttpApiV2ProxyResponse))]public partial class MyCustomJsonSerializerContext : JsonSerializerContext{    // By using this partial class derived from JsonSerializerContext, we can generate reflection free JSON Serializer code at compile time    // which can deserialize our class and properties. However, we must attribute this class to tell it what types to generate serialization code for    // See https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-source-generation
  1. Sau khi sử dụng câu lệnh, hãy thêm dòng sau để chỉ định bộ nối tiếp sẽ sử dụng

[assembly: LambdaSerializer(typeof(SourceGeneratorLambdaJsonSerializer<LambdaFunctionJsonSerializerContext>))]

Chuyển đổi LambdaFunctionJsonSerializerContext cho ngữ cảnh của bạn nếu bạn không sử dụng lớp một phần ở bước trước.

Cập nhật cấu hình chức năng của bạn

Nếu bạn đang sử dụng aws-lambda-tools-defaults.json

  1. Chỉnh function-runtime về dotnet8 .
  2. Chỉnh function-architecture  phù hợp với máy bạn đang sử dụng –x86_64 hoặc arm64.
  3. Chỉnh hoặc cập nhật environment-variables bao gồm ANNOTATIONS_HANDLER=<YourFunctionHandler>. Thay thế <YourFunctionHandler> với tên phương thức của trình xử lý hàm của bạn, để khung chú thích biết phương thức nào cần gọi từ phương thức chính được tạo.
  4. Chỉnh function-handler vào tên của tập hợp thực thi trong thư mục bin của bạn. Trong mặc định, đây sẽ là tên Project của bạn, thể hiện  .NET Lambda bootstrap script để chạy nhị phân gốc của bạn thay vì bắt đầu thời gian chạy .NET. Nếu tệp dự án của bạn có AssemblyName thì hãy sử dụng giá trị đó cho trình xử lý hàm.
{  “function-architecture”: “x86_64”,  “function-runtime”: “dotnet8”,  “function-handler”: “<your-assembly-name>”,  “environment-variables”,  “ANNOTATIONS_HANDLER=<your-function-handler>”,}

Triển khai và kiểm thử

  1. Triển khai chương trình. Nếu bạn sử dụng Amazon.Lambda.Tools , chạy dotnet lambda deploy-function. Kiểm tra các cảnh báo trong quá trình xây dựng và cấu trúc lại để loại bỏ chúng.
  2. Kiểm tra chức năng của bạn để đảm bảo rằng các lệnh gọi gốc vào AL2023 đang hoạt động chính xác. Theo mặc định, việc chạy thử nghiệm đơn vị cục bộ trên máy phát triển của bạn sẽ không chạy tự nhiên và vẫn sẽ sử dụng trình biên dịch JIT. Chạy bằng trình biên dịch JIT không cho phép bạn phát hiện các lỗi thời gian chạy cụ thể của AOT.

Kết luận

Lambda đang giới thiệu phiên bản.NET 8 được quản lý. Bài đăng này nêu bật các tính năng mới trong .NET 8. Bạn có thể tạo các hàm Lambda mới hoặc di chuyển các hàm hiện có sang .NET 8 hoặc .NET 8 Native AOT.

Để thêm thông tin và chi tiết, xem thêm tại AWS Lambda for .NET , documentation, và .NET on Serverless Land.

Leave a comment