Implementar funciones de Lambda .NET con imágenes de contenedor - AWS Lambda

Implementar funciones de Lambda .NET con imágenes de contenedor

Hay tres formas de crear una imagen de contenedor para una función de Lambda en .NET:

sugerencia

Para reducir el tiempo que tardan las funciones de contenedor de Lambda en activarse, consulte Uso de compilaciones de varias fases en la documentación de Docker. Para compilar imágenes de contenedores eficientes, siga Prácticas recomendadas para escribir Dockerfiles.

En esta página, se explica cómo compilar, probar e implementar imágenes de contenedor para Lambda.

AWS imágenes base para .NET

AWS proporciona las siguientes imágenes base para .NET:

Etiquetas Tiempo de ejecución Sistema operativo Dockerfile Obsolescencia

8

.NET 8 Amazon Linux 2023 Dockerfile para .NET 8 en GitHub

6

.NET 6 Amazon Linux 2 Dockerfile para .NET 6 en GitHub

20 de diciembre de 2024

Repositorio de Amazon ECR: gallery.ecr.aws/lambda/dotnet

Uso de una imagen base de AWS para .NET

Requisitos previos

Para completar los pasos de esta sección, debe disponer de lo siguiente:

  • SDK de .NET: en los siguientes pasos se utiliza la imagen base de .NET 8. Asegúrese de que su versión de .NET coincida con la versión de la imagen base que especifique en su Dockerfile.

  • Docker

Creación e implementación de una imagen con una imagen base

En los siguientes pasos, utilizará Amazon.Lambda.Templates y Amazon.Lambda.Tools para crear un proyecto .NET. A continuación, creará una imagen de Docker, cargará la imagen a Amazon ECR y la implementará en una función de Lambda.

  1. Instale el paquete NuGet de Amazon.Lambda.Templates.

    dotnet new install Amazon.Lambda.Templates
  2. Cree un proyecto de .NET con la plantilla lambda.image.EmptyFunction.

    dotnet new lambda.image.EmptyFunction --name MyFunction --region us-east-1
  3. Vaya al directorio MyFunction/src/MyFunction. Aquí es donde se almacenan los archivos del proyecto. Examine los siguientes archivos:

    • aws-lambda-tools-defaults.json: en este archivo se especifican las opciones de la línea de comandos al implementar su función de Lambda.

    • 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 atributo LambdaSerializer 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. Puede utilizar el código proporcionado para realizar pruebas o sustituirlo por su propio código.

    • MyFunction.csproj: un archivo de proyecto de .NET que enumera los archivos y ensamblados que componen la aplicación.

    • Readme.md: este archivo contiene más información sobre la función de Lambda de muestra.

  4. Examine el Dockerfile en el directorio src/MyFunction. Puede usar el Dockerfile proporcionado para realizar pruebas o sustituirlo por el suyo propio. Si usa el suyo propio, asegúrese de que se cumpla lo siguiente:

    • Establezca la propiedad FROM en el URI de la imagen base. Su versión de .NET debe coincidir con la versión de la imagen base.

    • Establezca el argumento CMD para el controlador de la función de Lambda. Esto debe coincidir con image-command en aws-lambda-tools-defaults.json.

    ejemplo Dockerfile
    # You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM public.ecr.aws/lambda/dotnet:8 # Copy function code to Lambda-defined environment variable COPY publish/* ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "MyFunction::MyFunction.Function::FunctionHandler" ]
  5. Instale la herramienta global .NET de Amazon.Lambda.Tools.

    dotnet tool install -g Amazon.Lambda.Tools

    Si ya se ha instalado Amazon.Lambda.Tools, asegúrese de que posee la versión más reciente.

    dotnet tool update -g Amazon.Lambda.Tools
  6. Cambie el directorio a MyFunction/src/MyFunction si aún no se encuentra allí.

    cd src/MyFunction
  7. Utilice Amazon.Lambda.Tools para crear la imagen de Docker, subirla a un nuevo repositorio de Amazon ECR e implementar la función de Lambda.

    En --function-role, especifique el nombre del rol (no el nombre de recurso de Amazon (ARN)) del rol de ejecución de la función. Por ejemplo, lambda-role.

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Para obtener más información acerca de la herramienta global de .NET de Amazon.Lambda.Tools, consulte el repositorio Extensiones de AWS para la CLI de .NET en GitHub.

  8. Invoque la función.

    dotnet lambda invoke-function MyFunction --payload "Testing the function"

    Si todo es correcto, verá lo siguiente:

    Payload: "TESTING THE FUNCTION" 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
  9. Elimine la función de Lambda.

    dotnet lambda delete-function MyFunction

Uso de una imagen base alternativa con el cliente de interfaz de tiempo de ejecución

Si usa una imagen base exclusiva del sistema operativo o una imagen base alternativa, debe incluir el cliente de interfaz de tiempo de ejecución en su imagen. El cliente de interfaz de tiempo de ejecución extiende el Uso de la API de tiempo de ejecución de Lambda para tiempos de ejecución personalizados, que administra la interacción entre Lambda y el código de la función.

En el siguiente ejemplo, se muestra cómo crear una imagen de contenedor para .NET con una imagen base que no es de AWS y cómo agregar el paquete Amazon.Lambda.RuntimeSupport, que es el cliente de interfaz de tiempo de ejecución de Lambda para .NET. El Dockerfile de ejemplo utiliza la imagen base de .NET 8 para Microsoft.

Requisitos previos

Para completar los pasos de esta sección, debe disponer de lo siguiente:

  • SDK de.NET : en los siguientes pasos, se utiliza una imagen base de .NET 8. Asegúrese de que su versión de .NET coincida con la versión de la imagen base que especifique en su Dockerfile.

  • Docker

Creación e implementación de una imagen con una imagen base alternativa

  1. Instale el paquete NuGet de Amazon.Lambda.Templates.

    dotnet new install Amazon.Lambda.Templates
  2. Cree un proyecto de .NET con la plantilla lambda.CustomRuntimeFunction. Esta plantilla incluye el paquete Amazon.Lambda.RuntimeSupport.

    dotnet new lambda.CustomRuntimeFunction --name MyFunction --region us-east-1
  3. Vaya al directorio MyFunction/src/MyFunction. Aquí es donde se almacenan los archivos del proyecto. Examine los siguientes archivos:

    • aws-lambda-tools-defaults.json: en este archivo se especifican las opciones de la línea de comandos al implementar su función de Lambda.

    • Function.cs: el código contiene una clase con un método Main que inicializa la biblioteca Amazon.Lambda.RuntimeSupport como el arranque. El método Main es el punto de entrada para el proceso de la función. El método Main empaqueta el controlador de funciones en un contenedor con el que puede funcionar el arranque. Para obtener más información, consulte Uso de Amazon.Lambda.RuntimeSupport como biblioteca de clases en el repositorio de GitHub.

    • MyFunction.csproj: un archivo de proyecto de .NET que enumera los archivos y ensamblados que componen la aplicación.

    • Readme.md: este archivo contiene más información sobre la función de Lambda de muestra.

  4. Abra el archivo aws-lambda-tools-defaults.json y agregue las siguientes líneas:

    "package-type": "image", "docker-host-build-output-dir": "./bin/Release/lambda-publish"
    • package-type: define el paquete de despliegue como una imagen de contenedor.

    • docker-host-build-output-dir: establece el directorio de salida para el proceso de compilación.

    ejemplo aws-lambda-tools-defaults.json
    { "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", "dotnet lambda help", "All the command line options for the Lambda command can be specified in this file." ], "profile": "", "region": "us-east-1", "configuration": "Release", "function-runtime": "provided.al2023", "function-memory-size": 256, "function-timeout": 30, "function-handler": "bootstrap", "msbuild-parameters": "--self-contained true", "package-type": "image", "docker-host-build-output-dir": "./bin/Release/lambda-publish" }
  5. Cree un Dockerfile en el directorio MyFunction/src/MyFunction. El siguiente Dockerfile de ejemplo usa una imagen base de .NET para Microsoft en lugar de una imagen base de AWS.

    • Establezca la propiedad FROM como el identificador de la imagen base. Su versión de .NET debe coincidir con la versión de la imagen base.

    • Utilice el comando COPY para copiar la función en el directorio /var/task.

    • Configure ENTRYPOINT como el módulo que desea que el contenedor de Docker ejecute cuando se inicie. En este caso, el módulo es el arranque, que inicializa la biblioteca Amazon.Lambda.RuntimeSupport.

    ejemplo Dockerfile
    # You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM mcr.microsoft.com/dotnet/runtime:8.0 # Set the image's internal work directory WORKDIR /var/task # Copy function code to Lambda-defined environment variable COPY "bin/Release/net8.0/linux-x64" . # Set the entrypoint to the bootstrap ENTRYPOINT ["/usr/bin/dotnet", "exec", "/var/task/bootstrap.dll"]
  6. Instale la extensión de herramientas globales de .NET de Amazon.Lambda.Tools.

    dotnet tool install -g Amazon.Lambda.Tools

    Si ya se ha instalado Amazon.Lambda.Tools, asegúrese de que posee la versión más reciente.

    dotnet tool update -g Amazon.Lambda.Tools
  7. Utilice Amazon.Lambda.Tools para crear la imagen de Docker, subirla a un nuevo repositorio de Amazon ECR e implementar la función de Lambda.

    En --function-role, especifique el nombre del rol (no el nombre de recurso de Amazon (ARN)) del rol de ejecución de la función. Por ejemplo, lambda-role.

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Para obtener más información acerca de la extensión CLI de la herramienta global de .NET de Amazon Lambda, consulte el repositorio Extensiones de AWS para la CLI de .NET en GitHub.

  8. Invoque la función.

    dotnet lambda invoke-function MyFunction --payload "Testing the function"

    Si todo es correcto, verá lo siguiente:

    Payload: "TESTING THE FUNCTION" 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
  9. Elimine la función de Lambda.

    dotnet lambda delete-function MyFunction