Creación de la primera instancia de Azure Functions contenedorizada

En este artículo, creará una aplicación de funciones que se ejecuta en un contenedor de Linux y la implementará en Azure Functions.

La implementación del código de función en Azure Functions en un contenedor requiere un plan premium o el hospedaje de un plan dedicado (App Service). La realización de este artículo generará un pequeño coste en la cuenta de Azure, que puede minimizar con la limpieza de los recursos cuando haya acabado.

Otras opciones para implementar el contenedor de la aplicación de funciones en Azure son:

Elija el lenguaje de desarrollo

En primer lugar, usará herramientas de Azure Functions para crear el código del proyecto como una aplicación de funciones en un contenedor de Docker mediante una imagen base de Linux específica del lenguaje. Asegúrese de seleccionar el lenguaje que prefiere en la parte superior del artículo.

Core Tools genera automáticamente un Dockerfile para el proyecto que usa la versión más actualizada de la imagen base correcta para el lenguaje de funciones. Debe 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 más información, consulte Creación de aplicaciones de funciones en contenedor.

Prerrequisitos

Antes de comenzar, deberá asegurarse de que cumple con los siguientes requisitos:

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Para publicar la imagen de aplicación de funciones en contenedor que crea en un registro de contenedor, necesita un identificador de Docker y Docker en ejecución en el equipo local. Si no tiene un identificador de Docker, puede crear una cuenta de Docker.

También debe completar la sección Creación de un registro de contenedor del inicio rápido de Container Registry para crear una instancia del registro. Anote el nombre completo del servidor de inicio de sesión.

Creación y activación de un entorno virtual

En una carpeta adecuada, ejecute los comandos siguientes para crear y activar un entorno virtual denominado .venv. Asegúrese de usar una de las versiones de Python compatibles con Azure Functions.

python -m venv .venv
source .venv/bin/activate

Si Python no instaló el paquete venv en la distribución de Linux, ejecute el siguiente comando:

sudo apt-get install python3-venv

Ejecute todos los comandos siguientes en este entorno virtual activado.

Creación y prueba de un proyecto local de Functions

En un terminal o símbolo del sistema, ejecute el siguiente comando para el lenguaje elegido a fin de crear un proyecto de aplicación de funciones en la carpeta actual.

func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker

En una carpeta vacía, ejecute el comando siguiente para generar el proyecto de Functions desde un arquetipo Maven.

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker

El parámetro -DjavaVersion indica al entorno de ejecución de Functions qué versión de Java debe usar. Use -DjavaVersion=11 si quiere que las funciones se ejecuten en Java 11. Cuando no se especifica -DjavaVersion, el valor predeterminado de Maven es Java 8. Para obtener más información, consulte Versiones de Java.

Importante

Para llevar a cabo los pasos de este artículo, la variable de entorno JAVA_HOME se debe establecer en la ubicación de instalación de la versión correcta del JDK.

Maven le pide los valores necesarios para finalizar la generación del proyecto en la implementación. Siga las solicitudes y proporcione la siguiente información:

Prompt Valor Descripción
groupId com.fabrikam Un valor que identifica de forma única su proyecto entre todos los demás y que sigue las reglas de nomenclatura de paquetes de Java.
artifactId fabrikam-functions Un valor que es el nombre del archivo jar, sin un número de versión.
version 1.0-SNAPSHOT Seleccione el valor predeterminado.
package com.fabrikam.functions Un valor que es el paquete de Java para el código de función generado. Use el valor predeterminado.

Escriba Y o presione Entrar para confirmar.

Maven crea los archivos del proyecto en una carpeta nueva llamada artifactId que, en este ejemplo, es fabrikam-functions.

La opción --docker genera un Dockerfile para el proyecto, que define un contenedor adecuado para su uso con Azure Functions y el entorno de ejecución seleccionado.

Vaya a la carpeta del proyecto:

cd fabrikam-functions

Use el comando siguiente para agregar una función al proyecto mediante el comando siguiente, donde el argumento --name es el nombre único de la función y el argumento --template especifica el desencadenador de esta. func new crea un archivo de código de C# en el proyecto.

func new --name HttpExample --template "HTTP trigger" --authlevel anonymous

Use el comando siguiente para agregar una función al proyecto mediante el comando siguiente, donde el argumento --name es el nombre único de la función y el argumento --template especifica el desencadenador de esta. func new crea una subcarpeta que coincide con el nombre de función que contiene un archivo de configuración denominado function.json.

func new --name HttpExample --template "HTTP trigger" --authlevel anonymous

Para probar la función localmente, inicie el host en tiempo de ejecución de Azure Functions local en la carpeta raíz del proyecto:

func start  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

Cuando vea el punto de conexión HttpExample aparecer en la salida, vaya a ese punto de conexión. Debería ver un mensaje de bienvenida en la salida de la respuesta.

Cuando vea el punto de conexión HttpExample aparecer en la salida, vaya a http://localhost:7071/api/HttpExample?name=Functions. El explorador tiene que mostrar un mensaje "hello" que devuelve Functions, el valor proporcionado al parámetro de consulta name.

Presione Ctrl+C (Command+C en macOS) para detener el host.

Creación de la imagen de contenedor y verificación local

(Opcional) Examine el archivo Dockerfile en la carpeta raíz del proyecto. El archivo de Dockerfile describe el entorno necesario para ejecutar la aplicación de funciones en Linux. La lista completa de imágenes base admitidas para Azure Functions se puede encontrar en la página de imágenes base de Azure Functions.

En la carpeta raíz del proyecto, ejecute el comando docker build y especifique un nombre como azurefunctionsimage y una etiqueta como v1.0.0. Reemplace <DOCKER_ID> por el identificador de su cuenta de Docker Hub. Este comando compila la imagen de Docker del contenedor.

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

Cuando el comando se complete, podrá ejecutar el nuevo contenedor de forma local.

Para verificar la compilación, ejecute la imagen en un contenedor local con el comando docker run. Para ello, reemplace de nuevo <DOCKER_ID> por el identificador de la cuenta de Docker Hub y agregue el argumento de puertos como -p 8080:80:

docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0

Una vez que la imagen se inicie en el contenedor local, vaya a http://localhost:8080/api/HttpExample, donde tiene que aparecer el mismo mensaje de saludo que antes. Dado que la función desencadenada por HTTP que creó usa la autorización anónima, puede llamar a la función que se ejecuta en el contenedor sin tener que obtener una clave de acceso. Para más información, consulte Claves de autorización.

Una vez que la imagen se inicie en el contenedor local, vaya a http://localhost:8080/api/HttpExample?name=Functions, donde debe aparecer el mismo mensaje "hello" que antes. Dado que la función desencadenada por HTTP que creó usa la autorización anónima, puede llamar a la función que se ejecuta en el contenedor sin tener que obtener una clave de acceso. Para más información, consulte Claves de autorización.

Después de comprobar la aplicación de funciones en el contenedor, presione Ctrl+C (Command+C en macOS para detener la ejecución.

Publicación de la imagen de contenedor en un registro

Para que la imagen de contenedor esté disponible para la implementación en un entorno de hospedaje, debe insertarla en un registro de contenedor.

Azure Container Registry es un servicio de registro privado para compilar, almacenar y proporcionar imágenes de contenedor y artefactos relacionados. Debe usar un servicio de registro privado para publicar los contenedores en los servicios de Azure.

  1. Use el comando siguiente para iniciar sesión en la instancia del registro:

    az acr login --name <REGISTRY_NAME>
    

    En el comando anterior, reemplace <REGISTRY_NAME> por el nombre de la instancia de Container Registry.

  2. Use el comando siguiente para etiquetar la imagen con el nombre completo del servidor de inicio de sesión del registro:

    docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 
    

    Reemplace <LOGIN_SERVER> por el nombre completo del servidor de inicio de sesión del registro y <DOCKER_ID> por el identificador de Docker.

  3. Use el comando siguiente para insertar el contenedor en la instancia del registro:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    
  4. Use el comando siguiente a fin de habilitar la cuenta de administrador integrada para que Functions pueda conectarse al registro con un nombre de usuario y una contraseña:

    az acr update -n <REGISTRY_NAME> --admin-enabled true
    
  1. Use el comando siguiente para recuperar el nombre de usuario y la contraseña del administrador, que Functions necesita para conectarse al registro:

    az acr credential show -n <REGISTRY_NAME> --query "[username, passwords[0].value]" -o tsv
    

    Importante

    El nombre de usuario y la contraseña de la cuenta de administrador son credenciales importantes. Asegúrese de almacenarlos de forma segura y nunca en una ubicación accesible como un repositorio público.

Creación de recursos auxiliares de Azure para la función

Antes de poder implementar el contenedor en Azure, debe crear tres recursos:

  • Un grupo de recursos, que es un contenedor lógico de recursos relacionados.
  • Una cuenta de almacenamiento, que se usa para mantener el estado y otra información sobre sus funciones.
  • Una aplicación de funciones, que proporciona el entorno para ejecutar el código de función. Una aplicación de funciones se asigna al proyecto de funciones y le permite agrupar funciones como una unidad lógica para facilitar la administración, la implementación y el uso compartido de recursos.

Utilice los comandos siguientes para crear los elementos. Se admiten las CLI de Azure y de PowerShell. Para crear los recursos de Azure mediante Azure PowerShell, también necesita el módulo Az PowerShell, versión 5.9.0 o posterior.

  1. Si todavía no lo ha hecho, inicie sesión en Azure:

    az login
    

    El comando az login inicia sesión en su cuenta de Azure.

  2. Cree un grupo de recursos, denominado AzureFunctionsContainers-rg, en la región que haya elegido.

    az group create --name AzureFunctionsContainers-rg --location <REGION>
    

    El comando az group create crea un grupo de recursos. En el comando anterior, reemplace <REGION> por una región cercana mediante un código de región disponible devuelto por el comando az account list-locations.

  3. Cree una cuenta de almacenamiento de uso general en el grupo de recursos y la región.

    az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
    

    El comando az storage account create crea la cuenta de almacenamiento.

    En el ejemplo anterior, reemplace <STORAGE_NAME> por un nombre que sea apropiado para usted y único en Azure Storage. Los nombres deben contener entre 3 y 24 caracteres y solo letras minúsculas. El valor Standard_LRS especifica que se trata de una cuenta de uso general y que Functions admite su uso.

  4. Use el comando para crear un plan Premium para Azure Functions denominado myPremiumPlan en el plan de tarifa Premium elástico 1 (--sku EP1), en su <REGION>, y en un contenedor de Linux (--is-linux).

    az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location <REGION> --number-of-workers 1 --sku EP1 --is-linux
    

    Aquí se usa el plan Premium, que se puede escalar según sea necesario. Para más información sobre hospedaje, consulte Comparación de los planes de hospedaje de Azure Functions. Para más información sobre cómo calcular los costos, consulte la página de precios de Functions.

    El comando también crea una instancia asociada de Application Insights de Azure en el mismo grupo de recursos con la que puede supervisar la aplicación de funciones y ver registros. Para más información, consulte Supervisión de Azure Functions. La instancia no incurrirá en ningún costo hasta que se active.

Creación y configuración de una aplicación de funciones en Azure con la imagen

Una aplicación de funciones en Azure administra la ejecución de las funciones en el plan de hospedaje de Azure Functions. En esta sección, usará los recursos de Azure de la sección anterior para crear una aplicación de funciones a partir de una imagen en un registro de contenedor y configurarla con una cadena de conexión a Azure Storage.

  1. Cree una aplicación de función con el siguiente comando, en función del registro de contenedor:

    az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 
    

    En el ejemplo siguiente, reemplace <STORAGE_NAME> por el nombre que utilizó en la sección anterior para la cuenta de almacenamiento. Reemplace también <APP_NAME> por un nombre único global que sea adecuado y <DOCKER_ID> o <LOGIN_SERVER> por el identificador de cuenta de Docker Hub o servidor de Container Registry, respectivamente. Al implementar desde un registro de contenedor, el nombre de la imagen indica la dirección URL del registro.

    La primera vez que se crea la aplicación de funciones, se extrae la imagen inicial de Docker Hub. También puede habilitar la implementación continua en Azure desde el registro de contenedor.

    Sugerencia

    Puede usar el valor DisableColor del archivo host.json para evitar que se escriban caracteres de control ANSI en los registros de contenedor.

  2. Use el comando siguiente para obtener la cadena de conexión de la cuenta de almacenamiento que ha creado:

    az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv
    

    La cadena de conexión de la cuenta de almacenamiento se devuelve mediante el comando az storage account show-connection-string.

    Reemplace <STORAGE_NAME> por el nombre de la cuenta de almacenamiento que ha creado.

  3. Use el siguiente comando para agregar la configuración a la aplicación de funciones:

    az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<CONNECTION_STRING>
    

    El comando az functionapp config appsettings set crea la configuración.

    En este comando, reemplace <APP_NAME> por el nombre de la aplicación de funciones y <CONNECTION_STRING> por la cadena de conexión del paso anterior. La conexión debe ser una cadena codificada larga que comience por DefaultEndpointProtocol=.

  4. La función ahora puede usar esta cadena de conexión para acceder a la cuenta de almacenamiento.

Comprobación de las funciones en Azure

Con la imagen implementada en la aplicación de funciones en Azure, ya puede invocar la función mediante solicitudes HTTP.

  1. Ejecute el siguiente comando az functionapp function show para obtener la dirección URL de la nueva función:

    az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate 
    

    Reemplace <APP_NAME> por el nombre de la aplicación de función.

  1. Use la URL que acaba de obtener para llamar al punto de conexión de la función HttpExample, y anexe la cadena de consulta ?name=Functions.
  1. Use la dirección URL que acaba de obtener para llamar al punto de conexión de la función HttpExample.

Cuando vaya a esta dirección URL, el explorador tiene que mostrar una salida similar a cuando ejecutó la función localmente.

Limpieza de recursos

Si quiere seguir trabajando con Azure Functions y con los recursos que ha creado en este artículo, puede dejarlos todos activos. Como ha creado un plan Premium para Azure Functions, incurrirá en un pequeño costo continuo por día.

Para evitar estos costos, elimine el grupo de recursos AzureFunctionsContainers-rg para limpiar todos los recursos de ese grupo:

az group delete --name AzureFunctionsContainers-rg

Pasos siguientes