Introducción a .NET con funciones de AWS Lambda
AWS Lambda Functions es un modelo informático sin servidor que le permite ejecutar código sin servidores. Por lo general, están escritos en lenguajes como JavaScript y Python, pero AWS ahora admite muchos tiempos de ejecución diferentes, incluidos. NET para C#.
Por que usar. NET para Lambda?
Ahora hay muchos idiomas diferentes disponibles para Lambda, por lo que tiene muchas opciones. Por lo general, JavaScript y Python se usan para funciones de automatización simples que se encargan de ponerse en marcha rápidamente. Pero no son los de mayor rendimiento para el procesamiento pesado, y los lenguajes de secuencias de comandos de escritura dinámica son un serio inconveniente para las aplicaciones complejas.
Si prefiere el lenguaje C#, usarlo para Lambda no tiene demasiadas desventajas, especialmente si cambiar a Python o JavaScript es demasiado tedioso. Las herramientas proporcionadas por AWS también son buenas y tiene acceso a todo el SDK de AWS, lo que significa que puede buscar fácilmente servicios como Lambda y DynamoDB.
Además, AWS admite todo el tiempo de ejecución. NET, lo que significa que puede usar otros lenguajes además de C# que también se compilan en binarios. RED. C# es el más popular, pero también puede escribir funciones lambda en F# o VB.NET .
¿Cómo funciona?
Los lenguajes como Java y C# tienden a ser mucho más agradables, pero su uso tiene sus desventajas. Ambos se compilan en un código de bytes que debe compilarse al inicio, por lo que tienen más tiempo de inicio, especialmente en el inicio en frío. Un «inicio en frío» es cuando AWS no ha ejecutado una función en los últimos minutos, por lo que no se almacenará en caché y deberá compilarse justo a tiempo nuevamente para ejecutarla. 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 paralelismo dedicado . Tiempo de respuesta típico para. NET es muy grande y el rendimiento está a la par con lenguajes completamente compilados como Go y Rust.
Si actualmente usa funciones de Java para Lambda, C# podría ser un reemplazo viable, ya que es un tiempo de ejecución moderno. NET 6 utiliza menos memoria y, en la mayoría de los casos, se inicia más rápido que JVM.
Configuración de funciones lambda de C#
Primero, necesitarás uno instalado. RED. Soportes de AWS. NET Core 3.1 y. NET 6, por lo que cualquiera de estos dos tiempos de ejecución funcionará, pero lo más importante es que necesitará dotnet
la CLI instalada para poder instalar las plantillas de Lambda. puedes conseguir NET del Portal de documentación de Microsoft .
Deberá instalar plantillas Lambda y herramientas Lambda globales.
dotnet new -i Amazon.Lambda.Templates
dotnet tool install -g Amazon.Lambda.Tools
Esto configura muchas opciones; Puedes enumerarlos todos con:
dotnet new --list
Esta herramienta es bastante útil ya que viene con muchas plantillas empaquetadas preconfiguradas para diferentes casos de uso. Por lo general, necesitará una función por proyecto para mantener pequeños los tamaños de compilación, pero puede tener varias funciones en una sola DLL si usa plantillas sin servidor de AWS que se implementan con plantillas de CloudFormation. Son mucho más difíciles de manejar, así que úsalos solo si te benefician.
Sin embargo, con archivos de solución. NET, puede tener varios proyectos paralelos que hagan referencia a ensamblajes compartidos, por lo que no es gran cosa.
Por ahora, usaremos una plantilla simple de «Función vacía» que crea un proyecto usando. NET 6. Puedes crearlo desde la línea de comandos o desde la pantalla de nuevo proyecto de tu 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 pasa ILambdaContext
. Esta Main()
es la función de punto de entrada para su Lambda y el tiempo de ejecución la llamará cada vez que se llame a la función Lambda. Esta función en particular regresa string
, pero también puede hacer esto async
y regresar Task<string?>
.
En la parte superior, verá un atributo de ensamblado que configura el serializador JSON. Internamente, Lambda 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 de Lambda manejan este patrón por usted, y el código que envuelve su función está en el archivo HandlerWrapper
.
Básicamente, manejará todo tipo de firmas de métodos, y si su función acepta entradas, deserializará esas entradas por usted. Si su función devuelve una salida, serializará esa salida por usted. Realmente no necesita hacer nada de esto, ya que puede escribir funciones que operan en Stream
clases sin formato, pero es una buena clase contenedora para facilitar las cosas.
Esto significa que puede definir libremente sus propios modelos para las entradas y salidas que se pasan a la función y desde ella, lo cual es uno de los buenos beneficios del procesamiento JSON con C#.
En esta función, deserializa InputModel
la clase, espera asincrónicamente por un segundo y luego devuelve OutputModel
la clase. Esta clase se vuelve a serializar en el flujo de salida para que Lambda pueda procesarla.
Ejecutando funciones lambda
Ejecutar una función después de haberla creado es bastante fácil gracias a la interfaz de línea de comandos de Lambda. NET proporciona un método para implementarlo. solo corre 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 la 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 arranque en frío fue inferior a 500 ms, lo cual es bastante decente. NET y para Lambda en general. Tan pronto como se calienta, la duración pagada se reduce a unos pocos milisegundos.
En este caso, la función no usó mucha memoria y reducir la función a 128 MB no causó ningún problema.
Deja una respuesta