Introducción al uso de .NET con funciones de AWS Lambda

Las funciones de AWS Lambda son un modelo informático sin servidor que le permite ejecutar código sin servidores. Por lo general, se escriben con lenguajes como JavaScript y Python, pero AWS ahora admite muchos tiempos de ejecución diferentes, incluido .NET para C#.

¿Por qué usar .NET para Lambda?

Ahora hay muchos idiomas diferentes disponibles para Lambda, por lo que tiene muchas opciones. En general, JavaScript y Python se usan para funciones de automatización simples que se preocupan por tiempos de inicio rápidos. Sin embargo, no son los de mayor rendimiento para el procesamiento pesado, y ser lenguajes de secuencias de comandos de escritura dinámica es una desventaja importante para las aplicaciones complejas.

Si C# es su lenguaje de elección, no hay muchas desventajas en usarlo para Lambda, especialmente si cambiar a Python o JavaScript es demasiado complicado. Las herramientas que proporciona AWS también son buenas y tiene acceso a todo el SDK de AWS, lo que significa que puede realizar búsquedas en servicios como Lambda y DynamoDB con facilidad.

Además, AWS es compatible con todo el tiempo de ejecución de .NET, lo que significa que puede usar otros lenguajes además de C# que también se compilan en archivos binarios de .NET. C# es abrumadoramente el más popular, pero también podría escribir Funciones Lambda en F# o VB.NET.

¿Cómo funciona?

Los lenguajes como Java y C# son generalmente mucho mejores, pero su uso tiene un inconveniente. Ambos están compilados en un código de bytes que debe compilarse al inicio, por lo que tienen tiempos de inicio más altos, especialmente cuando se inician en frío. Los «inicios en frío» son cuando AWS no ha ejecutado la función en los últimos minutos, por lo que no la almacenará en caché y deberá realizar la compilación justo a tiempo nuevamente para ponerla en funcionamiento. Este proceso puede hacer que sus funciones tarden un segundo o más en responder, lo que no es bueno para las aplicaciones web.

Sin embargo, este problema se mitiga en gran medida si usa Lambda con mucha frecuencia. También puede reducir por completo los tiempos de arranque en frío con simultaneidad aprovisionada. Los tiempos de respuesta regulares para .NET son muy altos y el rendimiento está a la par con los lenguajes completamente compilados como Go y Rust.

Si actualmente usa funciones de Java para Lambda, C# puede ser un reemplazo viable, ya que el tiempo de ejecución moderno de .NET 6 usa menos memoria y se inicia más rápido que la JVM en la mayoría de los casos.

Configuración de funciones Lambda de C#

Primero, necesitará .NET instalado. AWS es compatible con .NET Core 3.1 y .NET 6, por lo que cualquiera de esos dos tiempos de ejecución funcionará, pero lo más importante es que necesitará el dotnet CLI instalado para que pueda instalar las plantillas de Lambda. Puedes obtener .NET del portal de documentación de Microsoft.

Deberá instalar las plantillas de Lambda y las herramientas globales de Lambda.

dotnet new -i Amazon.Lambda.Templates
dotnet tool install -g Amazon.Lambda.Tools

Hay muchas opciones que esto instala; Puedes enumerarlos todos con:

dotnet new --list

Esta herramienta es bastante agradable, ya que viene con muchas plantillas empaquetadas preconfiguradas para diferentes casos de uso. Por lo general, querrá una función por proyecto para mantener pequeños los tamaños de compilación, pero puede tener varias funciones en una DLL si usa las plantillas sin servidor de AWS, que se implementan con plantillas de CloudFormation. Estos son mucho más complicados de administrar, así que utilícelos solo si se está beneficiando de ellos.

Sin embargo, con los archivos de solución de .NET, puede tener varios proyectos en paralelo que hacen referencia a ensamblajes comunes, por lo que esto no es un gran problema.

Por ahora, usaremos la plantilla de función vacía simple, que genera un proyecto usando .NET 6. Puede crear esto desde la línea de comando o desde la pantalla de nuevo proyecto de su editor.

dotnet new lambda.EmptyFunction --name SimpleLambdaFunction --profile default --region us-east-1

Esto genera una función muy simple: toma una cadena como entrada y también se le pasa un ILambdaContext. Este es el Main() función de punto de entrada para su Lambda y el tiempo de ejecución la llamará cada vez que se invoque la función Lambda. Esta función particular devuelve un stringpero también puedes hacerlo async y devolver un Task<string?>.

En la parte superior, verá un atributo de ensamblaje que configura un serializador JSON. Internamente, Lambda se encargará de deserializar el contenido de entrada por usted y luego llamará a su función. Posteriormente, si devuelve algo, se escribirá en el flujo de respuesta. Las bibliotecas Lambda manejan este modelo por usted, y el código que envuelve su función está en HandlerWrapper.

Esencialmente, manejará todo tipo de firmas de métodos, y si su función toma una entrada, la deserializará por usted. Si su función devuelve una salida, serializará esa salida por usted. En realidad, no tiene que hacer nada de esto, ya que puede escribir funciones que operan en bruto Stream clases, pero esta es una buena clase contenedora para facilitar las cosas.

Lo que esto significa es que puede definir libremente sus propios modelos para las entradas y salidas que se pasan a la función y desde ella, una de las ventajas de manejar JSON con C#.

En esta función, deserializa el InputModel clase, espera asincrónicamente por un segundo y luego devuelve un OutputModel clase. Esta clase se vuelve a serializar en el flujo de salida para que Lambda pueda manejarla.

Ejecución de funciones de Lambda

Ejecutar la función una vez que la haya creado es bastante simple, ya que Lambda .NET CLI proporciona un método para implementarla. Simplemente ejecuta deploy-function con

dotnet lambda deploy-function SimpleNETFunction

Deberá seleccionar un rol de IAM o crear uno nuevo, y es posible que deba agregar permisos a este nuevo rol. Ahora debería ver la función en su consola:

Lambda proporciona un probador integrado al que puede pasar JSON.

Esto se ejecutará y le mostrará todos los detalles sobre la ejecución. En este caso, con una función mínima muy pequeña, el tiempo de inicio en frío fue inferior a 500 ms, lo cual es bastante decente para .NET y para Lambda en general. Una vez que está caliente, la duración facturada se reduce a solo unos pocos milisegundos.

En este caso, esta función no usó mucha memoria y reducir la función a 128 MB no causó ningún problema.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad