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 Hay disponible una implementación de referencia de esta arquitectura en GitHub.GitHub logo A reference implementation for this architecture is available on GitHub.

Arquitectura de referencia para una aplicación web sin servidor Descargue un archivo SVG de esta arquitectura.Reference architecture for a serverless web application Download an SVG of this architecture.

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 varias API que permiten que las aplicaciones cliente se conecten directamente a estos servicios.Back-end 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 podría ser un ejemplo de BaaS.This reference architecture focuses on FaaS using Azure Functions, although serving web content from Azure Blob Storage could be 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 resulte adecuado para 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 elegir entre las tecnologías de mensajería de Azure, consulte Elección entre los servicios de Azure que entregan mensajes.For help with choosing between messaging technologies in Azure, see Choose between Azure services that deliver messages.

ArchitectureArchitecture

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

Blob Storage.Blob Storage. El contenido web estático, como los archivos HTML, CSS y JavaScript, se almacena en Azure Blob Storage y se entrega 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 back-end 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 y así reducir la latencia y acelerar la entrega de contenido, además de 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 coloca 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 que las reciba el back-end, establecer los encabezados de solicitud o respuesta y mucho más.For example, API Management can rewrite URLs, transform requests before they reach the back end, 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 todas las funcionalidades proporcionadas por API Management, también puede usar Functions Proxies.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 de 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. Monitor recopila métricas de rendimiento sobre 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. Pipelines 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 más información, consulte Descripción del arranque 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, la ejecución de una función agota el tiempo de espera tras 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 ejecutar las funciones dentro de una instancia de 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álisis de dominios.For more discussion of these ideas, see Designing microservices: Domain analysis.

Enlaces de funcionesFunction bindings

Use enlaces de Functions cuando 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 función GetStatus de la implementación de referencia usa el enlace de entrada de Cosmos 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 más información, consulte Escalado y hospedaje de Azure Functions.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. Para escalar un contenedor de Cosmos DB más allá de 10 000 RU, debe especificar una clave de partición al crear el contenedor e incluir la clave de partición en todos los documentos 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 más información sobre las claves de partición, consulte Particiones 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. El proceso de escalado tarda al menos 20 minutos.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 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 de escritura, lo que permite escribir en cualquier región que se agregue a la cuenta de Cosmos DB.Cosmos DB supports multiple write regions, which enables writes to any region that you add to your Cosmos DB account. Si no habilita la funcionalidad de escritura múltiple, todavía puede conmutar por error a la región de escritura principal.If you don't enable multi-write, 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 back-end 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 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 la aplicación cliente y la API de back-end.It's recommended to create separate app registrations in Azure AD for the client application and the back-end 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.

En una API, use los ámbitos para dotar a las aplicaciones con un control detallado de los permisos que solicitan a 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.

AuthorizationAuthorization

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 back-end API must check whether a user has permission to perform a given action. Se recomienda usar la autorización basada en notificaciones, en la que el proveedor de identidades (en este caso, Azure AD) transmite la información sobre el usuario que 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 una notificación roles por cada rol que se ha concedido al usuario (incluidos los roles heredados por 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 id. que Azure AD devuelve al cliente contiene algunas notificaciones del usuario.The ID token that Azure AD returns to the client contains some of the user's claims. En la aplicación de funciones, 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. No obstante, es más sencillo leer esta información desde los datos de enlace.However, it's simpler to read this information from binding data. Para obtener otras notificaciones, use Microsoft Graph para consultar a 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 más información, consulte Uso de 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.

Aplicación de 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 "Se requiere transferencia segura" en la cuenta de Storage.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 de configuració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 más información, consulte 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 más información, consulte Configuración de una aplicación web de Azure para que lea un secreto desde 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ón del front-endFront-end deployment

El front-end de esta arquitectura de referencia es una aplicación de una sola página, que incluye JavaScript que accede a las API de back-end sin servidor y contenido estático que proporciona una experiencia de usuario rápida.The front end of this reference architecture is a single page application, with JavaScript accessing the serverless back-end APIs, and static content providing a fast user experience. He aquí algunas consideraciones importantes para dicha aplicación:The following are some important considerations for such an application:

  • Implemente la aplicación uniformemente para los usuarios a través de un área geográfica amplia con una red CDN preparada para uso global y hospede el contenido estático en la nube.Deploy the application uniformly to users over a wide geographical area with a global-ready CDN, with the static content hosted on the cloud. Esto elimina la necesidad de un servidor web dedicado.This avoids the need for a dedicated web server. Consulte Integración de una cuenta de Azure Storage en Azure CDN para comenzar.Read Integrate an Azure storage account with Azure CDN to get started. Proteja su aplicación con HTTPS.Secure your application with HTTPS. Lea los procedimientos recomendados para usar las redes de entrega de contenido para conocer recomendaciones adicionales.Read the Best practices for using content delivery networks for additional recommendations.
  • Use un servicio de CI/CD rápido y confiable, como Azure Pipelines, para compilar e implementar automáticamente todos los cambios en el origen.Use a fast and reliable CI/CD service such as Azure Pipelines, to automatically build and deploy every source change. El origen debe residir en un sistema de control de versiones en línea.The source must reside in an online version control system. Para obtener más información, consulte Creación de la primera canalización.For more details, read Create your first pipeline.
  • Comprima los archivos del sitio web para reducir el consumo de ancho de banda en la red CDN y mejorar el rendimiento.Compress your website files to reduce the bandwidth consumption on the CDN and improve performance. Azure CDN permite comprimir sobre la marcha en los servidores perimetrales.Azure CDN allows compression on the fly on the edge servers. La canalización de implementación de esta arquitectura de referencia también puede comprimir los archivos antes de implementarlos en el almacenamiento de blobs.Alternatively, the deploy pipeline in this reference architecture compresses the files before deploying them to the Blob storage. Esto reduce los requisitos de almacenamiento y ofrece mayor libertad para elegir las herramientas de compresión, independientemente de las limitaciones de la red CDN.This reduces the storage requirement, and gives you more freedom to choose the compression tools, regardless of any CDN limitations.
  • La red CDN debe ser capaz de purgar su memoria caché para asegurarse de que todos los usuarios reciben el contenido más actualizado.The CDN should be able to purge its cache to ensure all users are served the freshest content. Se requiere una purga de caché si los procesos de compilación e implementación no son atómicos; por ejemplo, si reemplazan los archivos antiguos con los recién creados en la misma carpeta de origen.A cache purge is required if the build and deploy processes are not atomic, for example, if they replace old files with newly built ones in the same origin folder.
  • Una estrategia de caché diferente, como el control de versiones mediante directorios, podría no requerir de purgas de la red CDN.A different cache strategy such as versioning using directories, may not require a purge by the CDN. La canalización de compilación de esta aplicación front-end crea un nuevo directorio para cada versión recién compilada.The build pipeline in this front-end application creates a new directory for each newly built version. Esta versión se carga como una unidad atómica en el almacenamiento de blobs.This version is uploaded as an atomic unit to the Blob storage. La instancia de Azure CDN apunta a esta nueva versión solo después de que se haya completado una implementación.The Azure CDN points to this new version only after a completed deployment.
  • Aumente el TTL de la caché; para ello, almacene en la caché los archivos de recursos durante un período de tiempo más largo.Increase the cache TTL by caching resource files for a longer duration, spanning months. Para garantizar que los almacenados en memoria caché se actualizan cuando cambian, cree huellas digitales de los nombres de archivo cuando se vuelvan a generar.To make sure the cached files are updated when they do change, fingerprint the filenames when they are rebuilt. Esta aplicación front-end crea huellas digitales de todos los archivos, excepto los archivos de acceso público como index.html.This front-end application fingerprints all files except for public-facing files such as index.html. Ya que index.html se actualiza con frecuencia, refleja los nombres de archivo modificados, lo que actualiza la memoria caché.Since the index.html is updated frequently, it reflects the changed filenames causing a cache refresh. Consulte Administración de la expiración del contenido web en Azure CDN para más información.See the Manage expiration of web content in Azure CDN for more information.

Implementación del back-endBack-end deployment

Para implementar la aplicación de funciones, se recomienda usar archivos de paquete ("Ejecución desde el 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 versiones distintos que se complementan: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 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 acerca del 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.

Consideraciones sobre el costoCost considerations

Puede usar la calculadora de precios de Azure para calcular los costos.Use the Azure pricing calculator to estimate costs. Tenga en cuenta los siguientes puntos para optimizar el costo de esta arquitectura.Consider these points to optimize cost of this architecture.

Azure FunctionsAzure Functions

Azure Functions admite dos modelos de hospedaje.Azure Functions supports two hosting models.

  • Plan de consumo.Consumption plan.

    La potencia de proceso se asigna automáticamente cuando se ejecuta el código.Compute power is automatically allocated when your code is running.

  • Plan de App Service.App Service plan.

    Se asigna un conjunto de máquinas virtuales para el código.A set of VMs are allocated for your code. Este plan define el número de máquinas virtuales y el tamaño de máquina virtual.This plan defines the number of VMs and the VM size.

En esta arquitectura, se invoca una función cuando un cliente realiza una solicitud HTTP.In this architecture, a function is invoked when a client makes an HTTP request. Ya que no se espera un rendimiento de gran volumen constante en este caso de uso, se recomienda el plan de consumo , porque solo paga por los recursos de proceso que usa.Because a constant high-volume throughput is not expected in this use case, consumption plan is recommended because you pay only for the compute resources you use.

Azure Cosmos DBAzure Cosmos DB

Azure Cosmos DB factura el rendimiento aprovisionado y el almacenamiento consumido por hora.Azure Cosmos DB bills for provisioned throughput and consumed storage by hour. El rendimiento aprovisionado se expresa en unidades de solicitud por segundo (RU/s), que se pueden usar para las operaciones de base de datos comunes, como inserciones o lecturas.Provisioned throughput is expressed in Request Units per second (RU/s), which can be used for typical database operations, such as inserts, reads. El precio se basa en la capacidad de RU/s que haya reservado.The price is based on the capacity in RU/s that you reserve.

El almacenamiento se factura por cada GB usado para los datos e índice almacenados.Storage is billed for each GB used for your stored data and index.

Consulte Modelo precios de Cosmos DB para más información.See Cosmos DB pricing model for more information.

En esta arquitectura, la aplicación de funciones recupera documentos de Cosmos DB en respuesta a solicitudes GET HTTP del cliente.In this architecture, the function application fetches documents from Cosmos DB in response to HTTP GET requests from the client. Cosmos DB es rentable en este caso, ya que las operaciones de lectura son significativamente más baratas que las operaciones de escritura expresadas en RU/s.Cosmos DB is cost effective in this case because reading operations are significantly cheaper than write operations expressed on RU/s.

Content Delivery NetworkContent Delivery Network

La tasa de facturación puede variar en función de la región de facturación de la ubicación del servidor de origen que entrega el contenido al usuario final.Billing rate may differ depending on the billing region based on the location of the source server delivering the content to the end user. La ubicación física del cliente no es la región de facturación.The physical location of the client is not the billing region. Cualquier solicitud HTTP o HTTPS que pase por la red CDN es un evento facturable, que incluye todos los tipos de respuesta: correcto, error u otros.Any HTTP or HTTPS request that hits the CDN is a billable event, which includes all response types: success, failure, or other. Respuestas distintas pueden generar cantidades de tráfico diferentes.Different responses may generate different traffic amounts.

En esta arquitectura de referencia, la implementación se hospeda en una sola región de Azure.In this reference architecture the deployment resides in a single Azure region.

Para reducir los costos, considere la posibilidad de aumentar el TTL de la memoria caché; para ello, almacene en caché los archivos de recursos durante más tiempo y configure el TTL más largo posible en su contenido.To lower costs, consider increasing the cache TTL by caching resource files for a longer duration and setting the longest TTL possible on your content.

Para más información, consulte la sección Costos del artículo sobre el marco de buena arquitectura de Microsoft Azure.For more information, see the Cost section in Microsoft Azure Well-Architected Framework.

Implementación de la soluciónDeploy the solution

Para implementar la solución de referencia de 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, consulte 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.

Instrucciones relacionadas:Related guidance: