Aplicação web sem servidor no AzureServerless web application on Azure

Esta arquitetura de referência mostra um sem servidor aplicação web.This reference architecture shows a serverless web application. O aplicativo processa conteúdo estático do armazenamento de Blobs do Azure e implementa uma API com as funções do Azure.The application serves static content from Azure Blob Storage, and implements an API using Azure Functions. A API lê os dados do Cosmos DB e devolve os resultados para a aplicação web.The API reads data from Cosmos DB and returns the results to the web app.

Logotipo do GitHub uma implementação de referência para essa arquitetura está disponível no GitHub.GitHub logo A reference implementation for this architecture is available on GitHub.

Arquitetura de referência para uma aplicação web sem servidor

O termo sem servidor tem dois significados diferentes mas relacionados:The term serverless has two distinct but related meanings:

  • Back-end como serviço (BaaS).Backend as a service (BaaS). Serviços de cloud de back-end, como bases de dados e armazenamento, fornecem APIs que permitem que aplicativos de cliente ligar diretamente a estes serviços.Backend cloud services, such as databases and storage, provide APIs that enable client applications to connect directly to these services.
  • Funciona como um serviço (FaaS).Functions as a service (FaaS). Nesse modelo, uma "função" é um trecho de código que é implementado para a cloud e é executado dentro de um ambiente de alojamento que abstrai completamente os servidores que executam o 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 as definições têm em comum a ideia de que os desenvolvedores e a equipe de DevOps não precisa de implementar, configurar ou gerir servidores.Both definitions have in common the idea that developers and DevOps personnel don't need to deploy, configure, or manage servers. Esta arquitetura de referência centra-se no FaaS usando as funções do Azure, embora a servir de conteúdo web do armazenamento de Blobs do Azure é um exemplo de BaaS.This reference architecture focuses on FaaS using Azure Functions, although serving web content from Azure Blob Storage is an example of BaaS. Algumas características importantes de FaaS são:Some important characteristics of FaaS are:

  1. Os recursos são alocados dinamicamente conforme necessário pela plataforma de computação.Compute resources are allocated dynamically as needed by the platform.
  2. Preço com base no consumo: São cobrados apenas os recursos de computação utilizados para executar o código.Consumption-based pricing: You are charged only for the compute resources used to execute your code.
  3. O dimensionamento de recursos de computação a pedido com base no tráfego, sem que o desenvolvedor precisando fazer qualquer configuração.The compute resources scale on demand based on traffic, without the developer needing to do any configuration.

As funções são executadas quando ocorre um acionador externo, como um pedido de HTTP ou uma mensagem que chegam numa fila.Functions are executed when an external trigger occurs, such as an HTTP request or a message arriving on a queue. Isso torna o estilo de arquitetura controlado por eventos natural para arquiteturas sem servidor.This makes an event-driven architecture style natural for serverless architectures. Para coordenar o trabalho entre os componentes na arquitetura, considere a utilização de Mediador de mensagem ou padrões de pub/sub.To coordinate work between components in the architecture, consider using message brokers or pub/sub patterns. Para obter ajuda para escolher entre as tecnologias de mensagens no Azure, consulte escolher entre os serviços do Azure que entregam mensagens.For help choosing between messaging technologies in Azure, see Choose between Azure services that deliver messages.

ArquiteturaArchitecture

A arquitetura é composta pelos seguintes componentes:The architecture consists of the following components:

Armazenamento de BLOBs.Blob Storage. O conteúdo estático da Web, como HTML, CSS e arquivos JavaScript, são armazenados no armazenamento de BLOBs do Azure e servidos para clientes usando a Hospedagem de site estática.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 a interação dinâmica ocorre por meio de código JavaScript efetuar chamadas para as APIs de back-end.All dynamic interaction happens through JavaScript code making calls to the backend APIs. Não há nenhum código do lado do servidor para processar a página da web.There is no server-side code to render the web page. Alojamento de Web site estático suporta documentos de índice e páginas de erro 404 personalizadas.Static website hosting supports index documents and custom 404 error pages.

CDN.CDN. Use a CDN ( rede de distribuição de conteúdo) do Azure para armazenar em cache o conteúdo para menor latência e entrega mais rápida de conteúdo, além de fornecer um ponto de extremidade 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.

Aplicações de funções.Function Apps. Azure Functions é uma opção de computação sem servidor.Azure Functions is a serverless compute option. Ele usa um modelo orientado para eventos, onde um trecho de código (uma "função") é invocado por um acionador.It uses an event-driven model, where a piece of code (a "function") is invoked by a trigger. Nesta arquitetura, a função é invocada quando um cliente faz um pedido HTTP.In this architecture, the function is invoked when a client makes an HTTP request. O pedido sempre é encaminhado através de um gateway de API, descrito abaixo.The request is always routed through an API gateway, described below.

Gestão de API.API Management. O Gerenciamento de API fornece um gateway de API que fica na frente da função http.API Management provides an API gateway that sits in front of the HTTP function. Pode utilizar a gestão de API para publicar e gerir APIs utilizadas por aplicações cliente.You can use API Management to publish and manage APIs used by client applications. Ajuda a utilizar um gateway de desemparelhar as aplicações de front-end das APIs de back-end.Using a gateway helps to decouple the front-end application from the back-end APIs. Por exemplo, gestão de API pode reescrever URLs, transformar pedidos antes de atingirem o back-end, definir cabeçalhos de solicitação ou resposta e assim por diante.For example, API Management can rewrite URLs, transform requests before they reach the backend, set request or response headers, and so forth.

Gestão de API também pode ser usada para implementar questões abrangentes, tais como:API Management can also be used to implement cross-cutting concerns such as:

  • Imposição de quotas de utilização e a taxa de limitesEnforcing usage quotas and rate limits
  • A validar os tokens de OAuth para autenticaçãoValidating OAuth tokens for authentication
  • Ativar pedidos de várias origens (CORS)Enabling cross-origin requests (CORS)
  • Colocação em cache as respostasCaching responses
  • Monitorização e registo de pedidosMonitoring and logging requests

Se você não precisar de toda a funcionalidade fornecida pelo gerenciamento de API, outra opção será usar proxies de funções.If you don't need all of the functionality provided by API Management, another option is to use Functions Proxies. Esta funcionalidade das funções do Azure permite-lhe definir uma única superfície de API para várias aplicações de funções, criando rotas para funções 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. Proxies de funções também podem efetuar transformações limitadas na solicitação HTTP e a resposta.Function proxies can also perform limited transformations on the HTTP request and response. No entanto, eles não fornecem as mesmas avançadas baseado em políticas capacidades de gestão de API.However, they don't provide the same rich policy-based capabilities of API Management.

O cosmos DB.Cosmos DB. Cosmos DB é um serviço de banco de dados multimodelo.Cosmos DB is a multi-model database service. Para este cenário, a aplicação de função obtém documentos do Cosmos DB em resposta às solicitações HTTP GET do 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). Os utilizadores iniciam sessão na aplicação web através das respetivas credenciais do Azure AD.Users sign into the web application by using their Azure AD credentials. O Azure AD devolve um token de acesso para a API, o que a aplicação web utiliza para autenticar os pedidos de API (consulte autenticação).Azure AD returns an access token for the API, which the web application uses to authenticate API requests (see Authentication).

O Azure Monitor.Azure Monitor. O Monitor coleta métricas de desempenho sobre os serviços do Azure implantados na solução.Monitor collects performance metrics about the Azure services deployed in the solution. Ao visualizar estes num dashboard, pode obter visibilidade sobre o estado de funcionamento da solução.By visualizing these in a dashboard, you can get visibility into the health of the solution. Ele também recolhidos registos de aplicações.It also collected application logs.

Pipelines do Azure.Azure Pipelines. Pipelines é um serviço de integração contínua (CI) e entrega contínua (CD) que cria, testa e implanta o aplicativo.Pipelines is a continuous integration (CI) and continuous delivery (CD) service that builds, tests, and deploys the application.

RecomendaçõesRecommendations

Planos de aplicações de funçãoFunction App plans

As funções do Azure suporta dois modelos de hospedagem.Azure Functions supports two hosting models. Com o plano de consumo, computação power é alocado automaticamente quando o código é executado.With the consumption plan, compute power is automatically allocated when your code is running. Com o serviço de aplicações plano, um conjunto de VMs são alocados para o seu código.With the App Service plan, a set of VMs are allocated for your code. O plano do serviço de aplicação define o número de VMs e o tamanho da VM.The App Service plan defines the number of VMs and the VM size.

Tenha em atenção que o plano do serviço de aplicações não é estritamente sem servidor, de acordo com a definição acima indicada.Note that the App Service plan is not strictly serverless, according to the definition given above. O modelo de programação é o mesmo, no entanto — o mesmo código de função pode ser executado num plano de consumo e um plano do serviço de aplicações.The programming model is the same, however — the same function code can run in both a consumption plan and an App Service plan.

Eis alguns fatores a considerar ao escolher o tipo de plano para utilizar:Here are some factors to consider when choosing which type of plan to use:

  • Arranque a frio.Cold start. Com o plano de consumo, uma função que não foi invocada recentemente incorre em alguma latência adicional na próxima vez que ele é executado.With the consumption plan, a function that hasn't been invoked recently will incur some additional latency the next time it runs. Esta latência adicional se deve alocar e preparar o ambiente de tempo de execução.This additional latency is due to allocating and preparing the runtime environment. Ele é, normalmente, na ordem de segundos, mas depende de vários fatores, incluindo o número de dependências que precisam ser carregadas.It is usually on the order of seconds but depends on several factors, including the number of dependencies that need to be loaded. Para obter mais informações, consulte noções básicas sobre inicialização a frio sem servidor.For more information, see Understanding Serverless Cold Start. Arranque a frio é, normalmente, mais uma preocupação para cargas de trabalho interativas (acionadores HTTP) que controlado por mensagem de cargas de trabalho assíncronas (fila ou event hubs acionadores), uma vez que a latência adicional é observada diretamente pelos utilizadores.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 tempo limite.Timeout period. No plano de consumo, uma execução de função atinge o tempo limite após um período configurável (até um 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)
  • Isolamento de rede virtual.Virtual network isolation. O uso de um plano do serviço de aplicativo permite que as funções sejam executadas dentro de um ambiente do serviço de aplicativo, que é um ambiente de hospedagem dedicado e isolado.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 preços.Pricing model. O plano de consumo é cobrado por número de execuções e consumo de recursos (memória × tempo de execução).The consumption plan is billed by the number of executions and resource consumption (memory × execution time). O plano do serviço de aplicações é faturado por hora com base na SKU de instância VM.The App Service plan is billed hourly based on VM instance SKU. Muitas vezes, o plano de consumo pode ser mais barato do que um plano do serviço de aplicações, uma vez que só paga os recursos de computação que utilizar.Often, the consumption plan can be cheaper than an App Service plan, because you pay only for the compute resources that you use. Isso é especialmente verdadeiro se o tráfego de sofrer picos e os vales.This is especially true if your traffic experiences peaks and troughs. No entanto, se uma aplicação experienciar débito constante de volume elevado, um plano do serviço de aplicações pode custar-menos do que o plano de consumo.However, if an application experiences constant high-volume throughput, an App Service plan may cost less than the consumption plan.
  • Dimensionamento.Scaling. Uma grande vantagem do modelo de consumo é que dimensiona dinamicamente conforme necessário, consoante o tráfego de entrada.A big advantage of the consumption model is that it scales dynamically as needed, based on the incoming traffic. Enquanto esta dimensionamento ocorre rapidamente, ainda há um período de crescimento.While this scaling occurs quickly, there is still a ramp-up period. Para algumas cargas de trabalho, poderá querer deliberadamente sobreaprovisionar as VMs, para que pode lidar com picos de tráfego com zero tempo de crescimento.For some workloads, you might want to deliberately overprovision the VMs, so that you can handle bursts of traffic with zero ramp-up time. Nesse caso, considere um plano do serviço de aplicações.In that case, consider an App Service plan.

Limites da aplicação de funçãoFunction App boundaries

R aplicação de funções aloja a execução de uma ou mais funções.A function app hosts the execution of one or more functions. Pode utilizar uma aplicação de funções para agrupar várias funções como uma unidade lógica.You can use a function app to group several functions together as a logical unit. Dentro de uma aplicação de funções, as funções partilham as mesmas definições de aplicação, plano e ciclo de vida de implementação de alojamento.Within a function app, the functions share the same application settings, hosting plan, and deployment lifecycle. Cada aplicação de função tem seu próprio nome de anfitrião.Each function app has its own hostname.

Utilize aplicações de funções para funções de grupo que partilham o mesmo ciclo de vida e as definições.Use function apps to group functions that share the same lifecycle and settings. As funções que não partilham o mesmo ciclo de vida devem ser hospedadas em aplicações de funções diferentes.Functions that don't share the same lifecycle should be hosted in different function apps.

Considere usar uma abordagem de microsserviços, em que cada aplicação de função representa um microsserviço, possivelmente consiste em várias funções relacionadas.Consider taking a microservices approach, where each function app represents one microservice, possibly consisting of several related functions. Numa arquitetura de microsserviços, os serviços devem ter menos rigidez e uma coesão altamente funcional.In a microservices architecture, services should have loose coupling and high functional cohesion. Menos acoplado significa que pode alterar um serviço sem a necessidade de outros serviços para ser atualizado ao mesmo tempo.Loosely coupled means you can change one service without requiring other services to be updated at the same time. Coesa significa que um serviço tem um objetivo único e bem definido.Cohesive means a service has a single, well-defined purpose. Para obter mais informações sobre essas ideias, consulte Criando microserviços: Análisede domínio.For more discussion of these ideas, see Designing microservices: Domain analysis.

Enlaces de funçõesFunction bindings

Use associações de funções quando possível.Use Functions bindings when possible. Os enlaces proporcionam uma forma declarativa para ligar o seu código aos dados e integrar com outros serviços do Azure.Bindings provide a declarative way to connect your code to data and integrate with other Azure services. Um enlace de entrada preenche um parâmetro de entrada de uma origem de dados externa.An input binding populates an input parameter from an external data source. Um enlace de saída envia o valor de retorno da função para um sink de dados, como uma fila ou a base de dados.An output binding sends the function's return value to a data sink, such as a queue or database.

Por exemplo, a GetStatus função na implementação de referência usa a Associação de entradaCosmos DB.For example, the GetStatus function in the reference implementation uses the Cosmos DB input binding. Esta ligação é configurada para procurar um documento do Cosmos DB, através de parâmetros de consulta que são obtidos a partir da cadeia de consulta no pedido de 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. Se o documento for encontrado, ela é passada para a função como um 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)
{
    ...
}

Ao usar associações, não precisa escrever código que se comunica diretamente com o serviço, que simplifica o código de função e também abstrai os detalhes da origem de dados ou sink.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. No entanto, em alguns casos, poderá ter uma lógica mais complexa que fornece o enlace.In some cases, however, you may need more complex logic than the binding provides. Nesse caso, utilize os SDKs do cliente do Azure diretamente.In that case, use the Azure client SDKs directly.

Considerações de escalabilidadeScalability considerations

As funções.Functions. Para o plano de consumo, o acionador HTTP dimensiona com base sobre o tráfego.For the consumption plan, the HTTP trigger scales based on the traffic. Existe um limite para o número de instâncias de função em simultâneo, mas cada instância pode processar mais de uma solicitação por 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 um plano de serviço de aplicações, o acionador HTTP é dimensionado consoante o número de instâncias VM, que pode ser um valor fixo ou pode dimensionar automaticamente com base num conjunto de regras de dimensionamento 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 obter informações, consulte Azure Functions escala e hospedagem.For information, see Azure Functions scale and hosting.

O cosmos DB.Cosmos DB. Capacidade de débito para o Cosmos DB é medida em unidades de pedido (RU).Throughput capacity for Cosmos DB is measured in Request Units (RU). Um débito de 1 RU corresponde à necessidade de débito para obter um documento de 1KB.A 1-RU throughput corresponds to the throughput need to GET a 1KB document. Para dimensionar um contêiner de Cosmos DB após 10.000 RU, você deve especificar uma chave de partição ao criar o contêiner e incluir a chave de partição em cada documento que você criar.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 obter mais informações sobre chaves de partição, consulte particionar e dimensionar em Azure Cosmos DB.For more information about partition keys, see Partition and scale in Azure Cosmos DB.

Gestão de API.API Management. Gestão de API pode aumentar horizontalmente e suporta o dimensionamento automático baseado em regras.API Management can scale out and supports rule-based autoscaling. Tenha em atenção que o processo de dimensionamento demora pelo menos de 20 minutos.Note that the scaling process takes at least 20 minutes. Se o tráfego for explosivos, deve aprovisionar para o tráfego de rajada máximo que espera.If your traffic is bursty, you should provision for the maximum burst traffic that you expect. No entanto, o dimensionamento automático é útil para processar cada horas ou diariamente variações no tráfego.However, autoscaling is useful for handling hourly or daily variations in traffic. Para obter mais informações, consulte dimensionar automaticamente uma instância de gerenciamento de API do Azure.For more information, see Automatically scale an Azure API Management instance.

Considerações sobre a recuperação após desastreDisaster recovery considerations

A implementação mostrada aqui reside numa única região do Azure.The deployment shown here resides in a single Azure region. Para uma abordagem mais flexível para recuperação após desastre, Aproveite os recursos de distribuição geográfica em vários serviços:For a more resilient approach to disaster-recovery, take advantage of the geo-distribution features in the various services:

  • Gestão de API suporta a implementação em várias regiões, que pode ser utilizada para distribuir uma única instância de gestão de API em qualquer número de regiões do 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 obter mais informações, consulte como implantar uma instância do serviço de gerenciamento de API do Azure em várias regiões do Azure.For more information, see How to deploy an Azure API Management service instance to multiple Azure regions.

  • Use o Gerenciador de tráfego para rotear solicitações HTTP para a região primária.Use Traffic Manager to route HTTP requests to the primary region. Se a aplicação de função em execução nessa região ficar indisponível, o Gestor de tráfego pode efetuar a ativação pós-falha para uma região secundária.If the Function App running in that region becomes unavailable, Traffic Manager can fail over to a secondary region.

  • O Cosmos DB dá suporte a várias regiões mestras, o que permite gravações em qualquer região que você adiciona à sua conta do cosmos DB.Cosmos DB supports multiple master regions, which enables writes to any region that you add to your Cosmos DB account. Se não ativar com vários mestres, ainda pode falhar ao longo da região de escrita principal.If you don't enable multi-master, you can still fail over the primary write region. Os SDKs de cliente do Cosmos DB e as associações de função do Azure processam automaticamente a ativação pós-falha, para que não precisa de atualizar as definições de configuração de aplicação.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.

Considerações de segurançaSecurity considerations

AutenticaçãoAuthentication

O GetStatus API na implementação de referência utiliza o Azure AD para autenticar pedidos.The GetStatus API in the reference implementation uses Azure AD to authenticate requests. O Azure AD dá suporte ao protocolo OpenID Connect, que é um protocolo de autenticação criado com base no protocolo OAuth 2.Azure AD supports the OpenID Connect protocol, which is an authentication protocol built on top of the OAuth 2 protocol.

Nesta arquitetura, a aplicação de cliente é uma aplicação de página única (SPA) que é executada no browser.In this architecture, the client application is a single-page application (SPA) that runs in the browser. Este tipo de aplicação de cliente não é possível manter um segredo do cliente ou um código de autorização ocultada, para que o fluxo de concessão implícita é apropriado.This type of client application cannot keep a client secret or an authorization code hidden, so the implicit grant flow is appropriate. (Veja qual fluxo do OAuth 2,0 devo usar?).(See Which OAuth 2.0 flow should I use?). Eis o fluxo geral:Here's the overall flow:

  1. O utilizador clica na ligação "Iniciar sessão" na aplicação web.The user clicks the "Sign in" link in the web application.
  2. O navegador é redirecionado a página de início de sessão do Azure AD.The browser is redirected the Azure AD sign in page.
  3. O utilizador inicia sessão.The user signs in.
  4. O Azure AD redireciona para a aplicação de cliente, incluindo um token de acesso no fragmento de URL.Azure AD redirects back to the client application, including an access token in the URL fragment.
  5. Quando o aplicativo web chama a API, ele inclui o token de acesso no cabeçalho de autenticação.When the web application calls the API, it includes the access token in the Authentication header. O ID da aplicação é enviado como o público-alvo ('aud") de afirmações no token de acesso.The application ID is sent as the audience ('aud') claim in the access token.
  6. O API de back-end valida o token de acesso.The backend API validates the access token.

Para configurar a autenticação:To configure authentication:

  • Registe uma aplicação no seu inquilino do Azure AD.Register an application in your Azure AD tenant. Isso gera um ID de aplicação, o cliente inclui o URL de início de sessão.This generates an application ID, which the client includes with the login URL.

  • Ative a autenticação do Azure AD dentro da aplicação de função.Enable Azure AD authentication inside the Function App. Para obter mais informações, veja Autenticação e autorização no Serviço de Aplicações do Azure.For more information, see Authentication and authorization in Azure App Service.

  • Adicione a política Validate-JWT ao gerenciamento de API para autorizar a solicitação previamente Validando o token de acesso.Add the validate-jwt policy to API Management to pre-authorize the request by validating the access token.

Para obter mais detalhes, consulte o Leiame do GitHub.For more details, see the GitHub readme.

É recomendado para criar registos de aplicações separadas no Azure AD para o cliente e o API de back-end de aplicações.It's recommended to create separate app registrations in Azure AD for the client application and the backend API. Conceder a permissão da aplicação de cliente para chamar a API.Grant the client application permission to call the API. Esta abordagem dá-lhe a flexibilidade de definir várias APIs e os clientes e controlar as permissões para cada um.This approach gives you the flexibility to define multiple APIs and clients and control the permissions for each.

Em uma API, use escopos para fornecer aos aplicativos um controle refinado sobre quais permissões eles solicitam de um usuário.Within an API, use scopes to give applications fine-grained control over what permissions they request from a user. Por exemplo, pode ter uma API Read e Write âmbitos e uma aplicação de cliente específico podem pedir ao utilizador para autorizar Read apenas permissões.For example, an API might have Read and Write scopes, and a particular client app might ask the user to authorize Read permissions only.

AutorizaçãoAuthorization

Em muitos aplicativos, o API de back-end tem de verificar se um utilizador tem permissão para executar uma dada ação.In many applications, the backend API must check whether a user has permission to perform a given action. É recomendável usar a autorização baseada em declarações, em que as informações sobre o usuário são transmitidas pelo provedor de identidade (nesse caso, o Azure AD) e usadas para tomar decisões de autorização.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 exemplo, ao registrar um aplicativo no Azure AD, você pode definir um conjunto de funções de aplicativo.For example, when you register an application in Azure AD, you can define a set of application roles. Quando um usuário entra no aplicativo, o AD do Azure inclui roles uma declaração para cada função que o usuário recebeu, incluindo funções que são herdadas por meio da Associação de grupo.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.

O token de ID que o Azure AD retorna para o cliente contém algumas das declarações do usuário.The ID token that Azure AD returns to the client contains some of the user's claims. No aplicativo de funções, essas declarações estão disponíveis no cabeçalho X-MS-CLIENT-PRINCIPAL da solicitação.Within the function app, these claims are available in the X-MS-CLIENT-PRINCIPAL header of the request. No entanto, é mais simples ler essas informações de dados de associação.However, it's simpler to read this information from binding data. Para outras declarações, use Microsoft Graph para consultar o Azure AD.For other claims, use Microsoft Graph to query Azure AD. (O usuário deve consentir essa ação ao entrar.)(The user must consent to this action when signing in.)

Para obter mais informações, consulte trabalhando com identidades de cliente.For more information, see Working with client identities.

CORSCORS

Nesta arquitetura de referência, o aplicativo web e a API não partilham a mesma origem.In this reference architecture, the web application and the API do not share the same origin. Isso significa que quando o aplicativo chama a API, é um pedido de várias origens.That means when the application calls the API, it is a cross-origin request. A segurança do browser impede que uma página Web realize pedidos de AJAX para outro domínio.Browser security prevents a web page from making AJAX requests to another domain. Esta restrição é chamada de política de mesma origem e impede que um site malicioso leia dados confidenciais de outro site.This restriction is called the same-origin policy and prevents a malicious site from reading sensitive data from another site. Para habilitar uma solicitação entre origens, adicione uma política de CORS (compartilhamento de recursos entre origens) ao gateway de gerenciamento de API: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>

Neste exemplo, o permitem-credentials atributo é verdadeiro.In this example, the allow-credentials attribute is true. Isso autoriza o browser para enviar credenciais (incluindo cookies) com o pedido.This authorizes the browser to send credentials (including cookies) with the request. Caso contrário, por predefinição o navegador não envia as credenciais com um pedido de várias origens.Otherwise, by default the browser does not send credentials with a cross-origin request.

Nota

Tenha muito cuidado sobre a definição permitir que as credenciais para verdadeiro, porque significa que um Web site pode enviar as credenciais do utilizador à sua API em nome do utilizador, sem que o usuário em relação à ciência.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. Tem de confiar a origem permitida.You must trust the allowed origin.

Impor HTTPSEnforce HTTPS

Para segurança máxima, exigir HTTPS em todo o pipeline de solicitação:For maximum security, require HTTPS throughout the request pipeline:

  • CDN.CDN. A CDN do Azure suporta o HTTPS no *.azureedge.net subdomínio por predefinição.Azure CDN supports HTTPS on the *.azureedge.net subdomain by default. Para habilitar o HTTPS na CDN para nomes de domínio personalizados, consulte o tutorial: Configure o HTTPS em um domíniopersonalizado da CDN do Azure.To enable HTTPS in the CDN for custom domain names, see Tutorial: Configure HTTPS on an Azure CDN custom domain.

  • Alojamento de Web site estático.Static website hosting. Habilite a opção "transferência segura obrigatória" na conta de armazenamento.Enable the "Secure transfer required" option on the Storage account. Quando esta opção está ativada, a conta de armazenamento só permite pedidos provenientes de ligações de HTTPS seguras.When this option is enabled, the storage account only allows requests from secure HTTPS connections.

  • Gestão de API.API Management. Configure as APIs para utilizar apenas os protocolos HTTPS.Configure the APIs to use HTTPS protocol only. Pode configurar esta opção no portal do Azure ou através de um modelo do 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" ]
        },
        ...
    }
    
  • As funções do Azure.Azure Functions. Habilite a configuração "somente HTTPS".Enable the "HTTPS Only" setting.

Bloquear a aplicação de funçõesLock down the function app

Todas as chamadas para a função devem passar através do gateway de API.All calls to the function should go through the API gateway. Poderá fazê-lo da seguinte forma:You can achieve this as follows:

  • Configure a aplicação de funções para exigir uma tecla de função.Configure the function app to require a function key. O gateway de gestão de API irá incluir a tecla de função quando chama a aplicação de funções.The API Management gateway will include the function key when it calls the function app. Isto impede que os clientes chamando a função diretamente, ignorando o gateway.This prevents clients from calling the function directly, bypassing the gateway.

  • O gateway de gerenciamento de API tem um endereço IP estático.The API Management gateway has a static IP address. Restringir a função do Azure para permitir apenas chamadas desse endereço IP estático.Restrict the Azure Function to allow only calls from that static IP address. Para obter mais informações, consulte Azure app restrições de IP estático do serviço.For more information, see Azure App Service Static IP Restrictions. (Esta funcionalidade está disponível para os serviços de escalão Standard apenas.)(This feature is available for Standard tier services only.)

Proteger segredos da aplicaçãoProtect application secrets

Não armazene segredos da aplicação, como credenciais de base de dados, nos seus arquivos de código ou configuração.Don't store application secrets, such as database credentials, in your code or configuration files. Em vez disso, utilize definições da aplicação, que são armazenadas encriptadas no Azure.Instead, use App settings, which are stored encrypted in Azure. Para obter mais informações, consulte segurança em Azure app serviço e Azure Functions.For more information, see Security in Azure App Service and Azure Functions.

Em alternativa, pode armazenar segredos da aplicação no Cofre de chaves.Alternatively, you can store application secrets in Key Vault. Isto permite-lhe centralizar o armazenamento dos segredos, controlar sua distribuição e a monitorizar como e quando estão a ser acedidos segredos.This allows you to centralize the storage of secrets, control their distribution, and monitor how and when secrets are being accessed. Para obter mais informações, consulte configurar um aplicativo Web do Azure para ler um segredo de Key Vault.For more information, see Configure an Azure web application to read a secret from Key Vault. No entanto, tenha em atenção que as funções acionadores e enlaces carregar as definições de configuração de definições da aplicação.However, note that Functions triggers and bindings load their configuration settings from app settings. Não há nenhum modo interno para configurar acionadores e enlaces para utilizar segredos do Key Vault.There is no built-in way to configure the triggers and bindings to use Key Vault secrets.

Considerações de DevOpsDevOps considerations

ImplementaçãoDeployment

Para implantar o aplicativo de funções, é recomendável usar arquivos de pacote ("executar do pacote").To deploy the function app, we recommend using package files ("Run from package"). Com essa abordagem, carregar um ficheiro zip para um contentor de armazenamento de BLOBs e o runtime das funções monta o ficheiro zip, como um sistema de ficheiros só de leitura.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. Esta é uma operação Atómica, que reduz a chance de que uma falha na implementação deixará o aplicativo num estado inconsistente.This is an atomic operation, which reduces the chance that a failed deployment will leave the application in an inconsistent state. Também pode melhorar os tempos de arranque a frio, especialmente para aplicações node. js, uma vez que todos os arquivos são ativados ao mesmo tempo.It can also improve cold start times, especially for Node.js apps, because all of the files are swapped at once.

Controlo de versões de APIAPI versioning

Uma API é um contrato entre clientes e um serviço.An API is a contract between a service and clients. Nesta arquitetura, o contrato de API é definido na camada de gestão de API.In this architecture, the API contract is defined at the API Management layer. O gerenciamento de API dá suporte a dois conceitos distintos, mas complementares de versão:API Management supports two distinct but complementary versioning concepts:

  • Versões permitir que os consumidores de APIS escolher uma versão de API com base nas suas necessidades, por exemplo, v1 ou v2.Versions allow API consumers to choose an API version based on their needs, such as v1 versus v2.

  • Revisões permitem que os administradores de API fazer alterações sem interrupções numa API e implementar essas alterações, juntamente com um registo de alterações para informar os consumidores de APIS sobre as alterações.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.

Se fizer uma quebra de alterar numa API, publique uma nova versão da API Management.If you make a breaking change in an API, publish a new version in API Management. Implemente o nova versão do lado do lado com a versão original, que uma aplicação de função separada.Deploy the new version side-by-side with the original version, in a separate Function App. Isto permite-lhe migrar clientes existentes para a nova API sem interromper aplicações de cliente.This lets you migrate existing clients to the new API without breaking client applications. Eventualmente, pode preterir a versão anterior.Eventually, you can deprecate the previous version. O gerenciamento de API dá suporte a vários esquemas de controle de versão: Caminho da URL, cabeçalho HTTP ou cadeia de caracteres de consulta.API Management supports several versioning schemes: URL path, HTTP header, or query string. Para obter mais informações sobre o controle de versão de API em geral, consulte controle de versão de uma API Web RESTful.For more information about API versioning in general, see Versioning a RESTful web API.

Para as atualizações que não apresentam alterações na API, implemente a nova versão para um bloco de teste na mesma Function App.For updates that are not breaking API changes, deploy the new version to a staging slot in the same Function App. Certifique-se de que a implementação foi concluída com êxito e, em seguida, trocar a versão em etapas com a versão de produção.Verify the deployment succeeded and then swap the staged version with the production version. Publicar uma revisão na gestão de API.Publish a revision in API Management.

Implementar a soluçãoDeploy the solution

Para implantar a implementação de referência para essa arquitetura, consulte o Leiame do GitHub.To deploy the reference implementation for this architecture, see the GitHub readme.

Passos SeguintesNext steps

Para saber mais sobre a implementação de referência, Leia o passo a passo do código: Aplicativo sem servidor com oAzure functions.To learn more about the reference implementation, read Code walkthrough: Serverless application with Azure Functions.

Diretrizes relacionadas:Related guidance: