Hay tres formas de crear una imagen de contenedor para una función de Lambda en .NET:
-
Uso de una imagen base de AWS para .NET
Las imágenes base de AWS vienen precargadas con un tiempo de ejecución de lenguaje, un cliente de interfaz de tiempo de ejecución para administrar la interacción entre Lambda y el código de la función y un emulador de interfaz de tiempo de ejecución para realizar pruebas a nivel local.
-
Uso de una imagen base exclusiva del sistema operativo de AWS
Las imágenes base exclusivas del sistema operativo de AWS
contienen una distribución de Amazon Linux y el emulador de interfaz de tiempo de ejecución . Por lo general, estas imágenes se utilizan para crear imágenes contenedoras para lenguajes compilados, como Go y Rust, y para un lenguaje o versión de un lenguaje para los que Lambda no proporciona una imagen base, como Node.js 19. También puede usar imágenes base exclusivas del sistema operativo para implementar un tiempo de ejecución personalizado. Para que la imagen sea compatible con Lambda, debe incluir el cliente de interfaz de tiempo de ejecución para .NET en la imagen. -
Uso de una imagen base que no sea de AWS
Puede utilizar una imagen base alternativa de otro registro de contenedores, como Alpine Linux o Debian. También puede utilizar una imagen personalizada creada por su organización. Para que la imagen sea compatible con Lambda, debe incluir el cliente de interfaz de tiempo de ejecución para .NET en la imagen.
sugerencia
Para reducir el tiempo que tardan las funciones de contenedor de Lambda en activarse, consulte Uso de compilaciones de varias fases
En esta página, se explica cómo compilar, probar e implementar imágenes de contenedor para Lambda.
Temas
AWS imágenes base para .NET
AWS proporciona las siguientes imágenes base para .NET:
Etiquetas | Tiempo de ejecución | Sistema operativo | Dockerfile | Obsolescencia |
---|---|---|---|---|
9 |
.NET 9 | Amazon Linux 2023 | Dockerfile para .NET 9 en GitHub |
No programado |
8 |
.NET 8 | Amazon Linux 2023 | Dockerfile para .NET 8 en GitHub |
10 de noviembre de 2026 |
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
(versión mínima 25.0.0) -
El complemento buildx
de Docker.
Creación e implementación de una imagen con una imagen base
En los siguientes pasos, utilizará Amazon.Lambda.Templates
-
Instale el paquete NuGet de Amazon.Lambda.Templates
. dotnet new install Amazon.Lambda.Templates
-
Cree un proyecto de .NET con la plantilla
lambda.image.EmptyFunction
.dotnet new lambda.image.EmptyFunction --name
MyFunction
--regionus-east-1
-
Vaya al directorio
. Aquí es donde se almacenan los archivos del proyecto. Examine los siguientes archivos:MyFunction
/src/MyFunction
-
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 atributoLambdaSerializer
predeterminado. Para obtener más información acerca de las opciones y los requisitos de serialización, consulte Serialización en C# 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.
-
-
Examine el Dockerfile en el directorio
src/
. 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:MyFunction
-
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 conimage-command
enaws-lambda-tools-defaults.json
.
Tenga en cuenta que el Dockerfile de ejemplo no incluye una instrucción USER
. Al implementar una imagen de contenedor en Lambda, Lambda define automáticamente un usuario predeterminado de Linux con permisos de privilegio mínimo. Esto es diferente del comportamiento estándar de Docker, que utiliza de forma predeterminada el usuario root
cuando no se proporciona ninguna instrucciónUSER
.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
" ] -
-
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
-
Cambie el directorio a
si aún no se encuentra allí.MyFunction
/src/MyFunction
cd src/
MyFunction
-
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-rolelambda-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. -
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 -
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
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
(versión mínima 25.0.0) -
El complemento buildx
de Docker.
Creación e implementación de una imagen con una imagen base alternativa
-
Instale el paquete NuGet de Amazon.Lambda.Templates
. dotnet new install Amazon.Lambda.Templates
-
Cree un proyecto de .NET con la plantilla
lambda.CustomRuntimeFunction
. Esta plantilla incluye el paquete Amazon.Lambda.RuntimeSupport. dotnet new lambda.CustomRuntimeFunction --name
MyFunction
--regionus-east-1
-
Vaya al directorio
. Aquí es donde se almacenan los archivos del proyecto. Examine los siguientes archivos:MyFunction
/src/MyFunction
-
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 bibliotecaAmazon.Lambda.RuntimeSupport
como el arranque. El métodoMain
es el punto de entrada para el proceso de la función. El métodoMain
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 clasesen 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.
-
-
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"
} -
-
Cree un Dockerfile en el directorio
. El siguiente Dockerfile de ejemplo usa una imagen base de .NET para Microsoft en lugar de una imagen base de AWS.MyFunction
/src/MyFunction
-
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 bibliotecaAmazon.Lambda.RuntimeSupport
.
Tenga en cuenta que el Dockerfile de ejemplo no incluye una instrucción USER
. Al implementar una imagen de contenedor en Lambda, Lambda define automáticamente un usuario predeterminado de Linux con permisos de privilegio mínimo. Esto es diferente del comportamiento estándar de Docker, que utiliza de forma predeterminada el usuario root
cuando no se proporciona ninguna instrucciónUSER
.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
"] -
-
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
-
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-rolelambda-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. -
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 -
Elimine la función de Lambda.
dotnet lambda delete-function
MyFunction