Proyecto .NET 5: Implementación con Docker

proyecto .Net 5

Implementación de un proyecto .NET 5 existente con Docker en AWS Lambda

En este artículo, demostraremos cómo implementar un proyecto .Net 5 existente en AWS Lambda como imagen de contenedor.

Con AWS Lambda, carga su código y lo ejecuta sin pensar en los servidores. Muchos clientes disfrutan de la forma en que funciona, pero si ha invertido en herramientas de contenedores para sus flujos de trabajo de desarrollo, no es fácil utilizar el mismo enfoque para crear aplicaciones con Lambda.

Para ayudarlo con eso, ahora puede empaquetar e implementar funciones de Lambda como imágenes de contenedor de hasta 10 GB de tamaño. De esta manera, también puede crear e implementar fácilmente cargas de trabajo más grandes que dependen de dependencias considerables, como aprendizaje automático o cargas de trabajo intensivas en datos.


Dependencias

Instalar ventana acoplable

Docker es una plataforma abierta para desarrollar, enviar y ejecutar aplicaciones. Docker le permite separar sus aplicaciones de su infraestructura para que pueda entregar software rápidamente. Con Docker, puede administrar su infraestructura de la misma manera que administra sus aplicaciones. Al aprovechar las metodologías de Docker para enviar, probar e implementar el código rápidamente, puede reducir significativamente la demora entre escribir el código y ejecutarlo en producción.

Instale el complemento de AWS Visual Studio

AWS Toolkit for Visual Studio es una extensión para Microsoft Visual Studio que se ejecuta en Microsoft Windows que facilita a los desarrolladores el desarrollo, la depuración y la implementación de aplicaciones mediante Amazon Web Services, lo que le permite comenzar más rápido y ser más productivo.

Instalar Amazon.Lambda.Tools

Para poder implementar el proyecto en AWS, necesitamos instalar Amazon.Lambda.Tools usando el siguiente comando:

dotnet tool install -g Amazon.Lambda.Tools

Si la herramienta ya está instalada, asegúrese de actualizar a la última versión con el siguiente comando:

actualización de la herramienta dotnet -g Amazon.Lambda.Tools

Archivos para agregar

Agregue los siguientes archivos a la carpeta raíz de su proyecto.

Dockerfile

Un archivo de plantilla para definir sus funciones sin servidor y otros recursos de AWS mediante el modelo de aplicación sin servidor de AWS CloudFormation.

FROM public.ecr.aws/lambda/dotnet:5.0 AS base
WORKDIR /var/task

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["TimeProject.csproj", "."]
RUN dotnet restore "./TimeProject.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "TimeProject.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "TimeProject.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /var/task
COPY --from=publish /app/publish .
CMD [ "TimeProject::TimeProject.LambdaEntryPoint::FunctionHandlerAsync"]

plantilla.sinservidor

Un archivo de plantilla para definir sus funciones sin servidor y otros recursos de AWS mediante el modelo de aplicación sin servidor de AWS CloudFormation.

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Description": "An AWS Serverless Application that uses the ASP.NET Core framework running in Amazon Lambda.",
  "Parameters": {},
  "Conditions": {},
  "Resources": {
    "AspNetCoreFunction": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
        "PackageType": "Image",
        "ImageConfig": {
          "EntryPoint": [
            "/lambda-entrypoint.sh"
          ],
          "Command": [
            "TimeProject::TimeProject.LambdaEntryPoint::FunctionHandlerAsync"
          ]
        },
        "ImageUri": "",
        "MemorySize": 256,
        "Timeout": 30,
        "Role": null,
        "Policies": [
          "AWSLambda_FullAccess"
        ],
        "Events": {
          "ProxyResource": {
            "Type": "Api",
            "Properties": {
              "Path": "/{proxy+}",
              "Method": "ANY"
            }
          },
          "RootResource": {
            "Type": "Api",
            "Properties": {
              "Path": "/",
              "Method": "ANY"
            }
          }
        }
      },
      "Metadata": {
        "Dockerfile": "Dockerfile",
        "DockerContext": ".",
        "DockerTag": ""
      }
    }
  },
  "Outputs": {
    "ApiURL": {
      "Description": "API endpoint URL for Prod environment",
      "Value": {
        "Fn::Sub": "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"
      }
    }
  }
}

aws-lambda-herramientas-defaults.json

Este archivo proporciona valores predeterminados para el asistente de implementación dentro de Visual Studio y los comandos de AWS Lambda agregados a la CLI de .NET Core.

{
  "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": "default",
  "region": "eu-west-1",
  "configuration": "Release",
  "s3-prefix": "TimeProject/",
  "template": "serverless.template",
  "template-parameters": "",
  "docker-host-build-output-dir": "./bin/Release/net5.0/linux-x64/publish",
  "image-command": "TimeProject::TimeProject.LambdaEntryPoint::FunctionHandlerAsync",
  "s3-bucket": "timeproject-api-deploy",
  "stack-name": "timeproject-api-deploy"
}

LambdaEntryPoint.cs

Clase que deriva de Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction. El código de este archivo arranca el marco de alojamiento de ASP.NET Core.

namespace TimeProject
{
    /// <summary>
    /// This class extends from APIGatewayProxyFunction which contains the method FunctionHandlerAsync which is the 
    /// actual Lambda function entry point. The Lambda handler field should be set to
    /// 
    /// TimeProject::TimeProject.LambdaEntryPoint::FunctionHandlerAsync
    /// </summary>
    public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
    {
        /// <summary>
        /// The builder has configuration, logging and Amazon API Gateway already configured. The startup class
        /// needs to be configured in this method using the UseStartup<>() method.
        /// </summary>
        /// <param name="builder"></param>
        protected override void Init(IWebHostBuilder builder)
        {
            builder
               .UseStartup<Startup>();
        }

        protected override void Init(IHostBuilder builder)
        {

        }
    }
}

Antes y después de…

proyecto .Net 5

Finalmente cambiemos el tipo de proyecto

Podemos hacerlo simplemente agregando la siguiente línea de código dentro de la etiqueta PropertyGroup en su archivo de proyecto .csproj.

<AWSProjectType>Lambda</AWSProjectType>

Publicar proyecto

Para implementar, haga clic con el botón derecho en el proyecto y seleccione Publicar en AWS Lambda.

proyecto .Net 5

Complete el nombre del depósito y el nombre de la pila si aún no lo ha hecho.

proyecto .Net 5

Si todo salió bien, eventualmente debería ver una ventana emergente de línea de comando que indica que la imagen de su ventana acoplable se está enviando a AWS.

proyecto .Net 5

Resultados.


Conclusión

En este artículo, hemos demostrado cómo implementar un proyecto .Net 5 existente en AWS Lambda. Los siguientes recursos pueden ser útiles, si desea obtener más información sobre la ventana acoplable de AWS Lambda y comprender más sobre el tema aquí.

¡Feliz hackeo! 🙂

Recent Post