Aplicación web sin servidor en AzureServerless web application on Azure

Esta arquitectura de referencia muestra una aplicación web sin servidor.This reference architecture shows a serverless web application. La aplicación proporciona contenido estático desde Azure Blob Storage e implementa una API con Azure Functions.The application serves static content from Azure Blob Storage, and implements an API using Azure Functions. La API lee datos de Cosmos DB y devuelve los resultados a la aplicación web.The API reads data from Cosmos DB and returns the results to the web app.

Logotipo de github una implementación de referencia para esta arquitectura está disponible en GitHub.GitHub logo A reference implementation for this architecture is available on GitHub.

Arquitectura de referencia para una aplicación web sin servidor

El término sin servidor tiene dos significados diferentes pero relacionados:The term serverless has two distinct but related meanings:

  • Back-end como servicio (BaaS).Backend as a service (BaaS). Los servicios de back-end en la nube, como el almacenamiento y las bases de datos, proporcionan API que permiten que las aplicaciones cliente se conecten directamente a estos servicios.Backend cloud services, such as databases and storage, provide APIs that enable client applications to connect directly to these services.
  • Funciones como servicio (FaaS).Functions as a service (FaaS). En este modelo, una "función" es un fragmento de código que se implementa en la nube y se ejecuta en un entorno de hospedaje que abstrae completamente los servidores que ejecutan el código.In this model, a "function" is a piece of code that is deployed to the cloud and runs inside a hosting environment that completely abstracts the servers that run the code.

Ambas definiciones tienen en común la idea de que los desarrolladores y el personal de DevOps no necesitan implementar, configurar ni administrar servidores.Both definitions have in common the idea that developers and DevOps personnel don't need to deploy, configure, or manage servers. Esta arquitectura de referencia se centra en FaaS con Azure Functions, aunque la entrega de contenido web desde Azure Blob Storage es un ejemplo de BaaS.This reference architecture focuses on FaaS using Azure Functions, although serving web content from Azure Blob Storage is an example of BaaS. Algunas características importantes de FaaS son:Some important characteristics of FaaS are:

  1. La plataforma asigna dinámicamente los recursos de proceso según sea necesario.Compute resources are allocated dynamically as needed by the platform.
  2. Precios basados en el consumo: Se le cobrará solo por los recursos de proceso utilizados para ejecutar el código.Consumption-based pricing: You are charged only for the compute resources used to execute your code.
  3. Los recursos de proceso se escalan a petición en función del tráfico, sin necesidad de que el desarrollador realice ninguna configuración.The compute resources scale on demand based on traffic, without the developer needing to do any configuration.

Las funciones se ejecutan cuando se produce un desencadenador externo, como una solicitud HTTP o un mensaje que llega a una cola.Functions are executed when an external trigger occurs, such as an HTTP request or a message arriving on a queue. Esto hace que un estilo de arquitectura orientada a eventos sea natural en las arquitecturas sin servidor.This makes an event-driven architecture style natural for serverless architectures. Para coordinar el trabajo entre los componentes de la arquitectura, considere el uso de agentes de mensajes o patrones de publicación y suscripción.To coordinate work between components in the architecture, consider using message brokers or pub/sub patterns. Para obtener ayuda para elegir entre las tecnologías de mensajería de Azure, consulte elección entre los servicios de Azure que entregan mensajes.For help choosing between messaging technologies in Azure, see Choose between Azure services that deliver messages.

ArquitecturaArchitecture

La arquitectura consta de los siguientes componentes:The architecture consists of the following components:

Blob Storage.Blob Storage. El contenido Web estático, como archivos HTML, CSS y JavaScript, se almacenan en Azure Blob Storage y se proporcionan a los clientes mediante el hospedaje de sitios web estáticos.Static web content, such as HTML, CSS, and JavaScript files, are stored in Azure Blob Storage and served to clients by using static website hosting. Toda la interacción dinámica se produce mediante código JavaScript que hace llamadas a las API de back-end.All dynamic interaction happens through JavaScript code making calls to the backend APIs. No hay código en el servidor para representar la página web.There is no server-side code to render the web page. El hospedaje de sitios web estáticos admite la indexación de documentos y páginas de error 404 personalizadas.Static website hosting supports index documents and custom 404 error pages.

CDN.CDN. Use Azure Content Delivery Network (CDN) para almacenar en caché el contenido para una menor latencia y una entrega más rápida de contenido, así como para proporcionar un punto de conexión HTTPS.Use Azure Content Delivery Network (CDN) to cache content for lower latency and faster delivery of content, as well as providing an HTTPS endpoint.

Aplicaciones de función.Function Apps. Azure Functions es una opción de proceso sin servidor.Azure Functions is a serverless compute option. Utiliza un modelo orientado a eventos, en el que un desencadenador invoca un fragmento de código (una "función").It uses an event-driven model, where a piece of code (a "function") is invoked by a trigger. En esta arquitectura, la función se invoca cuando un cliente realiza una solicitud HTTP.In this architecture, the function is invoked when a client makes an HTTP request. La solicitud siempre se enruta mediante una puerta de enlace de API, como se describe a continuación.The request is always routed through an API gateway, described below.

API Management.API Management. API Management proporciona una puerta de enlace de API que se encuentra delante de la función http.API Management provides an API gateway that sits in front of the HTTP function. Puede usar API Management para publicar y administrar las API que usan las aplicaciones cliente.You can use API Management to publish and manage APIs used by client applications. El uso de una puerta de enlace ayuda a desacoplar la aplicación de front-end de las API de back-end.Using a gateway helps to decouple the front-end application from the back-end APIs. Por ejemplo, API Management puede reescribir las direcciones URL, transformar las solicitudes antes de alcanzar el back-end, establecer los encabezados de solicitud o respuesta y así sucesivamente.For example, API Management can rewrite URLs, transform requests before they reach the backend, set request or response headers, and so forth.

API Management también se puede utilizar para implementar cuestiones transversales, como:API Management can also be used to implement cross-cutting concerns such as:

  • Aplicación de cuotas de uso y límites de frecuenciaEnforcing usage quotas and rate limits
  • Validación de tokens de OAuth para la autenticaciónValidating OAuth tokens for authentication
  • Habilitación de solicitudes entre orígenes (CORS)Enabling cross-origin requests (CORS)
  • Almacenamiento en caché de las respuestasCaching responses
  • Supervisión y registro de solicitudesMonitoring and logging requests

Si no necesita toda la funcionalidad proporcionada por API Management, otra opción es usar los proxies de funciones.If you don't need all of the functionality provided by API Management, another option is to use Functions Proxies. Esta característica de Azure Functions le permite definir una única superficie de API para varias aplicaciones de función, mediante la creación de rutas a las funciones de back-end.This feature of Azure Functions lets you define a single API surface for multiple function apps, by creating routes to back-end functions. Functions Proxies también puede realizar transformaciones limitadas en la solicitud y la respuesta HTTP.Function proxies can also perform limited transformations on the HTTP request and response. Sin embargo, no proporciona las mismas funcionalidades enriquecidas basadas en directivas de API Management.However, they don't provide the same rich policy-based capabilities of API Management.

Cosmos DB.Cosmos DB. Cosmos dB es un servicio de base de datos con varios modelos.Cosmos DB is a multi-model database service. En este escenario, la aplicación de función recupera documentos de Cosmos DB en respuesta a solicitudes HTTP GET del cliente.For this scenario, the function application fetches documents from Cosmos DB in response to HTTP GET requests from the client.

Azure Active Directory (Azure AD).Azure Active Directory (Azure AD). Los usuarios inician sesión en la aplicación web con sus credenciales de Azure AD.Users sign into the web application by using their Azure AD credentials. Azure AD devuelve un token de acceso para la API que la aplicación web utiliza para autenticar las solicitudes de API (consulte Autenticación).Azure AD returns an access token for the API, which the web application uses to authenticate API requests (see Authentication).

Azure Monitor.Azure Monitor. El monitor recopila las métricas de rendimiento de los servicios de Azure implementados en la solución.Monitor collects performance metrics about the Azure services deployed in the solution. Puede visualizarlas en un panel para obtener visibilidad del mantenimiento de la solución.By visualizing these in a dashboard, you can get visibility into the health of the solution. También se recopilan los registros de aplicación.It also collected application logs.

Azure Pipelines.Azure Pipelines. Canalizaciones es un servicio de integración continua (CI) y entrega continua (CD) que compila, prueba e implementa la aplicación.Pipelines is a continuous integration (CI) and continuous delivery (CD) service that builds, tests, and deploys the application.

RecomendacionesRecommendations

Planes de Function AppFunction App plans

Azure Functions admite dos modelos de hospedaje.Azure Functions supports two hosting models. Con el plan de consumo, la potencia de proceso se asigna automáticamente cuando se ejecuta el código.With the consumption plan, compute power is automatically allocated when your code is running. Con el plan de App Service, se asigna un conjunto de máquinas virtuales para el código.With the App Service plan, a set of VMs are allocated for your code. El plan de App Service define el número de máquinas virtuales y el tamaño de máquina virtual.The App Service plan defines the number of VMs and the VM size.

Tenga en cuenta que el plan de App Service no es estrictamente sin servidor, según la definición proporcionada anteriormente.Note that the App Service plan is not strictly serverless, according to the definition given above. Sin embargo, el modelo de programación es el mismo y el mismo código de la función se puede ejecutar en un plan de consumo y en un plan de App Service.The programming model is the same, however — the same function code can run in both a consumption plan and an App Service plan.

Estos son algunos de los factores a tener en cuenta al elegir qué tipo de plan se va a usar:Here are some factors to consider when choosing which type of plan to use:

  • Arranque en frío.Cold start. Con el plan de consumo, una función que no se ha invocado recientemente requerirá cierta latencia adicional la próxima vez que se ejecute.With the consumption plan, a function that hasn't been invoked recently will incur some additional latency the next time it runs. Esta latencia adicional se debe a la asignación y preparación del entorno de tiempo de ejecución.This additional latency is due to allocating and preparing the runtime environment. Normalmente está en el orden de segundos, pero depende de varios factores, como el número de dependencias que se deban cargar.It is usually on the order of seconds but depends on several factors, including the number of dependencies that need to be loaded. Para obtener más información, consulte Descripción del inicio en frío sin servidor.For more information, see Understanding Serverless Cold Start. El arranque en frío es normalmente más una cuestión de cargas de trabajo interactivas (desencadenadores HTTP) que de cargas de trabajo controladas por mensajes asincrónicas (desencadenadores de colas o de Event Hubs), porque los usuarios observan directamente la latencia adicional.Cold start is usually more of a concern for interactive workloads (HTTP triggers) than asynchronous message-driven workloads (queue or event hubs triggers), because the additional latency is directly observed by users.
  • Período de tiempo de expiración.Timeout period. En el plan de consumo, una ejecución de función agota el tiempo de espera después de un período de tiempo configurable (hasta un máximo de 10 minutos)In the consumption plan, a function execution times out after a configurable period of time (to a maximum of 10 minutes)
  • Aislamiento de red virtual.Virtual network isolation. El uso de un plan de App Service permite que las funciones se ejecuten dentro de un App Service Environment, que es un entorno de hospedaje dedicado y aislado.Using an App Service plan allows functions to run inside of an App Service Environment, which is a dedicated and isolated hosting environment.
  • Modelo de precios.Pricing model. El plan de consumo se factura por el número de ejecuciones y el consumo de recursos (memoria y tiempo de ejecución).The consumption plan is billed by the number of executions and resource consumption (memory × execution time). El plan de App Service se factura por horas en función de la SKU de las instancias de máquina virtual.The App Service plan is billed hourly based on VM instance SKU. A menudo, el plan de consumo puede ser más económico que un plan de App Service, ya que solo se paga por los recursos de proceso utilizados.Often, the consumption plan can be cheaper than an App Service plan, because you pay only for the compute resources that you use. Esto es especialmente cierto si el tráfico sufre puntos máximos y mínimos.This is especially true if your traffic experiences peaks and troughs. Sin embargo, si una aplicación experimenta un rendimiento de alto volumen constante, un plan de App Service puede costar menos que el plan de consumo.However, if an application experiences constant high-volume throughput, an App Service plan may cost less than the consumption plan.
  • Escalado.Scaling. Una gran ventaja del modelo de consumo es que se escala dinámicamente según sea necesario, en función del tráfico entrante.A big advantage of the consumption model is that it scales dynamically as needed, based on the incoming traffic. Aunque este escalado sucede rápidamente, hay un período de inicialización.While this scaling occurs quickly, there is still a ramp-up period. Para algunas cargas de trabajo, puede aprovisionar en exceso deliberadamente las máquinas virtuales de manera que pueda controlar ráfagas de tráfico con un tiempo de inicialización igual a cero.For some workloads, you might want to deliberately overprovision the VMs, so that you can handle bursts of traffic with zero ramp-up time. En ese caso, considere la posibilidad de un plan de App Service.In that case, consider an App Service plan.

Límites de una aplicación de funciónFunction App boundaries

Una aplicación de función hospeda la ejecución de una o más funciones.A function app hosts the execution of one or more functions. Puede usar una aplicación de función para agrupar varias funciones como una unidad lógica.You can use a function app to group several functions together as a logical unit. Dentro de una aplicación de función, las funciones comparten la misma configuración de aplicación, plan de hospedaje y ciclo de vida de implementación.Within a function app, the functions share the same application settings, hosting plan, and deployment lifecycle. Cada aplicación de función tiene su propio nombre de host.Each function app has its own hostname.

Use aplicaciones de función para agrupar funciones que comparten el mismo ciclo de vida y configuración.Use function apps to group functions that share the same lifecycle and settings. Las funciones que no comparten el mismo ciclo de vida deben hospedarse en distintas aplicaciones de función.Functions that don't share the same lifecycle should be hosted in different function apps.

Considere la posibilidad de adoptar un enfoque de microservicios, en el que cada aplicación de función representa un microservicio, que posiblemente se compone de varias funciones relacionadas.Consider taking a microservices approach, where each function app represents one microservice, possibly consisting of several related functions. En una arquitectura de microservicios, los servicios deben tener un acoplamiento flexible y una alta cohesión funcional.In a microservices architecture, services should have loose coupling and high functional cohesion. Un acoplamiento flexible significa que puede cambiar un servicio sin necesidad de que los demás se actualicen al mismo tiempo.Loosely coupled means you can change one service without requiring other services to be updated at the same time. Cohesiva significa que un servicio tiene un propósito único y bien definido.Cohesive means a service has a single, well-defined purpose. Para más información sobre estas ideas, consulte Diseño de microservicios: Análisisde dominios.For more discussion of these ideas, see Designing microservices: Domain analysis.

Enlaces de funcionesFunction bindings

Use los enlaces de funciones siempre que sea posible.Use Functions bindings when possible. Los enlaces proporcionan una forma declarativa de conectar el código a los datos e integrar con otros servicios de Azure.Bindings provide a declarative way to connect your code to data and integrate with other Azure services. Un enlace de entrada rellena un parámetro de entrada a partir de un origen de datos externo.An input binding populates an input parameter from an external data source. Un enlace de salida envía el valor devuelto de la función a un receptor de datos, como una cola o una base de datos.An output binding sends the function's return value to a data sink, such as a queue or database.

Por ejemplo, la GetStatus función de la implementación de referencia utiliza el enlace de entradaCosmos dB.For example, the GetStatus function in the reference implementation uses the Cosmos DB input binding. Este enlace está configurado para buscar un documento en Cosmos DB mediante los parámetros de consulta que se toman de la cadena de consulta de la solicitud HTTP.This binding is configured to look up a document in Cosmos DB, using query parameters that are taken from the query string in the HTTP request. Si se encuentra el documento, se pasa a la función como un parámetro.If the document is found, it is passed to the function as a parameter.

[FunctionName("GetStatusFunction")]
public static Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    [CosmosDB(
        databaseName: "%COSMOSDB_DATABASE_NAME%",
        collectionName: "%COSMOSDB_DATABASE_COL%",
        ConnectionStringSetting = "COSMOSDB_CONNECTION_STRING",
        Id = "{Query.deviceId}",
        PartitionKey = "{Query.deviceId}")] dynamic deviceStatus,
    ILogger log)
{
    ...
}

Mediante el uso de enlaces, no es necesario escribir código que se comunique directamente con el servicio, lo que simplifica el código de la función y también abstrae los detalles del origen o el receptor de datos.By using bindings, you don't need to write code that talks directly to the service, which makes the function code simpler and also abstracts the details of the data source or sink. En algunos casos, sin embargo, puede que necesite una lógica más compleja que la que proporciona el enlace.In some cases, however, you may need more complex logic than the binding provides. En ese caso, use directamente los SDK de cliente de Azure.In that case, use the Azure client SDKs directly.

Consideraciones sobre escalabilidadScalability considerations

Funciones.Functions. Para el plan de consumo, el desencadenador HTTP se escala según el tráfico.For the consumption plan, the HTTP trigger scales based on the traffic. Hay un límite para el número de instancias simultáneas de la función, pero cada instancia puede procesar más de una solicitud a la vez.There is a limit to the number of concurrent function instances, but each instance can process more than one request at a time. Para un plan de App Service, el desencadenador HTTP se escala según el número de instancias de máquina virtual, que puede ser un valor fijo o se puede escalar automáticamente basándose en un conjunto de reglas de escalado automático.For an App Service plan, the HTTP trigger scales according to the number of VM instances, which can be a fixed value or can autoscale based on a set of autoscaling rules. Para obtener información, consulte Azure Functions escala y hospedaje.For information, see Azure Functions scale and hosting.

Cosmos DB.Cosmos DB. La capacidad de rendimiento de Cosmos DB se mide en unidades de solicitud (RU).Throughput capacity for Cosmos DB is measured in Request Units (RU). 1 RU corresponde al rendimiento necesario para una solicitud GET de un documento de 1 KB.A 1-RU throughput corresponds to the throughput need to GET a 1KB document. Con el fin de escalar un contenedor Cosmos DB pasado 10.000 RU, debe especificar una clave de partición al crear el contenedor e incluir la clave de partición en cada documento que cree.In order to scale a Cosmos DB container past 10,000 RU, you must specify a partition key when you create the container and include the partition key in every document that you create. Para obtener más información acerca de las claves de partición, consulte partición y escalado en Azure Cosmos dB.For more information about partition keys, see Partition and scale in Azure Cosmos DB.

API Management.API Management. API Management se puede escalar horizontalmente y admite el escalado automático basado en reglas.API Management can scale out and supports rule-based autoscaling. Tenga en cuenta que el proceso de escalado tarda al menos 20 minutos.Note that the scaling process takes at least 20 minutes. Si se trata de tráfico por ráfagas, se debe aprovisionar para la máxima ráfaga de tráfico esperada.If your traffic is bursty, you should provision for the maximum burst traffic that you expect. Sin embargo, el escalado automático es útil para controlar las variaciones horarias o diarias del tráfico.However, autoscaling is useful for handling hourly or daily variations in traffic. Para obtener más información, consulte escalado automático de una instancia de Azure API Management.For more information, see Automatically scale an Azure API Management instance.

Consideraciones acerca de la recuperación ante desastresDisaster recovery considerations

La implementación que se muestra aquí reside en una sola región de Azure.The deployment shown here resides in a single Azure region. Para un enfoque más resistente a la recuperación ante desastres, aproveche las ventajas de las características de distribución geográfica de los distintos servicios:For a more resilient approach to disaster-recovery, take advantage of the geo-distribution features in the various services:

  • API Management admite la implementación en varias regiones, lo que se puede utilizar distribuir una única instancia de API Management en cualquier número de regiones de Azure.API Management supports multi-region deployment, which can be used to distribute a single API Management instance across any number of Azure regions. Para más información, consulte Implementación de una instancia del servicio Azure API Management en varias regiones de Azure.For more information, see How to deploy an Azure API Management service instance to multiple Azure regions.

  • Use Traffic Manager para enrutar las solicitudes HTTP a la región primaria.Use Traffic Manager to route HTTP requests to the primary region. Si la aplicación de función que se ejecuta en dicha región no está disponible, Traffic Manager conmuta por error a la región secundaria.If the Function App running in that region becomes unavailable, Traffic Manager can fail over to a secondary region.

  • Cosmos DB admite varias regiones maestras, lo que permite escribir en cualquier región que se agregue a su cuenta de Cosmos dB.Cosmos DB supports multiple master regions, which enables writes to any region that you add to your Cosmos DB account. Si no habilita la funcionalidad de arquitectura multimaestro, todavía puede conmutar por error a la región de escritura principal.If you don't enable multi-master, you can still fail over the primary write region. Los SDK de cliente de Cosmos DB y los enlaces de la función de Azure controlan automáticamente la conmutación por error, por lo que no es necesario actualizar los parámetros de configuración de la aplicación.The Cosmos DB client SDKs and the Azure Function bindings automatically handle the failover, so you don't need to update any application configuration settings.

Consideraciones sobre la seguridadSecurity considerations

AuthenticationAuthentication

La API GetStatus de la implementación de referencia usa Azure AD para autenticar las solicitudes.The GetStatus API in the reference implementation uses Azure AD to authenticate requests. Azure AD admite el protocolo OpenID Connect, que es un protocolo de autenticación basado en el protocolo OAuth 2.Azure AD supports the OpenID Connect protocol, which is an authentication protocol built on top of the OAuth 2 protocol.

En esta arquitectura, la aplicación cliente es una aplicación de página única (SPA) que se ejecuta en el explorador.In this architecture, the client application is a single-page application (SPA) that runs in the browser. Este tipo de aplicación cliente no puede contener un secreto de cliente ni un código de autorización oculto, por lo que el flujo de concesión implícita es adecuado.This type of client application cannot keep a client secret or an authorization code hidden, so the implicit grant flow is appropriate. (Consulte ¿ qué flujo de OAuth 2,0 debo usar?).(See Which OAuth 2.0 flow should I use?). Este es el flujo general:Here's the overall flow:

  1. El usuario hace clic en el vínculo "Iniciar sesión" de la aplicación web.The user clicks the "Sign in" link in the web application.
  2. El explorador se redirige la página de inicio de sesión de Azure AD.The browser is redirected the Azure AD sign in page.
  3. El usuario inicia sesión.The user signs in.
  4. Azure AD redirige de vuelta a la aplicación cliente, incluyendo un token de acceso en el fragmento de dirección URL.Azure AD redirects back to the client application, including an access token in the URL fragment.
  5. Cuando la aplicación web llama a la API, incluye el token de acceso en el encabezado de autenticación.When the web application calls the API, it includes the access token in the Authentication header. El identificador de aplicación se envía como notificación de audiencia ("aud") en el token de acceso.The application ID is sent as the audience ('aud') claim in the access token.
  6. La API de back-end valida el token de acceso.The backend API validates the access token.

Para configurar la autenticación:To configure authentication:

  • Registre una aplicación en el inquilino de Azure AD.Register an application in your Azure AD tenant. Esto genera un identificador de aplicación, que el cliente incluye con la dirección URL de inicio de sesión.This generates an application ID, which the client includes with the login URL.

  • Habilite la autenticación de Azure AD en la aplicación de función.Enable Azure AD authentication inside the Function App. Para obtener más información, consulte Autenticación y autorización en Azure App Service.For more information, see Authentication and authorization in Azure App Service.

  • Agregue la Directiva Validate-JWT a API Management para autorizar previamente la solicitud mediante la validación del token de acceso.Add the validate-jwt policy to API Management to pre-authorize the request by validating the access token.

Para obtener más información, consulte el archivo Léame de github.For more details, see the GitHub readme.

Se recomienda crear registros de aplicaciones independientes de Azure AD para el cliente de aplicación y la API de back-end.It's recommended to create separate app registrations in Azure AD for the client application and the backend API. Conceda el permiso de aplicación cliente para llamar a la API.Grant the client application permission to call the API. Este enfoque le ofrece la posibilidad de definir varias API y clientes y de controlar los permisos de cada uno.This approach gives you the flexibility to define multiple APIs and clients and control the permissions for each.

Dentro de una API, use ámbitos para proporcionar a las aplicaciones un control más exhaustivo de los permisos que solicitan un usuario.Within an API, use scopes to give applications fine-grained control over what permissions they request from a user. Por ejemplo, puede que una API tenga los ámbitos Read y Write, y puede que una aplicación cliente determinada solicite al usuario que autorice solo permisos Read.For example, an API might have Read and Write scopes, and a particular client app might ask the user to authorize Read permissions only.

AutorizaciónAuthorization

En muchas aplicaciones, la API de back-end debe comprobar si un usuario tiene permiso para realizar una acción determinada.In many applications, the backend API must check whether a user has permission to perform a given action. Se recomienda usar la autorización basadaen notificaciones, donde el proveedor de identidades transmite información sobre el usuario (en este caso, Azure ad) y se usa para tomar decisiones de autorización.It's recommended to use claims-based authorization, where information about the user is conveyed by the identity provider (in this case, Azure AD) and used to make authorization decisions. Por ejemplo, al registrar una aplicación en Azure AD, puede definir un conjunto de roles de aplicación.For example, when you register an application in Azure AD, you can define a set of application roles. Cuando un usuario inicia sesión en la aplicación, Azure ad incluye roles una demanda para cada rol que se ha concedido al usuario, incluidos los roles que se heredan a través de la pertenencia a grupos.When a user signs into the application, Azure AD includes a roles claim for each role that the user has been granted, including roles that are inherited through group membership.

El token de identificador que Azure AD devuelve al cliente contiene algunas de las notificaciones del usuario.The ID token that Azure AD returns to the client contains some of the user's claims. Dentro de la aplicación de función, estas notificaciones están disponibles en el encabezado X-MS-CLIENT-PRINCIPAL de la solicitud.Within the function app, these claims are available in the X-MS-CLIENT-PRINCIPAL header of the request. Sin embargo, es más fácil leer esta información de los datos de enlace.However, it's simpler to read this information from binding data. Para otras notificaciones, utilice Microsoft Graph para consultar Azure ad.For other claims, use Microsoft Graph to query Azure AD. (El usuario debe dar su consentimiento a esta acción al iniciar sesión).(The user must consent to this action when signing in.)

Para obtener más información, vea trabajar con identidades de cliente.For more information, see Working with client identities.

CORSCORS

En esta arquitectura de referencia, la aplicación web y la API no comparten el mismo origen.In this reference architecture, the web application and the API do not share the same origin. Esto significa que, cuando la aplicación llama a la API, es una solicitud entre orígenes.That means when the application calls the API, it is a cross-origin request. La seguridad del explorador impide que una página web realice solicitudes AJAX a otro dominio.Browser security prevents a web page from making AJAX requests to another domain. Esta restricción se conoce como la directiva de mismo origen y evita que un sitio malintencionado lea información confidencial de otro sitio.This restriction is called the same-origin policy and prevents a malicious site from reading sensitive data from another site. Para habilitar una solicitud entre orígenes, agregue una Directiva de uso compartido de recursos entre orígenes (CORS) a la puerta de enlace de API Management:To enable a cross-origin request, add a Cross-Origin Resource Sharing (CORS) policy to the API Management gateway:

<cors allow-credentials="true">
    <allowed-origins>
        <origin>[Website URL]</origin>
    </allowed-origins>
    <allowed-methods>
        <method>GET</method>
    </allowed-methods>
    <allowed-headers>
        <header>*</header>
    </allowed-headers>
</cors>

En este ejemplo, el atributo allow-credentials es true.In this example, the allow-credentials attribute is true. Esto autoriza al explorador para el envío de las credenciales (incluidas las cookies) con la solicitud.This authorizes the browser to send credentials (including cookies) with the request. En caso contrario, el explorador no envía las credenciales con una solicitud entre orígenes de forma predeterminada.Otherwise, by default the browser does not send credentials with a cross-origin request.

Nota

Sea muy cuidadoso al establecer allow-credentials en true, ya que significa que un sitio web puede enviar las credenciales del usuario a la API en nombre del usuario, sin que el usuario sea consciente de ello.Be very careful about setting allow-credentials to true, because it means a website can send the user's credentials to your API on the user's behalf, without the user being aware. Debe confiar en el origen permitido.You must trust the allowed origin.

Exigir HTTPSEnforce HTTPS

Para mayor seguridad, puede requerir HTTPS en toda la canalización de la solicitud:For maximum security, require HTTPS throughout the request pipeline:

  • CDN.CDN. Azure CDN admite HTTPS en el subdominio *.azureedge.net de manera predeterminada.Azure CDN supports HTTPS on the *.azureedge.net subdomain by default. Para habilitar HTTPS en la red CDN para los nombres de dominio personalizado, consulte Tutorial: Configuración de HTTPS en un dominio personalizado de Azure CDN.To enable HTTPS in the CDN for custom domain names, see Tutorial: Configure HTTPS on an Azure CDN custom domain.

  • Hospedaje de sitios web estáticos.Static website hosting. Habilite la opción "serequiere transferencia segura" en la cuenta de almacenamiento.Enable the "Secure transfer required" option on the Storage account. Cuando esta opción está habilitada, la cuenta de almacenamiento solo permite solicitudes de conexiones HTTPS seguras.When this option is enabled, the storage account only allows requests from secure HTTPS connections.

  • API Management.API Management. Configure las API para que solo utilicen el protocolo HTTPS.Configure the APIs to use HTTPS protocol only. Puede configurar esto en Azure Portal o mediante una plantilla de Resource Manager:You can configure this in the Azure portal or through a Resource Manager template:

    {
        "apiVersion": "2018-01-01",
        "type": "apis",
        "name": "dronedeliveryapi",
        "dependsOn": [
            "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
        ],
        "properties": {
            "displayName": "Drone Delivery API",
            "description": "Drone Delivery API",
            "path": "api",
            "protocols": [ "HTTPS" ]
        },
        ...
    }
    
  • Azure Functions.Azure Functions. Habilite la opción "solo https".Enable the "HTTPS Only" setting.

Bloqueo de la aplicación de funciónLock down the function app

Todas las llamadas a la función deben pasar a través de la puerta de enlace de la API.All calls to the function should go through the API gateway. Para ello, haga lo siguiente:You can achieve this as follows:

  • Configure la aplicación de función para que requiera una clave de función.Configure the function app to require a function key. La puerta de enlace de API Management incluirá la clave de función cuando llame a la aplicación de función.The API Management gateway will include the function key when it calls the function app. Esto evita que los clientes llamen a la función directamente, omitiendo la puerta de enlace.This prevents clients from calling the function directly, bypassing the gateway.

  • La puerta de enlace de API Management tiene una dirección IP estática.The API Management gateway has a static IP address. Puede restringir la función de Azure para permitir solo las llamadas desde esa dirección IP estática.Restrict the Azure Function to allow only calls from that static IP address. Para más información, consulte Restricciones de IP estáticas de Azure App Service.For more information, see Azure App Service Static IP Restrictions. (Esta característica está disponible solo para los servicios de nivel Estándar).(This feature is available for Standard tier services only.)

Protección de los secretos de aplicaciónProtect application secrets

No almacene secretos de aplicación, como las credenciales de la base de datos, en el código ni en los archivos de configuración.Don't store application secrets, such as database credentials, in your code or configuration files. En su lugar, use la configuración de la aplicación, que se almacena cifrada en Azure.Instead, use App settings, which are stored encrypted in Azure. Para obtener más información, vea seguridad en Azure App Service y Azure Functions.For more information, see Security in Azure App Service and Azure Functions.

Como alternativa, puede almacenar los secretos de aplicación en Key Vault.Alternatively, you can store application secrets in Key Vault. Esto permite centralizar el almacenamiento de secretos, controlar su distribución y supervisar cómo y cuándo se accede a los secretos.This allows you to centralize the storage of secrets, control their distribution, and monitor how and when secrets are being accessed. Para obtener más información, consulte configuración de una aplicación Web de Azure para leer un secreto de Key Vault.For more information, see Configure an Azure web application to read a secret from Key Vault. Sin embargo, tenga en cuenta que los enlaces y desencadenadores de funciones cargan sus valores de configuración de la configuración de la aplicación.However, note that Functions triggers and bindings load their configuration settings from app settings. No hay ningún medio integrado para configurar los desencadenadores y los enlaces para que usen secretos de Key Vault.There is no built-in way to configure the triggers and bindings to use Key Vault secrets.

Consideraciones sobre DevOpsDevOps considerations

ImplementaciónDeployment

Para implementar la aplicación de función, se recomienda usar archivos de paquete ("ejecutar desde paquete").To deploy the function app, we recommend using package files ("Run from package"). Con este enfoque, puede cargar un archivo zip en un contenedor de Blob Storage y el entorno de ejecución de Functions monta el archivo zip como un sistema de archivos de solo lectura.Using this approach, you upload a zip file to a Blob Storage container and the Functions runtime mounts the zip file as a read-only file system. Se trata de una operación atómica, lo que reduce la posibilidad de que una implementación con errores deje la aplicación en un estado incoherente.This is an atomic operation, which reduces the chance that a failed deployment will leave the application in an inconsistent state. También puede mejorar los tiempos de arranque en frío, especialmente para las aplicaciones de Node.js, porque todos los archivos se intercambian a la vez.It can also improve cold start times, especially for Node.js apps, because all of the files are swapped at once.

Control de versiones de la APIAPI versioning

Una API es un contrato entre un servicio y los clientes.An API is a contract between a service and clients. En esta arquitectura, el contrato de API se define en el nivel de API Management.In this architecture, the API contract is defined at the API Management layer. API Management admite dos conceptos de control de versionesdistintos pero complementarios:API Management supports two distinct but complementary versioning concepts:

  • Las versiones permiten a los consumidores de API elegir una versión de API en función de sus necesidades, por ejemplo, v1 en lugar de v2.Versions allow API consumers to choose an API version based on their needs, such as v1 versus v2.

  • Las revisiones permiten a los administradores de API realizar cambios no importantes en una API e implementar esos cambios, junto con un registro de cambios para informar a los consumidores de API sobre dichos cambios.Revisions allow API administrators to make non-breaking changes in an API and deploy those changes, along with a change log to inform API consumers about the changes.

Si realiza un cambio importante en una API, publique una nueva versión en API Management.If you make a breaking change in an API, publish a new version in API Management. Implemente la nueva versión en paralelo con la versión original, en una aplicación de función independiente.Deploy the new version side-by-side with the original version, in a separate Function App. Esto le permite migrar los clientes existentes a la nueva API sin interrumpir las aplicaciones cliente.This lets you migrate existing clients to the new API without breaking client applications. Finalmente, puede dejar de utilizar la versión anterior.Eventually, you can deprecate the previous version. API Management admite varios esquemas de control de versiones: ruta de acceso URL, encabezado HTTP o cadena de consulta.API Management supports several versioning schemes: URL path, HTTP header, or query string. Para más información sobre el control de versiones de API en general, consulte control de versiones de una API web RESTful.For more information about API versioning in general, see Versioning a RESTful web API.

Para actualizaciones que no son cambios importantes en la API, implemente la nueva versión en un espacio de ensayo en la misma aplicación de función.For updates that are not breaking API changes, deploy the new version to a staging slot in the same Function App. Compruebe que la implementación se realizó correctamente y, a continuación, cambie la versión de ensayo por la versión de producción.Verify the deployment succeeded and then swap the staged version with the production version. Publique una revisión en API Management.Publish a revision in API Management.

Implementación de la soluciónDeploy the solution

Para implementar la implementación de referencia para esta arquitectura, consulte el archivo Léame de github.To deploy the reference implementation for this architecture, see the GitHub readme.

Pasos siguientesNext steps

Para obtener más información sobre la implementación de referencia , lea el tutorial de código: Aplicación sin servidor con Azure Functions.To learn more about the reference implementation, read Code walkthrough: Serverless application with Azure Functions.