View a markdown version of this page

Kompilasi kode fungsi.NET Lambda ke format runtime asli - AWS Lambda

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 di AWS Compute Blog.

waktu aktif Lambda

Untuk menerapkan build fungsi Lambda dengan kompilasi AOT asli, gunakan runtime Lambda .NET 8 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 Intermediate Language (IL). Saat runtime, kompiler 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 menjadi kode mesin saat Anda menerapkan fungsi Anda, sehingga Anda tidak bergantung pada runtime .NET atau SDK di runtime Lambda untuk mengkompilasi kode Anda sebelum dijalankan.

Salah satu batasan AOT adalah kode aplikasi Anda harus dikompilasi di lingkungan dengan sistem operasi Amazon Linux 2023 (AL2023) yang sama 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 Anda mengkompilasi kode Anda di lingkungan dengan arsitektur prosesor yang sama dengan yang Anda konfigurasikan untuk fungsi Anda. Untuk mempelajari selengkapnya tentang keterbatasan kompilasi lintas arsitektur, lihat Cross-compilation dokumentasi Microsoft.NET.

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.

.NET8 SDK

Kompilasi AOT asli adalah fitur dari.NET 8. Anda harus menginstal .NET 8 SDK pada mesin build Anda, bukan hanya runtime.

Amazon.Lambda.Tools

Untuk membuat fungsi Lambda Anda, Anda menggunakan eksten si Amazon.Lambda.Tools .NET Global Tools. Untuk menginstalAmazon.Lambda.Tools, jalankan perintah berikut:

dotnet tool install -g Amazon.Lambda.Tools

Untuk informasi selengkapnya tentang ekstensi Amazon.Lambda.Tools .NET CLI, lihat Eksten AWS si untuk repositori.NET CLI pada. GitHub

Amazon.Lambda.Templates

Untuk menghasilkan kode fungsi Lambda Anda, gunakan Amazon.Lambda.Templates NuGet paket. 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 untuk 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 terkompilasi AOT asli
  1. Inisialisasi proyek baru menggunakan template AOT asli dan kemudian navigasikan ke direktori yang berisi file .cs dan .csproj yang dibuat. Dalam contoh ini, kita menamai fungsi kitaNativeAotSample.

    dotnet new lambda.NativeAOT -n NativeAotSample cd ./NativeAotSample/src/NativeAotSample

    Function.csFile 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

    AOT asli mengkompilasi aplikasi Anda menjadi biner asli tunggal. Titik masuk dari biner itu adalah metode. static Main Di dalamstatic Main, runtime Lambda di-bootstrap dan FunctionHandler metode diatur. Sebagai bagian dari runtime bootstrap, serializer yang dihasilkan sumber dikonfigurasi menggunakan new SourceGeneratorLambdaJsonSerializer<LambdaFunctionJsonSerializerContext>()

  2. Untuk menerapkan aplikasi Anda ke Lambda, pastikan Docker berjalan di lingkungan lokal Anda dan jalankan perintah berikut.

    dotnet lambda deploy-function

    Di balik layar, .NET global CLI mengunduh gambar Docker AL2023 dan mengkompilasi kode aplikasi Anda di dalam wadah yang sedang berjalan. Biner yang dikompilasi dikeluarkan kembali ke sistem file lokal Anda sebelum digunakan ke Lambda.

  3. 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.

  4. 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 yang tidak perlu ditagih kepada sumber daya Anda Akun AWS.

    dotnet lambda delete-function <FUNCTION_NAME>

Serialisasi

Untuk menerapkan fungsi ke Lambda menggunakan AOT asli, kode fungsi Anda harus menggunakan serialisasi yang dihasilkan sumber. Alih-alih menggunakan refleksi run-time untuk mengumpulkan metadata yang diperlukan untuk mengakses properti objek untuk serialisasi, generator sumber menghasilkan file sumber C# yang dikompilasi saat Anda membangun aplikasi Anda. Untuk mengonfigurasi serializer yang dihasilkan sumber dengan benar, pastikan Anda menyertakan objek input dan output apa pun yang digunakan fungsi Anda, serta jenis kustom apa pun. Misalnya, fungsi Lambda yang menerima peristiwa dari API Gateway REST API dan mengembalikan Product tipe khusus akan menyertakan serializer yang didefinisikan sebagai berikut.

[JsonSerializable(typeof(APIGatewayProxyRequest))] [JsonSerializable(typeof(APIGatewayProxyResponse))] [JsonSerializable(typeof(Product))] public partial class CustomSerializer : JsonSerializerContext { }

Pemangkasan

AOT asli 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 dari .NET. Dukungan telah ditambahkan ke library runtime Lambda, AWS .NET SDK, .NET Lambda Annotations, dan .NET 8 itu sendiri.

Peningkatan ini menawarkan potensi untuk menghilangkan peringatan pemangkasan waktu pembuatan, tetapi .NET tidak pernah sepenuhnya aman untuk memotong. Ini berarti bahwa bagian pustaka yang bergantung pada fungsi Anda mungkin dipangkas sebagai bagian dari langkah kompilasi. Anda dapat mengelola ini dengan mendefinisikan TrimmerRootAssemblies sebagai bagian dari .csproj file Anda seperti yang ditunjukkan dalam 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 ketika 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 sampai runtime. Untuk menghindari kesalahan runtime, tambahkan kelas kedua ini keTrimmerRootAssembly.

Untuk mempelajari selengkapnya tentang mengelola peringatan trim, lihat Pengantar peringatan trim di dokumentasi Microsoft.NET.

Pemecahan masalah

Kesalahan: kompilasi Cross-OS asli tidak didukung.

Versi alat global Amazon.Lambda.Tools .NET Core Anda sudah kedaluwarsa. 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 untuk .NET pada. GitHub