Utilizzo della CLI globale Lambda di .NET - AWS Lambda

Utilizzo della CLI globale Lambda di .NET

La CLI .NET e l'estensione degli strumenti globali Lambda .NET (Amazon.Lambda.Tools) offrono un modo multi-piattaforma per creare applicazioni Lambda basate su .NET, impacchettarle e implementarle in Lambda. In questa sezione, scoprirai come creare nuovi progetti Lambda .NET utilizzando la CLI .NET e i modelli Amazon Lambda e come impacchettarli e implementarli tramite Amazon.Lambda.Tools

Prerequisiti

SDK .NET 8

Se non l'hai già fatto, installa l'SDK .NET 8 e Runtime.

Modelli di progetto .NET di AWS Amazon.Lambda.Templates

Per generare il codice della funzione Lambda, usa il pacchetto Amazon.Lambda.Templates NuGet. Per installare questo pacchetto del modello, esegui il comando riportato:

dotnet new install Amazon.Lambda.Templates
Strumenti della CLI globale .NET AWSAmazon.Lambda.Tools

Per creare le funzioni Lambda, usa l'estensione degli strumenti globali .NET Amazon.Lambda.Tools. Per installare Amazon.Lambda.Tools, esegui il comando riportato:

dotnet tool install -g Amazon.Lambda.Tools

Per ulteriori informazioni sull'estensione della CLI .NET Amazon.Lambda.Tools, consulta il repository Estensioni AWS per la CLI .NET su GitHub.

Creazione di progetti .NET con la CLI .NET

Nella CLI .NET, utilizzi il comando dotnet new per creare progetti .NET da una riga di comando. Lambda offre modelli aggiuntivi che utilizzano il pacchetto NuGet Amazon.Lambda.Templates.

Dopo aver installato questo pacchetto, esegui il comando di seguito per visualizzare un elenco di modelli disponibili.

dotnet new list

Per esaminare i dettagli relativi a un modello, utilizzare l'opzione help. Ad esempio, per visualizzare i dettagli del modello lambda.EmptyFunction, emetti il seguente comando.

dotnet new lambda.EmptyFunction --help

Per creare un modello di base per una funzione Lambda .NET, usa il modello lambda.EmptyFunction. In questo modo viene creata una funzione semplice che accetta una stringa come input e la converte in lettere maiuscole utilizzando il metodo ToUpper. Questo modello supporta le seguenti opzioni:

  • --name: il nome della funzione.

  • --region: la regione AWS in cui creare la funzione.

  • --profile: il nome di un profilo nel file delle credenziali AWS SDK per .NET. Per ulteriori informazioni sui profili di credenziali in .NET, consulta Configurazione delle credenziali di AWS nella Guida per gli sviluppatori di SDK AWS per .NET.

In questo esempio, creiamo una nuova funzione vuota denominata myDotnetFunction utilizzando il profilo e le impostazioni di Regione AWS predefiniti:

dotnet new lambda.EmptyFunction --name myDotnetFunction

Questo comando crea i seguenti file e directory nella directory di progetto.

└── myDotnetFunction ├── src │   └── myDotnetFunction │   ├── Function.cs │   ├── Readme.md │   ├── aws-lambda-tools-defaults.json │   └── myDotnetFunction.csproj └── test └── myDotnetFunction.Tests ├── FunctionTest.cs └── myDotnetFunction.Tests.csproj

Nella directory src/myDotnetFunction esaminare i file seguenti:

  • aws-lambda-tools-defaults.json: file in cui si specificano le opzioni della riga di comando quando si distribuisce la funzione Lambda. Ad esempio:

    "profile" : "default", "region" : "us-east-2", "configuration" : "Release", "function-architecture": "x86_64", "function-runtime":"dotnet8", "function-memory-size" : 256, "function-timeout" : 30, "function-handler" : "myDotnetFunction::myDotnetFunction.Function::FunctionHandler"
  • Function.cs: codice della funzione del gestore Lambda. Si tratta di un modello C# che include la libreria Amazon.Lambda.Core e un attributo LambdaSerializer predefiniti. Per ulteriori informazioni sui requisiti e sulle opzioni di serializzazione, consulta Serializzazione nelle funzioni Lambda C#. Include anche una funzione di esempio che è possibile modificare per applicare il codice della funzione Lambda.

    using Amazon.Lambda.Core; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace myDotnetFunction; public class Function { /// <summary> /// A simple function that takes a string and does a ToUpper /// </summary≫ /// <param name="input"></param> /// <param name="context"></param> /// <returns></returns> public string FunctionHandler(string input, ILambdaContext context) { return input.ToUpper(); } }
  • myDotnetFunction.csproj: un file MSBuild in cui sono elencati i file e gli assembly che costituiscono l'applicazione.

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <AWSProjectType>Lambda</AWSProjectType> <!-- This property makes the build directory similar to a publish directory and helps the AWS .NET Lambda Mock Test Tool find project dependencies. --> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!-- Generate ready to run images during publishing to improve cold start time. --> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0" /> <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.4.0" /> </ItemGroup> </Project>
  • Readme: file che consente di documentare la funzione Lambda.

Nella directory myfunction/test esaminare i file seguenti:

  • myDotnetFunction.Tests.csproj: come indicato in precedenza, si tratta di un file MSBuild in cui sono elencati file e assembly che costituiscono il progetto di test. Si noti anche che nel file è inclusa la libreria Amazon.Lambda.Core, che consente di integrare in modo semplice qualsiasi modello Lambda necessario per eseguire il test della funzione.

    <Project Sdk="Microsoft.NET.Sdk"> ... <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0 " /> ...
  • FunctionTest.cs: lo stesso file di modello del codice C# incluso nella directory src. Modificare questo file per eseguire il mirroring del codice di produzione della funzione e per eseguirne il test prima di caricare la funzione Lambda in un ambiente di produzione.

    using Xunit; using Amazon.Lambda.Core; using Amazon.Lambda.TestUtilities; using MyFunction; namespace MyFunction.Tests { public class FunctionTest { [Fact] public void TestToUpperFunction() { // Invoke the lambda function and confirm the string was upper cased. var function = new Function(); var context = new TestLambdaContext(); var upperCase = function.FunctionHandler("hello world", context); Assert.Equal("HELLO WORLD", upperCase); } } }

Implementazione di progetti .NET con la CLI .NET

Per creare il pacchetto di implementazione e implementarlo in Lambda, utilizzi gli strumenti della CLI Amazon.Lambda.Tools. Per implementare la funzione dai file creati nei passaggi precedenti, per prima cosa accedi alla cartella contenente il file .csproj della funzione.

cd myDotnetFunction/src/myDotnetFunction

Per implementare il codice in Lambda come pacchetto di implementazione .zip, emetti il comando seguente. Scegli il nome della tua funzione.

dotnet lambda deploy-function myDotnetFunction

Durante l'implementazione, la procedura guidata chiede di selezionare un Definizione delle autorizzazioni della funzione Lambda con un ruolo di esecuzione. Per questo esempio, seleziona lambda_basic_role.

Dopo aver implementato la funzione, puoi testarla nel cloud con il comando dotnet lambda invoke-function. Per il codice di esempio nel modello lambda.EmptyFunction, puoi testare la tua funzione inserendo una stringa utilizzando l'opzione --payload.

dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK"

Se la funzione è stata implementata con successo, dovresti vedere un output simile al seguente.

dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK" Amazon Lambda Tools for .NET Core applications (5.8.0) Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet Payload: "JUST CHECKING IF EVERYTHING IS OK" 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

Utilizzo dei livelli Lambda con la CLI di .NET

Nota

Anche se è possibile utilizzare livelli con funzioni in .NET, tale scelta non è preferibile. Le funzioni in .NET che utilizzano livelli caricano manualmente gli assembly condivisi in memoria durante la fase Init, per cui i tempi di avvio a freddo possono aumentare. Includi, invece, tutto il codice condiviso in fase di compilazione per sfruttare le ottimizzazioni integrate del compilatore .NET.

La CLI di .NET supporta comandi che facilitano la pubblicazione di livelli e l'implementazione di funzioni C# che utilizzano livelli. Per pubblicare un livello in un bucket Amazon S3 specificato, utilizza il comando seguente nella stessa directory del tuo file .csproj:

dotnet lambda publish-layer <layer_name> --layer-type runtime-package-store --s3-bucket <s3_bucket_name>

Quando implementi la funzione utilizzando la CLI di .NET, quindi, specifica l'ARN utilizzato dal livello nel seguente comando:

dotnet lambda deploy-function <function_name> --function-layers arn:aws:lambda:us-east-1:123456789012:layer:layer-name:1

Per un esempio completo di una funzione Hello World, consulta l'esempio blank-csharp-with-layer.