La CLI de .NET y la extensión .NET Lambda Global Tools (Amazon.Lambda.Tools
) ofrecen una forma multiplataforma para crear aplicaciones Lambda basadas en .NET, empaquetarlas e implementarlas en Lambda. En esta sección, aprenderá a crear nuevos proyectos .NET de Lambda mediante la CLI de .NET y las plantillas de Amazon Lambda, y a empaquetarlos e implementarlos mediante Amazon.Lambda.Tools
Temas
Requisitos previos
- SDK para .NET 8
-
Si aún no lo ha hecho, instale el SDK y el tiempo de ejecución de .NET 8
. - AWS Plantillas de proyecto .NET Amazon.Lambda.Templates
-
Para generar el código de la función de Lambda, utilice el paquete NuGet Amazon.Lambda.Templates
. Para instalar este paquete de plantillas, ejecute el siguiente comando: dotnet new install Amazon.Lambda.Templates
- AWS Herramientas globales para la CLI de .NET Amazon.Lambda.Tools
-
Para crear sus funciones de Lambda, utilice la extensión de herramientas globales de .NET
Amazon.Lambda.Tools . Ejecute el siguiente comando para instalar Amazon.Lambda.Tools: dotnet tool install -g Amazon.Lambda.Tools
Para obtener más información sobre la Amazon.Lambda.Tools de la extensión de la CLI de .NET, consulte el repositorio en GitHub Extensiones de AWS para la CLI de .NET
.
Creación de proyectos .NET mediante la CLI de .NET
En la CLI de .NET se usa el comando dotnet new
para crear proyectos .NET desde la línea de comando. Lambda ofrece plantillas adicionales mediante el paquete Amazon.Lambda.Templates
Tras la instalación de este paquete, ejecute el siguiente comando para ver una lista de las plantillas disponibles.
dotnet new list
Para examinar los detalles acerca de una plantilla, utilice la opción help
. Por ejemplo, para ver los detalles de la plantilla lambda.EmptyFunction
, ejecute el siguiente comando.
dotnet new lambda.EmptyFunction --help
Para crear una plantilla básica para una función de Lambda .NET, utilice la plantilla lambda.EmptyFunction
. Esto crea una función sencilla que toma una cadena como entrada y la convierte a mayúsculas mediante el método ToUpper
. Esta plantilla es compatible con las siguientes opciones:
-
--name
: el nombre de la función. -
--region
: la región AWS para crear la función dentro. -
--profile
: el nombre de un perfil en su archivo de credenciales de AWS SDK for .NET. Para obtener más información sobre los perfiles de credenciales en .NET, consulte Configurar credenciales AWS en SDK AWS para Guía para desarrolladores de .NET.
En este ejemplo, creamos una nueva función vacía llamada myDotnetFunction
con el perfil y la configuración Región de AWS predeterminados:
dotnet new lambda.EmptyFunction --name myDotnetFunction
Este comando crea los siguientes archivos y directorios en el directorio de su proyecto.
└── myDotnetFunction
├── src
│ └── myDotnetFunction
│ ├── Function.cs
│ ├── Readme.md
│ ├── aws-lambda-tools-defaults.json
│ └── myDotnetFunction.csproj
└── test
└── myDotnetFunction.Tests
├── FunctionTest.cs
└── myDotnetFunction.Tests.csproj
En el directorio src/myDotnetFunction
, examine los archivos siguientes:
-
aws-lambda-tools-defaults.json: aquí se especifican las opciones de línea de comando al implementar su función de Lambda. Por ejemplo:
"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: el código de la función de controlador de Lambda. Es una plantilla de C# que incluye la biblioteca
Amazon.Lambda.Core
predeterminada y un atributoLambdaSerializer
predeterminado. Para obtener más información acerca de las opciones y los requisitos de serialización, consulte Serialización de las funciones de Lambda. También incluye una función de muestra que puede editar para aplicar el código de su función de 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 archivo MSBuild
que enumera los archivos y ensamblados que componen la aplicación. <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: use este archivo para documentar su función de Lambda.
En el directorio myfunction/test
, examine los archivos siguientes:
-
myDotnetFunction.Tests.csproj: como se ha indicado con anterioridad, este es un archivo MSBuild
que enumera los archivos y los ensamblados que componen el proyecto de prueba. Tenga en cuenta que también incluye la biblioteca Amazon.Lambda.Core
, de modo que puede integrar a la perfección cualquier plantilla de Lambda necesaria para probar la función.<Project Sdk="Microsoft.NET.Sdk"> ... <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0 " /> ...
-
FunctionTest.cs: el mismo archivo de plantilla de código C# que se incluye en el directorio
src
. Edite este archivo para reflejar el código de producto de su función y probarlo antes de cargar su función de Lambda en un entorno de producción.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); } } }
Implementación de proyectos.NET mediante la CLI de .NET
Para crear su paquete de implementación e implementarlo en Lambda, utilice las herramientas de CLI Amazon.Lambda.Tools
. Para implementar la función a partir de los archivos que creó en los pasos anteriores, primero navegue hasta la carpeta que contiene el archivo .csproj
de la función.
cd myDotnetFunction/src/myDotnetFunction
Para implementar el código en Lambda como un paquete de implementación .zip, ejecute el siguiente comando. Elija su propio nombre de función.
dotnet lambda deploy-function
myDotnetFunction
Durante la implementación, el asistente le pide que seleccione un Definición de permisos de funciones de Lambda con un rol de ejecución. Para este ejemplo, seleccione lambda_basic_role
.
Una vez implementada la función, puede probarla en la nube con el comando dotnet lambda invoke-function
. Para el código de ejemplo de la plantilla lambda.EmptyFunction
, puede probar su función pasando una cadena mediante la opción --payload
.
dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK"
Si la función se ha implementado correctamente, debería ver un resultado similar al siguiente.
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
Uso de capas de Lambda con la CLI de .NET
nota
El uso de capas con funciones en un lenguaje compilado, como C#, puede no ofrecer las mismas ventajas que con un lenguaje interpretado, como Python. Como C# es un lenguaje compilado, las funciones aún tienen que cargar de forma manual los ensamblajes compartidos en la memoria durante la fase de inicio, lo que puede aumentar los tiempos de arranque en frío. En su lugar, se recomienda incluir cualquier código compartido en el momento de la compilación para aprovechar las optimizaciones del compilador integradas.
La CLI de .NET admite comandos que lo ayudan a publicar capas e implementar funciones de C# que consumen capas. Para publicar una capa en un bucket de Amazon S3 específico, ejecute el siguiente comando en el mismo directorio que su archivo .csproj
:
dotnet lambda publish-layer
<layer_name>
--layer-type runtime-package-store --s3-bucket<s3_bucket_name>
Luego, cuando implemente la función mediante la CLI de .NET, especifique el ARN de la capa que consumirá en el siguiente comando:
dotnet lambda deploy-function
<function_name>
--function-layersarn:aws:lambda:us-east-1:123456789012:layer:layer-name:1
Para conocer un ejemplo completo de una función “Hola, mundo”, consulte la muestra blank-csharp-with-layer