Guía para desarrolladores de Azure Functions

En Azure Functions, determinadas funciones comparten algunos componentes y conceptos técnicos básicos, independientemente del idioma o el enlace que use. Antes de ir a detalles de aprendizaje específicos de un idioma o un enlace determinados, asegúrese de leer al completo esta información general que se aplica a todos ellos.

En este artículo se supone que ya ha leído la Información general sobre Azure Functions.

Código de función

Una función es el concepto principal en las funciones de Azure. Una función contiene dos elementos importantes: el código, que se puede escribir en diversos lenguajes, y la configuración, el archivo function.json. Con los lenguajes compilados, este archivo de configuración se genera automáticamente a partir de las anotaciones del código. Para los lenguajes de scripting, debe proporcionar el archivo de configuración.

El archivo function.json define el desencadenador de la función, los enlaces y otras opciones de configuración. Cada función tiene un solo desencadenador. Este archivo de configuración se usa en tiempo de ejecución para determinar los eventos que se supervisarán y cómo pasar datos y devolverlos al ejecutarse una función. El siguiente es un ejemplo de archivo function.json.

{
    "disabled":false,
    "bindings":[
        // ... bindings here
        {
            "type": "bindingType",
            "direction": "in",
            "name": "myParamName",
            // ... more depending on binding
        }
    ]
}

Para más información, consulte Conceptos básicos sobre los enlaces y desencadenadores de Azure Functions.

La propiedad bindings es donde configura los enlaces y los desencadenadores. Cada enlace comparte unos ajustes de configuración comunes y algunos parámetros que son específicos de un determinado tipo de enlace. Cada enlace requiere la siguiente configuración:

Propiedad Valores Tipo Comentarios
type Nombre del enlace.

Por ejemplo, queueTrigger.
string
direction in, out string Indica si el enlace está disponible para recibir datos en la función o enviar datos de la función.
name Identificador de función.

Por ejemplo, myQueue.
string El nombre que se usa para los datos enlazados en la función. En C# es un nombre de argumento; en JavaScript es la clave en una lista de clave-valor.

Aplicación de función

La aplicación de función proporciona un contexto de ejecución en Azure donde ejecutar las funciones. Como tal, es la unidad de implementación y administración de las funciones. Una aplicación de función se compone de una o varias funciones individuales que se administran, implementan y escalan conjuntamente. Todas las funciones de una aplicación de función comparten el mismo plan de precios, el mismo método de implementación y la misma versión en tiempo de ejecución. Una aplicación de función es como una forma de organizar y administrar las funciones de manera colectiva. Para obtener más información, vea Administración de una Function App en Azure Portal.

Nota

Todas las funciones de una aplicación de función deben crearse en el mismo lenguaje. En versiones anteriores del tiempo de ejecución de Azure Functions, esto no era necesario.

Estructura de carpetas

El código de todas las funciones de una aplicación de funciones está ubicado en una carpeta de proyecto raíz que contiene un archivo de configuración de host. El archivo host.json contiene configuraciones específicas del entorno de ejecución y está en la carpeta raíz de la aplicación de funciones. Un carpeta bin contiene paquetes y otros archivos de biblioteca que requiere la aplicación de funciones. Las estructuras de carpeta específicas necesarias para la aplicación de funciones dependen del lenguaje:

Tanto en la versión 2.x como en las superiores del runtime de Functions, todas las funciones de la aplicación de función deben compartir la misma pila de lenguaje.

La estructura de carpetas anterior es la predeterminada (y recomendada) para una aplicación de función. Si desea cambiar la ubicación del archivo de código de una función, modifique la sección scriptFile del archivo function.json. Asimismo, para implementar el proyecto en la aplicación de función en Azure, se recomienda usar la implementación de paquetes. También puede usar herramientas existentes como la integración e implementación continuas y Azure DevOps.

Nota

Si implementa un paquete manualmente, asegúrese de implementar el archivo host.json y las carpetas de la función directamente en la carpeta wwwroot. No incluya la carpeta wwwroot en sus implementaciones. De lo contrario, acabará con carpetas wwwroot\wwwroot.

Uso de herramientas locales y publicación

Las aplicaciones de función pueden crearse y publicarse con diversas herramientas, incluidas Visual Studio, Visual Studio Code, IntelliJ, Eclipse y Azure Functions Core Tools. Para más información, consulte Codificación y comprobación de las funciones de Azure Functions en un entorno local.

Edición de funciones en Azure Portal

El editor de funciones integrado en Azure Portal le permite actualizar el código y el archivo function.json directamente. Esto solo se recomienda para pequeños cambios o pruebas de concepto: el procedimiento recomendado es usar una herramienta de desarrollo local como VS Code.

Ejecución en paralelo

Cuando se producen varios eventos de desencadenado más rápido de lo que un tiempo de ejecución de función de un solo subproceso pueda procesarlos, el tiempo de ejecución puede invocar la función varias veces en paralelo. Si una aplicación de función usa el plan de hospedaje de consumo, esta aplicación podría escalarse horizontalmente de forma automática. Cada instancia de la aplicación de función, tanto si la aplicación se ejecuta en el plan de hospedaje de consumo como en el plan de hospedaje de App Service normal, puede procesar invocaciones de función simultáneas en paralelo mediante varios subprocesos. El número máximo de invocaciones de función simultáneas en cada instancia de aplicación de función varía según el tipo de desencadenador usado y lo recursos empleados por otras funciones dentro de la aplicación de función.

Versiones del entorno en tiempo de ejecución de Functions

Puede configurar la versión del entorno en tiempo de ejecución de Functions mediante la configuración de la aplicación FUNCTIONS_EXTENSION_VERSION. Por ejemplo, el valor "~3" indica que la aplicación de funciones utilizará 3.x como versión principal. Las aplicaciones de funciones se actualizan a las nuevas versiones secundarias a medida que se lanzan. Para más información y saber cómo ver la versión exacta de la aplicación de función, consulte Cómo seleccionar un destino para versiones en tiempo de ejecución de Azure Functions.

Repositorios

El código de Azure Functions es código abierto y está almacenado en repositorios de GitHub:

Enlaces

Esta es una tabla de todos los enlaces admitidos.

En esta tabla se muestran los enlaces que son compatibles con las versiones principales del entorno en tiempo de ejecución de Azure Functions:

Tipo 1.x 2.x y posteriores1 Desencadenador Entrada Output
Blob Storage
Azure Cosmos DB
Dapr3
Event Grid
Event Hubs
HTTP y webhooks
IoT Hub
Kafka2
Mobile Apps
Centros de notificaciones
Queue Storage
RabbitMQ2
SendGrid
Service Bus
SignalR
Table storage
Temporizador
Twilio

1 A partir del entorno en tiempo de ejecución de la versión 2.x, se deben registrar todos los enlaces, excepto HTTP y el temporizador. Consulte Registro de extensiones de enlace.

2 Los desencadenadores no se admiten en el plan de consumo. Requiere desencadenadores controlados por el runtime.

3 Solo se admite en Kubernetes, IoT Edge y otros modos autohospedados.

¿Tiene algún problema con errores procedentes de los enlaces? Revise la documentación de los códigos de error de los enlaces de Azure Functions.

Conexiones

El proyecto de función hace referencia a la información de conexión por nombre de su proveedor de configuración. No acepta directamente los detalles de conexión, lo que permite que se modifiquen en todos los entornos. Por ejemplo, una definición de desencadenador podría incluir una propiedad connection. Esta podría hacer referencia a una cadena de conexión, pero no puede establecer la cadena de conexión directamente en un objeto function.json. En su lugar, debe establecer connection en el nombre de una variable de entorno que contenga la cadena de conexión.

El proveedor de configuración predeterminado utiliza variables de entorno. Estas podrían establecerse mediante la Configuración de la aplicación cuando se ejecutan en el servicio Azure Functions, o desde el archivo de configuración local cuando el desarrollo se realiza localmente.

Valores de conexión

Cuando el nombre de la conexión se resuelve en un solo valor exacto, el tiempo de ejecución identifica el valor como una cadena de conexión, que normalmente incluye un secreto. Los detalles de una cadena de conexión se definen mediante el servicio al que quiere conectarse.

Sin embargo, un nombre de conexión también puede hacer referencia a una colección de varios elementos de configuración, útil para configurar las conexiones basadas en identidades. Las variables de entorno se pueden tratar como una colección mediante un prefijo compartido que termina en doble carácter de subrayado __. A continuación, se puede hacer referencia al grupo. Para ello, establezca el nombre de la conexión en este prefijo.

Por ejemplo, la propiedad connection de una definición de desencadenador de blob de Azure podría ser "Storage1". Siempre que no haya ningún valor de cadena único configurado por una variable de entorno denominada "Storage1", se podría usar una variable de entorno denominada Storage1__blobServiceUri para informar a la propiedad blobServiceUri de la conexión. Las propiedades de conexión son diferentes para cada servicio. Consulte la documentación del componente que utiliza la conexión.

Configuración de una conexión basada en identidades

Algunas conexiones de Azure Functions pueden estar configuradas para usar una identidad en lugar de un secreto. La compatibilidad depende de la extensión que utiliza la conexión. En algunos casos, es posible que aún se necesite una cadena de conexión en Functions aunque el servicio al que se está conectando admita conexiones basadas en identidades. Para obtener un tutorial sobre cómo configurar las aplicaciones de funciones con identidades administradas, consulte el tutorial Creación de una aplicación de funciones con conexiones basadas en identidades.

Las conexiones basadas en identidades son compatibles con los siguientes componentes:

Origen de la conexión Planes admitidos Más información
Desencadenadores y enlaces de blobs de Azure Todo Versión 5.0.0 o posterior de la extensión
Desencadenadores y enlaces de colas de Azure Todo Versión 5.0.0 o posterior de la extensión
Desencadenadores y enlaces de Azure Event Hubs Todo Versión 5.0.0 o posterior de la extensión
Desencadenadores y enlaces de Azure Service Bus Todo Versión 5.0.0 o posterior de la extensión
Enlaces y desencadenadores de Azure Cosmos DB: versión preliminar Elastic Premium Versión de extensión 4.0.0-preview1 o posterior
Almacenamiento necesario para el host ("AzureWebJobsStorage"): versión preliminar All Conexión al almacenamiento de host con una identidad

Nota

Las conexiones basadas en identidades no se admiten con Durable Functions.

Cuando se hospeda en el servicio de Azure Functions, las conexiones basadas en identidades usan una identidad administrada. La identidad asignada por el sistema se usa de manera predeterminada, aunque se puede especificar una identidad asignada por el usuario con las propiedades credential y clientID. Cuando se ejecuta en otros contextos, como el de desarrollo local, se usa en su lugar la identidad del desarrollador, aunque se puede personalizar. Consulte Desarrollo local con conexiones basadas en identidades.

Concesión de permiso a la identidad

Cualquier identidad que se utilice debe tener permisos para realizar las acciones previstas. Deberá asignar un rol en Azure RBAC mediante roles integrados o personalizados que proporcionen esos permisos.

Importante

Es posible que el servicio de destino muestre algunos permisos que no son necesarios para todos los contextos. Siempre que sea posible, respete el principio de privilegios mínimos y conceda solo los privilegios necesarios a la identidad. Por ejemplo, si la aplicación solo necesita poder leer desde un origen de datos, use un rol que solo tenga permiso de lectura. Sería inadecuado asignar un rol que también permita escribir en ese servicio, ya que sería un permiso excesivo para una operación de lectura. De forma similar, le interesa asegurarse de que la asignación de roles esté limitada solo a los recursos que se deben leer.

Elija una de las pestaña a continuación para obtener información sobre los permisos de cada componente:

Deberá crear una asignación de roles que proporcione acceso al contenedor de blobs en tiempo de ejecución. Los roles de administración, como propietario no son suficientes. En la tabla siguiente se muestran los roles integrados que se recomiendan al usar la extensión Blob Storage en funcionamiento normal. Puede que la aplicación precise permisos adicionales en función del código que escriba.

Tipo de enlace Roles integrados de ejemplo
Desencadenador [Propietario de datos de Storage Blob]1
Enlace de entrada Lector de datos de blobs de almacenamiento
Enlace de salida Propietario de datos de blobs de almacenamiento

1 En algunas configuraciones, un desencadenador de blobs puede requerir además el rol de colaborador de datos de la cola de Storage Blob.

Propiedades comunes para conexiones basadas en identidades

Una conexión basada en identidades para un servicio de Azure acepta las siguientes propiedades comunes, en las que <CONNECTION_NAME_PREFIX> es el valor de la propiedad connection en la definición de desencadenador o enlace:

Propiedad Plantilla de variable de entorno Descripción
Credencial de token <CONNECTION_NAME_PREFIX>__credential Define cómo se debe obtener un token para la conexión. Solo se recomienda cuando se especifica una identidad asignada por el usuario, cuando se debe establecer en "managedidentity". Esto solo es válido cuando se hospeda en el servicio Azure Functions.
Id. de cliente <CONNECTION_NAME_PREFIX>__clientId Cuando credential se establece en "managedidentity", esta propiedad especifica la identidad asignada por el usuario que se usará al obtener un token. La propiedad acepta un identificador de cliente correspondiente a una identidad asignada por el usuario asignada a la aplicación. Si no se especifica, se usará la identidad asignada por el sistema. Esta propiedad se usa de forma diferente en escenarios de desarrollo locales, en los que no se debe establecer el elemento credential.

Es posible que se admitan opciones adicionales para un tipo de conexión determinado. Consulte la documentación del componente que realiza la conexión.

Desarrollo local con conexiones basadas en identidades

Nota

El desarrollo local con conexiones basadas en identidades requiere versiones actualizadas de Azure Functions Core Tools. Puede comprobar qué versión tiene instalada actualmente mediante el comando func -v. Para Functions v3, use la versión 3.0.3904 o posterior. Para Functions v4, use la versión 4.0.3904 o posterior.

Cuando se ejecuta localmente, la configuración anterior indica al tiempo de ejecución que use la identidad del desarrollador local. La conexión intentará obtener un token de las siguientes ubicaciones, en orden:

  • Una caché local compartida entre las aplicaciones de Microsoft
  • El contexto del usuario actual en Visual Studio
  • El contexto del usuario actual en Visual Studio Code
  • El contexto del usuario actual en la CLI de Azure

Si ninguna de estas opciones produce un resultado satisfactorio, se producirá un error.

Dado que usa la identidad del desarrollador, es posible que ya tenga algunos roles en los recursos de desarrollo, pero es posible que no proporcionen acceso a los datos. Los roles de administración, como Propietario, no son suficientes. Compruebe los permisos necesarios para las conexiones de cada componente y asegúrese de que se le han asignado.

En algunos casos, puede especificar el uso de una identidad diferente. Puede agregar propiedades de configuración para la conexión que apunten a la identidad alternativa en función de un identificador de cliente y un secreto de cliente para una entidad de servicio de Azure Active Directory. No se admite esta opción de configuración cuando se hospedan en el servicio Azure Functions. Para usar un identificador y un secreto en el equipo local, defina la conexión con las siguientes propiedades adicionales:

Propiedad Plantilla de variable de entorno Descripción
Id. de inquilino <CONNECTION_NAME_PREFIX>__tenantId Id. de inquilino (directorio) de Azure Active Directory.
Id. de cliente <CONNECTION_NAME_PREFIX>__clientId Id. de cliente (aplicación) de un registro de aplicación en el inquilino.
Secreto del cliente <CONNECTION_NAME_PREFIX>__clientSecret Secreto de cliente generado para el registro de la aplicación.

Ejemplo de las propiedades local.settings.json requeridas para la conexión basada en identidades a blobs de Azure:

{
  "IsEncrypted": false,
  "Values": {
    "<CONNECTION_NAME_PREFIX>__blobServiceUri": "<blobServiceUri>",
    "<CONNECTION_NAME_PREFIX>__queueServiceUri": "<queueServiceUri>",
    "<CONNECTION_NAME_PREFIX>__tenantId": "<tenantId>",
    "<CONNECTION_NAME_PREFIX>__clientId": "<clientId>",
    "<CONNECTION_NAME_PREFIX>__clientSecret": "<clientSecret>"
  }
}

Conexión al almacenamiento de host con una identidad (versión preliminar)

De forma predeterminada, Azure Functions usa la conexión "AzureWebJobsStorage" para comportamientos básicos, como la coordinación de la ejecución de singleton de los desencadenadores de temporizador y el almacenamiento de claves de aplicación predeterminado. También puede configurarse para aprovechar una identidad.

Precaución

Otros componentes de Functions dependen de "AzureWebJobsStorage" para los comportamientos predeterminados. No debe moverlo a una conexión basada en identidades si usa versiones anteriores de extensiones que no admiten este tipo de conexión, incluidos desencadenadores y enlaces para blobs de Azure y Event Hubs. De forma similar, AzureWebJobsStorage se usa para los artefactos de implementación cuando se usa la compilación del lado servidor en Consumo para Linux y, si se habilita, deberá implementar a través de un paquete de implementación externo.

Además, algunas aplicaciones reutilizan "AzureWebJobsStorage" para las conexiones de almacenamiento en sus desencadenadores, enlaces o código de función. Asegúrese de que todos los usos de "AzureWebJobsStorage" pueden utilizar el formato de conexión basado en identidades antes de cambiar esta conexión de una cadena de conexión.

Para usar una conexión basada en identidades para "AzureWebJobsStorage", configure las siguientes opciones de la aplicación:

Configuración Descripción Valor de ejemplo
AzureWebJobsStorage__blobServiceUri El identificador URI del plano de datos del servicio de blobs de la cuenta de almacenamiento, con el esquema HTTPS. https://<nombre_de_la_cuenta_de_almacenamiento>.blob.core.windows.net
AzureWebJobsStorage__queueServiceUri El identificador URI del plano de datos del servicio de cola de la cuenta de almacenamiento, con el esquema HTTPS. https://<nombre_de_la_cuenta_de_almacenamiento>.queue.core.windows.net

También se pueden establecer Propiedades comunes para conexiones basadas en identidades.

Si se usa una cuenta de almacenamiento que utiliza el nombre del servicio y el sufijo DNS predeterminado para Azure global, con el formato https://<accountName>.blob/queue/file/table.core.windows.net, puede, en cambio, establecer AzureWebJobsStorage__accountName en el nombre de la cuenta de almacenamiento. Los puntos de conexión de blobs y colas se deducirán para esta cuenta. Esto no funcionará si la cuenta de almacenamiento está en una nube soberana o tiene un DNS personalizado.

Configuración Descripción Valor de ejemplo
AzureWebJobsStorage__accountName Nombre de una cuenta de almacenamiento, válido solo si la cuenta no está en una nube soberana y no tiene un DNS personalizado. <nombre_de_la_cuenta_de_almacenamiento>

Deberá crear una asignación de roles que proporcione acceso a la cuenta de almacenamiento para "AzureWebJobsStorage" en entorno de ejecución. Los roles de administración, como Propietario, no son suficientes. El rol de Propietario de datos de blobs de almacenamiento cubre las necesidades básicas del almacenamiento de host de Functions: el entorno de ejecución necesita acceso de lectura y escritura a blobs y la capacidad de crear contenedores. Existen algunas situaciones, como con el uso del desencadenador de blobs, en las que el Colaborador de datos de la cola de Storage también puede ser necesario. Puede que necesite permisos adicionales si usa "AzureWebJobsStorage" para cualquier otro fin.

Problemas de informes

Elemento Descripción Vínculo
Tiempo de ejecución Host de script, desencadenadores y enlaces, compatibilidad con idiomas Registre un problema
Plantillas Problemas de código con la plantilla de creación Registre un problema
Portal Interfaz de usuario o problema de la experiencia Registre un problema

Pasos siguientes

Para obtener más información, consulte los siguientes recursos: