Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Kompilasi kode fungsi.NET Lambda ke format runtime asli
.NET 8 mendukung kompilasi asli ahead-of-time (AOT). Dengan AOT asli, Anda dapat mengkompilasi kode fungsi Lambda Anda ke format runtime asli, yang menghilangkan kebutuhan untuk mengkompilasi kode.NET saat runtime. Kompilasi AOT asli dapat mengurangi waktu mulai dingin untuk fungsi Lambda yang Anda tulis di.NET. Untuk informasi selengkapnya, lihat Memperkenalkan runtime .NET 8 untuk AWS Lambda
waktu aktif Lambda
Untuk menerapkan build fungsi Lambda dengan kompilasi AOT asli, gunakan runtime .NET 8 Lambda yang dikelola. Runtime ini mendukung penggunaan arsitektur x86_64 dan arm64.
Saat Anda menerapkan fungsi.NET Lambda tanpa menggunakan AOT, aplikasi Anda pertama kali dikompilasi ke dalam kode Bahasa Menengah (IL). Saat runtime, compiler just-in-time (JIT) di runtime Lambda mengambil kode IL dan mengkompilasinya ke dalam kode mesin sesuai kebutuhan. Dengan fungsi Lambda yang dikompilasi sebelumnya dengan AOT asli, Anda mengkompilasi kode Anda ke dalam kode mesin saat Anda menerapkan fungsi Anda, jadi Anda tidak bergantung pada runtime .NET atau SDK di runtime Lambda untuk mengkompilasi kode Anda sebelum dijalankan.
Salah satu batasan AOT adalah bahwa kode aplikasi Anda harus dikompilasi dalam lingkungan dengan sistem operasi Amazon Linux 2023 (AL2023) yang sama dengan yang digunakan runtime .NET 8. .NET Lambda CLI menyediakan fungsionalitas untuk mengkompilasi aplikasi Anda dalam wadah Docker menggunakan gambar AL2023.
Untuk menghindari potensi masalah dengan kompatibilitas lintas arsitektur, kami sangat menyarankan agar Anda mengkompilasi kode Anda di lingkungan dengan arsitektur prosesor yang sama dengan yang Anda konfigurasikan untuk fungsi Anda. Untuk mempelajari lebih lanjut tentang batasan kompilasi lintas arsitektur, lihat Kompilasi silang
Prasyarat
- Docker
-
Untuk menggunakan AOT asli, kode fungsi Anda harus dikompilasi dalam lingkungan dengan sistem operasi AL2023 yang sama dengan runtime .NET 8. Perintah.NET CLI di bagian berikut menggunakan Docker untuk mengembangkan dan membangun fungsi Lambda di lingkungan AL2023.
- .NET 8 SDK
-
Kompilasi AOT asli adalah fitur dari .NET 8. Anda harus menginstal .NET 8 SDK
pada mesin build Anda, tidak hanya runtime. - Amazon.Lambda.Tools
-
Untuk membuat fungsi Lambda Anda, Anda menggunakan Amazon.Lambda.Tools
ekstensi.NET Global Tools . Untuk menginstalAmazon.Lambda.Tools, jalankan perintah berikut: dotnet tool install -g Amazon.Lambda.Tools
Untuk informasi selengkapnya tentang Amazon.Lambda.Tools ekstensi.NET CLI, lihat AWS Extensions for .NET CLI
repository on. GitHub - Amazon.Lambda.Templates
-
Untuk menghasilkan kode fungsi Lambda Anda, gunakan paket. Amazon.Lambda.Templates
NuGet Untuk menginstal paket template ini, jalankan perintah berikut: dotnet new install Amazon.Lambda.Templates
Memulai
Baik .NET Global CLI dan AWS Serverless Application Model (AWS SAM) menyediakan template memulai untuk membangun aplikasi menggunakan AOT asli. Untuk membangun fungsi AOT Lambda asli pertama Anda, lakukan langkah-langkah dalam instruksi berikut.
Untuk menginisialisasi dan menerapkan fungsi Lambda yang dikompilasi AOT asli
-
Inisialisasi proyek baru menggunakan template AOT asli dan kemudian navigasikan ke direktori yang berisi file yang dibuat
.cs
dan.csproj
. Dalam contoh ini, kita menamai fungsi kitaNativeAotSample
.dotnet new lambda.NativeAOT -n NativeAotSample cd ./NativeAotSample/src/NativeAotSample
Function.cs
File yang dibuat oleh template AOT asli berisi kode fungsi berikut.using Amazon.Lambda.Core; using Amazon.Lambda.RuntimeSupport; using Amazon.Lambda.Serialization.SystemTextJson; using System.Text.Json.Serialization; namespace NativeAotSample; public class Function { /// <summary> /// The main entry point for the Lambda function. The main function is called once during the Lambda init phase. It /// initializes the .NET Lambda runtime client passing in the function handler to invoke for each Lambda event and /// the JSON serializer to use for converting Lambda JSON format to the .NET types. /// </summary> private static async Task Main() { Func<string, ILambdaContext, string> handler = FunctionHandler; await LambdaBootstrapBuilder.Create(handler, new SourceGeneratorLambdaJsonSerializer<LambdaFunctionJsonSerializerContext>()) .Build() .RunAsync(); } /// <summary> /// A simple function that takes a string and does a ToUpper. /// /// To use this handler to respond to an AWS event, reference the appropriate package from /// https://github.com/aws/aws-lambda-dotnet#events /// and change the string input parameter to the desired event type. When the event type /// is changed, the handler type registered in the main method needs to be updated and the LambdaFunctionJsonSerializerContext /// defined below will need the JsonSerializable updated. If the return type and event type are different then the /// LambdaFunctionJsonSerializerContext must have two JsonSerializable attributes, one for each type. /// // When using Native AOT extra testing with the deployed Lambda functions is required to ensure // the libraries used in the Lambda function work correctly with Native AOT. If a runtime // error occurs about missing types or methods the most likely solution will be to remove references to trim-unsafe // code or configure trimming options. This sample defaults to partial TrimMode because currently the AWS // SDK for .NET does not support trimming. This will result in a larger executable size, and still does not // guarantee runtime trimming errors won't be hit. /// </summary> /// <param name="input"></param> /// <param name="context"></param> /// <returns></returns> public static string FunctionHandler(string input, ILambdaContext context) { return input.ToUpper(); } } /// <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(string))] public partial class LambdaFunctionJsonSerializerContext : 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
Native AOT mengkompilasi aplikasi Anda menjadi satu biner asli. Titik masuk biner itu adalah metodenya.
static Main
Di dalamstatic Main
, runtime Lambda di-bootstrap dan metode disiapkan.FunctionHandler
Sebagai bagian dari bootstrap runtime, serializer yang dihasilkan sumber dikonfigurasi menggunakannew SourceGeneratorLambdaJsonSerializer<LambdaFunctionJsonSerializerContext>()
-
Untuk menyebarkan aplikasi Anda ke Lambda, pastikan Docker berjalan di lingkungan lokal Anda dan jalankan perintah berikut.
dotnet lambda deploy-function
Di belakang layar, CLI global.NET mengunduh image AL2023 Docker dan mengkompilasi kode aplikasi Anda di dalam wadah yang sedang berjalan. Biner yang dikompilasi adalah output kembali ke sistem file lokal Anda sebelum diterapkan ke Lambda.
-
Uji fungsi Anda dengan menjalankan perintah berikut. Ganti
<FUNCTION_NAME>
dengan nama yang Anda pilih untuk fungsi Anda di wizard penerapan.dotnet lambda invoke-function <FUNCTION_NAME> --payload "hello world"
Respons dari CLI mencakup detail kinerja untuk start dingin (durasi inisialisasi) dan total waktu berjalan untuk pemanggilan fungsi Anda.
-
Untuk menghapus AWS sumber daya yang Anda buat dengan mengikuti langkah-langkah sebelumnya, jalankan perintah berikut. Ganti
<FUNCTION_NAME>
dengan nama yang Anda pilih untuk fungsi Anda di wizard penerapan. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan tagihan yang tidak perlu ditagih ke Anda. Akun AWSdotnet lambda delete-function <FUNCTION_NAME>
Serialisasi
Untuk menyebarkan fungsi ke Lambda menggunakan AOT asli, kode fungsi Anda harus menggunakanProduct
tipe kustom akan menyertakan serializer yang didefinisikan sebagai berikut.
[JsonSerializable(typeof(APIGatewayProxyRequest))] [JsonSerializable(typeof(APIGatewayProxyResponse))] [JsonSerializable(typeof(Product))] public partial class CustomSerializer : JsonSerializerContext { }
Pemangkasan
Native AOT memangkas kode aplikasi Anda sebagai bagian dari kompilasi untuk memastikan bahwa biner sekecil mungkin. .NET 8 untuk Lambda memberikan dukungan pemangkasan yang lebih baik dibandingkan dengan versi sebelumnya .NET. Support telah ditambahkan ke pustaka runtime Lambda
Peningkatan ini menawarkan potensi untuk menghilangkan peringatan pemangkasan waktu pembuatan, tetapi .NET tidak akan pernah sepenuhnya aman. Ini berarti bahwa bagian pustaka yang diandalkan fungsi Anda dapat dipangkas sebagai bagian dari langkah kompilasi. Anda dapat mengelola ini dengan mendefinisikan TrimmerRootAssemblies
sebagai bagian dari .csproj
file Anda seperti yang ditunjukkan pada contoh berikut.
<ItemGroup> <TrimmerRootAssembly Include="AWSSDK.Core" /> <TrimmerRootAssembly Include="AWSXRayRecorder.Core" /> <TrimmerRootAssembly Include="AWSXRayRecorder.Handlers.AwsSdk" /> <TrimmerRootAssembly Include="Amazon.Lambda.APIGatewayEvents" /> <TrimmerRootAssembly Include="bootstrap" /> <TrimmerRootAssembly Include="Shared" /> </ItemGroup>
Perhatikan bahwa saat Anda menerima peringatan trim, menambahkan kelas yang menghasilkan peringatan TrimmerRootAssembly
mungkin tidak menyelesaikan masalah. Peringatan trim menunjukkan bahwa kelas mencoba mengakses beberapa kelas lain yang tidak dapat ditentukan hingga runtime. Untuk menghindari kesalahan runtime, tambahkan kelas kedua ini keTrimmerRootAssembly
.
Untuk mempelajari selengkapnya tentang mengelola peringatan trim, lihat Pengantar untuk memangkas peringatan
Pemecahan Masalah
- Kesalahan: Kompilasi asli lintas-OS tidak didukung.
-
Versi alat Amazon.Lambda.Tools global.NET Core Anda sudah ketinggalan zaman. Perbarui ke versi terbaru dan coba lagi.
- Docker: sistem operasi gambar “linux” tidak dapat digunakan pada platform ini.
-
Docker pada sistem Anda dikonfigurasi untuk menggunakan wadah Windows. Tukar ke wadah Linux untuk menjalankan lingkungan build AOT asli.
Untuk informasi selengkapnya tentang kesalahan umum, lihat repositori AWS NativeAOT for