Uso de contenedores y Azure Functions

En este artículo se muestra la compatibilidad que Azure Functions proporciona para trabajar con aplicaciones de funciones en contenedores que se ejecutan en un entorno de Azure Container Apps. La compatibilidad con el hospedaje de contenedores de aplicaciones de funciones en Container Apps se encuentra actualmente en versión preliminar. Para más información, vea Hospedaje de Azure Functions en Azure Container Apps.

En este artículo se muestra la compatibilidad que Azure Functions proporciona para trabajar con aplicaciones de funciones que se ejecutan en contenedores de Linux.

Elija el entorno de hospedaje de la aplicación de funciones contenedorizada en la parte superior del artículo.

Si quiere empezar directamente, en el siguiente artículo se muestra cómo crear la primera función que se ejecuta en un contenedor de Linux e implementar la imagen desde un registro de contenedor en un servicio de hospedaje de Azure compatible:

Creación de aplicaciones de funciones contenedorizadas

Functions facilita la implementación y ejecución de las aplicaciones de funciones como los contenedores de Linux que cree y mantenga. Functions mantiene un conjunto de imágenes base específicas del lenguaje que puede usar para crear las aplicaciones de funciones en contenedor.

Importante

Al crear contenedores propios, tendrá que mantener actualizada la imagen base del contenedor con la imagen base compatible más reciente. Las imágenes base admitidas para Azure Functions son específicas del lenguaje y se encuentran en los repositorios de imágenes base de Azure Functions.

El equipo de Functions se compromete a publicar actualizaciones mensuales de estas imágenes base. Las actualizaciones regulares incluyen las actualizaciones de versión secundaria y las correcciones de seguridad más recientes tanto del entorno de ejecución de Functions como de los lenguajes. Debería actualizar periódicamente el contenedor desde la imagen base más reciente y volver a implementar desde la versión actualizada del contenedor.

Para obtener un ejemplo completo de cómo crear la aplicación de funciones local en contenedor mediante la línea de comandos y publicar la imagen en un registro de contenedor, consulte Creación de una aplicación de funciones en un contenedor local.

Creación del archivo Dockerfile

Las herramientas de Functions proporcionan una opción de Docker que genera un archivo Dockerfile con el proyecto de código de Functions. Puede usar este archivo con Docker para crear las funciones en un contenedor que derive de la imagen base correcta (idioma y versión).

La forma de crear un archivo Dockerfile depende de cómo cree el proyecto.

  • Al crear un proyecto de Functions con Azure Functions Core Tools, incluya la opción --docker al ejecutar el comando func init, como en el ejemplo siguiente:

    func init --docker
    
  • También puede agregar un archivo Dockerfile a un proyecto existente mediante la --docker-only opción al ejecutar el func init comando en una carpeta de proyecto existente, como en el ejemplo siguiente:

    func init --docker-only
    

Para obtener un ejemplo completo, consulte Creación de una aplicación de funciones en un contenedor local.

Creación de la aplicación de funciones en un contenedor

Con un archivo Dockerfile que haya generado mediante Core Tools en el proyecto de código, puede usar Docker para crear la aplicación de funciones en contenedor en el equipo local. El comando docker build siguiente crea una imagen de las funciones en contenedor desde el proyecto en el directorio local:

docker build --tag <DOCKER_ID>/<IMAGE_NAME>:v1.0.0 .

Para obtener un ejemplo de cómo crear el contenedor, consulte Compilación de la imagen de contenedor y comprobación local.

Actualización de una imagen en el registro

Al realizar cambios en el proyecto de código de funciones o si necesita actualizar a la última imagen de base, debe recompilar el contenedor localmente y volver a publicar la imagen actualizada en el registro de contenedor elegido. El comando siguiente recompila la imagen desde la carpeta raíz con un número de versión actualizado y la inserta en el registro:

az acr build --registry <REGISTRY_NAME> --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.1 .

Reemplace <REGISTRY_NAME> por la instancia de Container Registry y <LOGIN_SERVER> por el nombre del servidor de inicio de sesión.

En este momento, debe actualizar la implementación para usar la nueva imagen. En el ejemplo siguiente se actualiza la aplicación de funciones para usar la nueva imagen:

az functionapp config container set --image <IMAGE_NAME> --registry-password <SECURE_PASSWORD>--registry-username <USER_NAME> --name <APP_NAME> --resource-group <RESOURCE_GROUP>

En este ejemplo, <IMAGE_NAME> es el nombre completo de la nueva imagen con versión. Para los registros privados es necesario que proporcione un nombre de usuario y una contraseña. Almacene estas credenciales de forma segura.

También debe considerar la posibilidad de habilitar la implementación continua.

Creación de Azure Portal mediante contenedores

Al crear una aplicación de funciones en Azure Portal, puede optar por implementar la aplicación de funciones desde una imagen en un registro de contenedor. Para obtener información sobre cómo crear una aplicación de funciones de contenedor en un registro de contenedor, consulte Creación de la aplicación de funciones en un contenedor.

En los pasos siguientes se crea e implementa una aplicación de funciones en contenedor existente desde un registro de contenedor.

  1. En el menú o la página Inicio de Azure Portal, seleccione Crear un recurso.

  2. En la página Nuevo, seleccione Compute>Function App.

  3. En la página Básico, utilice la configuración de la aplicación de funciones como se especifica en la tabla siguiente:

    Configuración Valor sugerido Descripción
    Suscripción Su suscripción Esta es la suscripción en la que creará la nueva aplicación de funciones.
    Grupo de recursos myResourceGroup Nombre del nuevo grupo de recursos en el que creará la aplicación de funciones. Debe crear un grupo de recursos, ya que existen limitaciones conocidas a la hora de crear nuevas aplicaciones de funciones en un grupo de recursos existente.
    Nombre de la aplicación de función Nombre único* Nombre que identifica la nueva Function App. Los caracteres válidos son a-z (no distingue mayúsculas de minúsculas), 0-9 y -.
    ¿Desea implementar código o imágenes de contenedor? Imagen de contenedor Implemente una aplicación de funciones en contenedor desde un registro. Para crear una aplicación de funciones en el Registro, consulte Creación de una aplicación de funciones en un contenedor local.
    Región Región preferida Seleccione una región próxima a usted o a otros servicios a los que accedan las funciones.

*El nombre de aplicación debe ser único globalmente entre todas las aplicaciones hospedadas de Azure Functions.

  1. En Opciones y planes de hospedaje, elija Functions Premium.

    Screenshot of the Basics tab in the Azure portal when creating a function app for hosting a container in a Functions Premium plan.

    Esta opción crea una aplicación de funciones hospedada por Azure Functions en el plan Premium, que admite el escalado dinámico. También puede ejecutar la opción en un plan de App Service, pero recuerde que en este tipo de plan dedicado debe administrar el escalado de la aplicación de funciones.

*El nombre de la aplicación debe ser único en el entorno de Azure Container Apps. No todas las regiones se admiten en la versión preliminar. Para obtener más información, consulte Consideraciones para el hospedaje de aplicaciones contenedoras.

  1. En Opciones y planes de hospedaje, elija Plan de entorno de Azure Container Apps.

    Portal create Basics tab for a containerized function app hosted in Azure Container Apps.

    Esta opción crea un nuevo recurso del entorno de Azure Container Apps para hospedar el contenedor de la aplicación de funciones. Para más información, vea Hospedaje de Azure Functions en Azure Container Apps.

    De forma predeterminada, el entorno se crea en un plan de consumo sin redundancia de zona, para minimizar los costos. También puede elegir un entorno de Container Apps existente. Para más información sobre los entornos, consulte Entornos de Azure Container Apps.

  1. Acepte las opciones predeterminadas para crear una nueva cuenta de almacenamiento en la pestaña Almacenamiento y una nueva instancia de Application Insights en la pestaña Supervisión. También puede optar por usar una cuenta de almacenamiento existente o una instancia de Application Insights.
  1. Seleccione la pestaña Implementación y anule la selección en Usar imagen de inicio rápido. Si no lo hace, la aplicación de funciones se implementará desde la imagen de base para el lenguaje de la aplicación de funciones.

  2. Elija el tipo de imagen, público o privado. Elija Privado si usa Azure Container Registry o algún otro registro privado. Proporcione el nombre de la imagen, incluido el prefijo del Registro. Si usa un registro privado, proporcione las credenciales de autenticación del Registro de imágenes.

  3. Seleccione Revisar y crear para revisar las selecciones de configuración de la aplicación.

  4. En la página Revisar y crear, revise la configuración y, a continuación, seleccione Crear para aprovisionar la aplicación de funciones e implementar la imagen de contenedor desde el registro.

  1. Seleccione Revisar y crear para revisar las selecciones de configuración de la aplicación.

  2. En la página Revisar y crear, revise la configuración y, a continuación, seleccione Crear para aprovisionar la aplicación de funciones mediante una imagen base predeterminada.

  3. Una vez creado el recurso de la aplicación de funciones, seleccione Ir al recurso y, en la página de la aplicación de funciones, seleccione Centro de implementación.

  4. En el Centro de implementación, puede conectar el registro de contenedor como origen de la imagen. También puede habilitar Acciones de GitHub o Azure Pipelines para una implementación continua más sólida de actualizaciones en el contenedor en el registro.

Uso de imágenes en Azure Functions

Cuando el contenedor de la aplicación de funciones se implementa desde un registro, Functions mantiene información sobre la imagen de origen. Use los comandos siguientes para obtener datos sobre la imagen o cambiar la imagen de implementación usada:

Perfiles de carga de trabajo de Container Apps

Los perfiles de carga de trabajo son características de Container Apps que permiten controlar mejor los recursos de implementación. Azure Functions en Azure Container Apps también admite perfiles de carga de trabajo. Para más información, consulte Perfiles de carga de trabajo en Azure Container Apps.

Puede crear y administrar perfiles de carga de trabajo mediante la CLI de Azure o en Azure Portal.

Los perfiles de carga de trabajo se habilitan al crear el entorno de la aplicación de contenedor. Para obtener un ejemplo, consulte Crear una aplicación de contenedor en un perfil.

Puede agregar, editar y eliminar perfiles en su entorno. Para obtener un ejemplo, vea Agregar perfiles.

Al crear una aplicación de funciones en contenedor en un entorno con perfiles de carga de trabajo habilitados, también debe especificar el perfil en el que se va a ejecutar. Para ello, use el parámetro --workload-profile-name del comando az functionapp create, como en este ejemplo:

az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime <LANGUAGE_STACK> --image <IMAGE_URI>  --workload-profile-name  PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

En el comando az functionapp create, el parámetro --environment especifica el entorno de Container Apps y el parámetro --image la imagen que se va a usar para la aplicación de funciones. En el ejemplo siguiente, reemplace <STORAGE_NAME> por el nombre que utilizó en la sección anterior para la cuenta de almacenamiento. Además, reemplace <APP_NAME> por un nombre único global adecuado para usted.

Además, reemplace <CPU_COUNT> por el número deseado de CPU virtuales, con un mínimo de 0,5 hasta el máximo permitido por el perfil. Para <MEMORY_SIZE>, elija una cantidad de memoria dedicada de 1 GB hasta el máximo permitido por el perfil.

Configuración de aplicación

Azure Functions permite trabajar con la configuración de la aplicación para aplicaciones de funciones contenedorizadas de la manera estándar. Para más información, vea Uso de la configuración de la aplicación.

Habilitar implementación continua en Azure

Importante

Actualmente no se admite la implementación basada en Webhook al ejecutar el contenedor en un plan Elastic Premium. Si necesita usar el método de implementación continua descrito en esta sección, implemente el contenedor en un plan de App Service. Cuando se ejecuta en un plan de Elastic Premium, debe reiniciar manualmente la aplicación cada vez que realice actualizaciones en el contenedor en el repositorio.

Puede habilitar Azure Functions para que actualice automáticamente la implementación de una imagen cada vez que actualice la imagen en el registro.

  1. Utilice el siguiente comando para habilitar la implementación continua y obtener la dirección URL del webhook:

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <APP_NAME> --resource-group AzureFunctionsContainers-rg
    

    El comando az functionapp deployment container config habilita la implementación continua y devuelve la dirección URL del webhook de implementación. Puede recuperar esta dirección URL en cualquier momento posterior mediante el comando az functionapp deployment container show-cd-url.

    Como antes, reemplace <APP_NAME> por el nombre de la aplicación de funciones.

  2. Copie la dirección URL del webhook de implementación en el portapapeles.

  3. Abra Docker Hub, inicie sesión y seleccione Repositorios en la barra de navegación. Busque y seleccione la imagen, seleccione la pestaña Webhooks, especifique un nombre de webhook, pegue la dirección URL en Dirección URL de webhook y, finalmente, seleccione Crear:

    Screenshot showing how to add the webhook in your Docker Hub window.

  4. Una vez establecido el webhook, Azure Functions volverá a implementar la imagen cada vez que la actualice en Docker Hub.

Habilitación de las conexiones SSH

SSH habilita la comunicación segura entre un contenedor y un cliente. Con SSH habilitado, puede conectarse al contenedor mediante las herramientas avanzadas de App Service (Kudu). Para facilitar la conexión al contenedor mediante SSH, Azure Functions proporciona una imagen base que ya tiene SSH habilitado. Solo necesita editar el archivo de Dockerfile y, después, recompilar y volver a implementar la imagen. Después, puede conectar el contenedor mediante Herramientas avanzadas (Kudu).

  1. En el Dockerfile, anexe la cadena -appservice a la imagen base en la instrucción FROM, como se muestra en el ejemplo siguiente:

    FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
    

    En este ejemplo se usa la versión habilitada para SSH de la imagen base Node.js versión 18. Visite los repositorios de imágenes base de Azure Functions para comprobar que usa la versión más reciente de la imagen base habilitada para SSH.

  2. Recompile la imagen mediante el comando docker build y sustituya <DOCKER_ID> por el identificador de cuenta de Docker Hub, como en el ejemplo siguiente.

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
  3. Inserte la imagen actualizada en Docker Hub, lo cual ahora debe tardar mucho menos tiempo que la primera vez ya que solo se cargarán los segmentos actualizados de la imagen.

    docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
    
  4. Azure Functions vuelve a implementar automáticamente la imagen en la aplicación de funciones. El proceso se realiza en menos de un minuto.

  5. En un explorador, abra https://<app_name>.scm.azurewebsites.net/ y reemplace <app_name> por su nombre único. Esta dirección URL es el punto de conexión de Herramientas avanzadas (KUDU) para el contenedor de la aplicación de funciones.

  6. Inicie sesión en su cuenta de Azure y, después, seleccione SSH para establecer una conexión con el contenedor. La conexión puede tardar unos minutos si Azure todavía está actualizando la imagen de contenedor.

  7. Una vez establecida la conexión con el contenedor, ejecute el comando top para ver los procesos que se están ejecutando actualmente.

    Screenshot that shows Linux top command running in an SSH session.

Pasos siguientes

En los artículos siguientes se proporciona más información sobre la implementación y administración de contenedores: