Aplicativo Web sem servidor no AzureServerless web application on Azure

Essa arquitetura de referência mostra um aplicativo Web sem servidor .This reference architecture shows a serverless web application. O aplicativo fornece conteúdo estático do Armazenamento de Blobs do Azure e implementa uma API usando o Azure Functions.The application serves static content from Azure Blob Storage, and implements an API using Azure Functions. A API lê dados do Cosmos DB e retorna os resultados para o aplicativo 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.

A arquitetura de referência para um aplicativo Web sem servidor baixa um SVG dessa arquitetura.Reference architecture for a serverless web application Download an SVG of this architecture.

O termo "sem servidor" tem dois significados diferentes, porém relacionados:The term serverless has two distinct but related meanings:

  • Back-end como serviço (BaaS).Backend as a service (BaaS). Os serviços de nuvem de back-end, como bancos de dados e armazenamento, fornecem APIs que permitem que os aplicativos cliente se conectem diretamente a esses serviços.Back-end cloud services, such as databases and storage, provide APIs that enable client applications to connect directly to these services.
  • Funções como serviço (FaaS).Functions as a service (FaaS). Nesse modelo, uma "função" é um trecho de código implantado na nuvem e executado dentro de um ambiente de hospedagem 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.

As duas definições têm em comum a ideia de que os desenvolvedores e a equipe de DevOps não precisam implantar, configurar ou gerenciar servidores.Both definitions have in common the idea that developers and DevOps personnel don't need to deploy, configure, or manage servers. Essa arquitetura de referência se concentra em FaaS usando Azure Functions, embora o fornecimento de conteúdo da Web do armazenamento de BLOBs do Azure possa ser um exemplo 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. Veja algumas características importantes do FaaS:Some important characteristics of FaaS are:

  1. Os recursos de computação são alocados dinamicamente conforme exigido pela plataforma.Compute resources are allocated dynamically as needed by the platform.
  2. Preço com base no consumo: você recebe uma cobrança apenas pelos recursos de computação usados para execução do seu código.Consumption-based pricing: You are charged only for the compute resources used to execute your code.
  3. Os recursos de computação aumentam sob demanda com base no tráfego, sem que o desenvolvedor precise realizar 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 um gatilho externo ocorre, como uma solicitação HTTP ou uma mensagem que chega a uma fila.Functions are executed when an external trigger occurs, such as an HTTP request or a message arriving on a queue. Isso faz com que um estilo de arquitetura orientada a eventos seja natural para arquiteturas sem servidor.This makes an event-driven architecture style natural for serverless architectures. Para coordenar o trabalho entre os componentes da arquitetura, considere o uso de agentes de mensagens 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 com a escolha entre as tecnologias de mensagens no Azure, consulte escolher entre os serviços do Azure que entregam mensagens.For help with choosing between messaging technologies in Azure, see Choose between Azure services that deliver messages.

ArquiteturaArchitecture

Essa arquitetura consiste nos seguintes componentes:The architecture consists of the following components:

Armazenamento de BLOBs.Blob Storage. O conteúdo Web estático, como arquivos HTML, CSS e JavaScript, é armazenado no Armazenamento de Blobs do Azure e fornecido aos clientes usando a hospedagem de site estático.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 fazendo chamadas para as APIs de back-end.All dynamic interaction happens through JavaScript code making calls to the back-end APIs. Não há código do lado do servidor para renderizar a página da Web.There is no server-side code to render the web page. A hospedagem do site estático oferece suporte à indexação de documentos 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 latência mais baixa e distribuição mais rápida do 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.

Aplicativos de funções.Function Apps. O Azure Functions é uma opção de computação sem servidor.Azure Functions is a serverless compute option. Ele usa um modelo controlado por eventos, em que um trecho de código (uma "função") é invocado por um gatilho.It uses an event-driven model, where a piece of code (a "function") is invoked by a trigger. Nessa arquitetura, a função é invocada quando um cliente faz uma solicitação HTTP.In this architecture, the function is invoked when a client makes an HTTP request. A solicitação é sempre roteada por meio de um gateway de API, descrito abaixo.The request is always routed through an API gateway, described below.

Gerenciamento 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. Use o Gerenciamento de API para publicar e gerenciar APIs usadas por aplicativos cliente.You can use API Management to publish and manage APIs used by client applications. O uso de um gateway ajuda a desacoplar o aplicativo 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, o gerenciamento de API pode reescrever URLs, transformar solicitações antes que elas atinjam 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 back end, set request or response headers, and so forth.

O Gerenciamento de API também pode ser usado para implementar características transversais, como:API Management can also be used to implement cross-cutting concerns such as:

  • Imposição do uso de cotas e limites de taxaEnforcing usage quotas and rate limits
  • Validação de tokens OAuth para autenticaçãoValidating OAuth tokens for authentication
  • Habilitação de CORS (solicitações entre origens)Enabling cross-origin requests (CORS)
  • Armazenamento de respostas em cacheCaching responses
  • Monitoramento e registro em log de solicitaçõesMonitoring and logging requests

Se você não precisar de toda a funcionalidade fornecida pelo Gerenciamento de API, outra opção será usar Proxies do Functions.If you don't need all of the functionality provided by API Management, another option is to use Functions Proxies. Esse recurso do Azure Functions permite a definição de uma única superfície de API para vários aplicativos de funções por meio da criação de 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. Os proxies de função também podem executar transformações limitadas na solicitação e resposta HTTP.Function proxies can also perform limited transformations on the HTTP request and response. No entanto, eles não fornecem os mesmos recursos avançados baseados em política do Gerenciamento de API.However, they don't provide the same rich policy-based capabilities of API Management.

Cosmos DB.Cosmos DB. Cosmos DB é um serviço de banco de dados multimodelo.Cosmos DB is a multi-model database service. Para esse cenário, o aplicativo de função busca documentos do Cosmos DB em resposta a 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 (AD do Azure).Azure Active Directory (Azure AD). Os usuários fazem logon no aplicativo Web usando suas credenciais do Azure AD.Users sign into the web application by using their Azure AD credentials. O Azure AD retorna um token de acesso para a API, que o aplicativo Web usa para autenticar solicitações de API (confira Autenticação).Azure AD returns an access token for the API, which the web application uses to authenticate API requests (see Authentication).

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 visualizá-las em um painel, você obtém informações sobre a integridade da solução.By visualizing these in a dashboard, you can get visibility into the health of the solution. O Monitor também coletou logs de aplicativo.It also collected application logs.

Azure Pipelines.Azure Pipelines. O Pipelines é um serviço de CI (integração contínua) e CD (entrega contínua) que compila, 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 do Aplicativo de funçõesFunction App plans

O Azure Functions dá suporte a dois modelos de hospedagem.Azure Functions supports two hosting models. O plano de consumo aloca automaticamente a potência de computação quando o código estiver em execução.With the consumption plan, compute power is automatically allocated when your code is running. Com o plano de Serviço de Aplicativo, um conjunto de VMs é alocado para seu código.With the App Service plan, a set of VMs are allocated for your code. O plano de Serviço de Aplicativo define o número de VMs e o tamanho da VM.The App Service plan defines the number of VMs and the VM size.

Observe que o plano de Serviço de Aplicativo não é estritamente sem servidor, de acordo com a definição fornecida acima.Note that the App Service plan is not strictly serverless, according to the definition given above. O modelo de programação é o mesmo, porém — o mesmo código de função pode ser executado em um plano de consumo e em um plano de Serviço de Aplicativo.The programming model is the same, however — the same function code can run in both a consumption plan and an App Service plan.

Veja alguns fatores a serem considerados ao escolher qual tipo de plano usar:Here are some factors to consider when choosing which type of plan to use:

  • Início 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 for executada.With the consumption plan, a function that hasn't been invoked recently will incur some additional latency the next time it runs. A latência adicional ocorre devido à alocação e à preparação do ambiente de runtime.This additional latency is due to allocating and preparing the runtime environment. Normalmente, demora 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 saber mais, confira Noções básicas sobre a inicialização a frio sem servidor.For more information, see Understanding Serverless Cold Start. Normalmente, a inicialização a frio é uma preocupação para cargas de trabalho interativas (gatilhos HTTP) do que para cargas de trabalho assíncronas orientadas a mensagem (gatilhos de fila ou hubs de evento), pois a latência adicional é observada diretamente pelos usuários.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.
  • Tempo limite.Timeout period. Em um plano de consumo, o tempo de execução de uma função expira após um período configurável (até 10 minutos, no máximo)In the consumption plan, a function execution times out after a configurable period of time (to a maximum of 10 minutes)
  • Isolamento da rede virtual.Virtual network isolation. O uso de um plano de Serviço de Aplicativo permite a execução das funções dentro de um Ambiente de 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 pelo número de execuções e pelo consumo de recursos (tempo de execução da memória ×).The consumption plan is billed by the number of executions and resource consumption (memory × execution time). O plano de Serviço de Aplicativo é cobrado por hora com base no SKU da instância da VM.The App Service plan is billed hourly based on VM instance SKU. Geralmente, o plano de consumo é mais barato que um plano de Serviço de Aplicativo, pois você paga apenas pelos recursos de computação que usar.Often, the consumption plan can be cheaper than an App Service plan, because you pay only for the compute resources that you use. Principalmente se o tráfego apresentar picos e ciclos.This is especially true if your traffic experiences peaks and troughs. No entanto, se um aplicativo apresentar uma taxa de transferência de alto volume constante, um plano de Serviço de Aplicativo poderá 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 ele se ajusta dinamicamente conforme o necessário, com base no tráfego de entrada.A big advantage of the consumption model is that it scales dynamically as needed, based on the incoming traffic. Embora esse dimensionamento ocorra 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, convém sobreprovisionar deliberadamente as VMs, para que você possa lidar com picos de tráfego com um tempo de crescimento nulo.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 de Serviço de Aplicativo.In that case, consider an App Service plan.

Limites do Aplicativo de funçõesFunction App boundaries

Um aplicativo de funções hospeda a execução de uma ou mais funções.A function app hosts the execution of one or more functions. Use um aplicativo 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 um aplicativo de funções, as funções compartilham as mesmas configurações de aplicativo, plano de hospedagem e ciclo de vida de implantação.Within a function app, the functions share the same application settings, hosting plan, and deployment lifecycle. Cada aplicativo de funções tem seu próprio nome de host.Each function app has its own hostname.

Use os aplicativos de função para agrupar funções que compartilham o mesmo ciclo de vida e configurações.Use function apps to group functions that share the same lifecycle and settings. Funções que não compartilham o mesmo ciclo de vida devem ser hospedadas em aplicativos de funções diferentes.Functions that don't share the same lifecycle should be hosted in different function apps.

Analise o uso de uma abordagem de microsserviços, em que cada aplicativo de funções representa um microsserviço, possivelmente composto por várias funções relacionadas.Consider taking a microservices approach, where each function app represents one microservice, possibly consisting of several related functions. Em uma arquitetura de microsserviços, os serviços devem ter um acoplamento flexível e alta coesão funcional.In a microservices architecture, services should have loose coupling and high functional cohesion. O acoplamento flexível significa que você pode alterar um serviço sem a necessidade de atualizar simultaneamente outros serviços.Loosely coupled means you can change one service without requiring other services to be updated at the same time. Coesão significa que um serviço tem uma finalidade única e bem definida.Cohesive means a service has a single, well-defined purpose. Para saber mais sobre essas ideias, confira Criação de microsserviços: análise de domínio.For more discussion of these ideas, see Designing microservices: Domain analysis.

Associações de funçãoFunction bindings

Use as associações do Functions quando possível.Use Functions bindings when possible. As associações fornecem uma maneira declarativa de conectar seu código aos dados e integrá-los a outros serviços do Azure.Bindings provide a declarative way to connect your code to data and integrate with other Azure services. Uma associação de entrada preenche um parâmetro de entrada de uma fonte de dados externa.An input binding populates an input parameter from an external data source. Uma associação de saída envia o valor de retorno da função para um coletor de dados, como uma fila ou um banco de dados.An output binding sends the function's return value to a data sink, such as a queue or database.

Por exemplo, a função GetStatus na implementação de referência usa a associação de entrada do Cosmos DB.For example, the GetStatus function in the reference implementation uses the Cosmos DB input binding. Essa associação é configurada para pesquisar um documento no Cosmos DB usando os parâmetros de consulta obtidos da cadeia de consulta da solicitação 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, ele será passado 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, você não precisa escrever um código para se comunicar diretamente com o serviço, o que simplifica o código de função e também abstrai os detalhes da fonte de dados ou do coletor.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. Porém, em alguns casos, talvez você precise de uma lógica mais complexa do que a fornecida pela associação.In some cases, however, you may need more complex logic than the binding provides. Nesse caso, use os SDKs do cliente do Azure diretamente.In that case, use the Azure client SDKs directly.

Considerações sobre escalabilidadeScalability considerations

Funçõesdo.Functions. Para o plano de consumo, o gatilho HTTP é dimensionado com base no tráfego.For the consumption plan, the HTTP trigger scales based on the traffic. Há um limite para o número de instâncias simultâneas de função, 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. No caso de um plano de Serviço de Aplicativo, o gatilho HTTP é dimensionado de acordo com o número de instâncias de VM, que pode ser um valor fixo ou dimensionado automaticamente com base em um 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 saber mais, confira Escala e hospedagem do Azure Functions.For information, see Azure Functions scale and hosting.

Cosmos DB.Cosmos DB. A capacidade da taxa de transferência para o Cosmos DB é medida em Unidades de Solicitação (RU).Throughput capacity for Cosmos DB is measured in Request Units (RU). Uma taxa de transferência de 1-RU corresponde à taxa de transferência exigida para obter (GET) um documento de 1 KB.A 1-RU throughput corresponds to the throughput need to GET a 1KB document. Para dimensionar um contêiner do Cosmos DB acima de 10.000 RU, é preciso especificar uma chave de partição ao criar o contêiner e incluir a chave de partição em todos os documentos criados por você.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 saber mais sobre chaves de particionamento, confira Particionar e dimensionar no Azure Cosmos DB.For more information about partition keys, see Partition and scale in Azure Cosmos DB.

Gerenciamento de API.API Management. O Gerenciamento de API permite escalar horizontalmente e dá suporte ao dimensionamento automático baseado em regra.API Management can scale out and supports rule-based autoscaling. O processo de dimensionamento leva pelo menos 20 minutos.The scaling process takes at least 20 minutes. Se o tráfego for intermitente, provisione para o tráfego intermitente máximo esperado.If your traffic is bursty, you should provision for the maximum burst traffic that you expect. No entanto, o dimensionamento automático é útil para lidar com variações por hora ou dia no tráfego.However, autoscaling is useful for handling hourly or daily variations in traffic. Para saber mais, confira Escalar automaticamente uma instância do Gerenciamento de API do Azure.For more information, see Automatically scale an Azure API Management instance.

Considerações de recuperação de desastresDisaster recovery considerations

A implantação exibida aqui reside em uma única região do Azure.The deployment shown here resides in a single Azure region. Para uma abordagem mais resiliente à recuperação de desastres, aproveite os recursos de distribuição geográfica de vários serviços:For a more resilient approach to disaster-recovery, take advantage of the geo-distribution features in the various services:

  • O Gerenciamento de API oferece suporte à implantação multirregião, que pode ser usada para distribuir uma única instância de Gerenciamento de API por qualquer quantidade 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 as solicitações HTTP para a região primária.Use Traffic Manager to route HTTP requests to the primary region. Se o Aplicativo de Funções nessa região ficar indisponível, o Gerenciador de Tráfego realizará o failover para a 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 de gravação, o que permite gravações em qualquer região que você adiciona à sua conta do cosmos DB.Cosmos DB supports multiple write regions, which enables writes to any region that you add to your Cosmos DB account. Se você não habilitar a gravação múltipla, ainda poderá fazer failover da região de gravação primária.If you don't enable multi-write, you can still fail over the primary write region. Os SDKs de cliente do Cosmos DB e as associações do Azure Functions tratam automaticamente do failover. Dessa forma, você não precisa atualizar as definições de configuração do aplicativo.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

A API GetStatus na implementação de referência usa o Azure AD para autenticar solicitações.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.

Nessa arquitetura, o aplicativo cliente é um aplicativo de página única (SPA) executado no navegador.In this architecture, the client application is a single-page application (SPA) that runs in the browser. Esse tipo de aplicativo cliente não consegue ocultar o segredo de um cliente ou um código de autorização, por isso 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. (Confira Qual fluxo de OAuth 2.0 devo usar?).(See Which OAuth 2.0 flow should I use?). Veja o fluxo geral:Here's the overall flow:

  1. O usuário clica no link "Entrar" no aplicativo Web.The user clicks the "Sign in" link in the web application.
  2. O navegador é redirecionado para a página de entrada do Azure AD.The browser is redirected the Azure AD sign in page.
  3. O usuário entra.The user signs in.
  4. O Azure AD redireciona de volta para o aplicativo 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. A ID do aplicativo é enviada como a declaração "aud" (público) no token de acesso.The application ID is sent as the audience ('aud') claim in the access token.
  6. A API de back-end valida o token de acesso.The back-end API validates the access token.

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

  • Registre um aplicativo no locatário do Azure AD.Register an application in your Azure AD tenant. Isso gera uma ID de aplicativo, que é incluída pelo cliente com a URL de logon.This generates an application ID, which the client includes with the login URL.

  • Habilite a autenticação do Azure AD dentro do Aplicativo de Funções.Enable Azure AD authentication inside the Function App. Para saber mais, confira Autenticação e autorização no Serviço de Aplicativo do Azure.For more information, see Authentication and authorization in Azure App Service.

  • Adicione validate-jwt policy ao Gerenciamento de API para pré-autorizar a solicitação validando o token de acesso.Add the validate-jwt policy to API Management to pre-authorize the request by validating the access token.

Para saber mais, confira o Leiame do GitHub.For more details, see the GitHub readme.

É recomendável criar registros de aplicativo separados no Azure AD para o aplicativo cliente e a 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 permissão ao aplicativo cliente para chamar a API.Grant the client application permission to call the API. Essa abordagem lhe dá a flexibilidade para definir várias APIs e clientes e controlar as permissões de cada um.This approach gives you the flexibility to define multiple APIs and clients and control the permissions for each.

Na 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, uma API pode ter os escopos Read e Write, e um aplicativo cliente específico pode solicitar que o usuário autorize apenas as permissões 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.

AutorizaçãoAuthorization

Em muitos aplicativos, a API de back-end deve verificar se um usuário tem permissão para executar uma determinada ação.In many applications, the back-end API must check whether a user has permission to perform a given action. Recomendamos o uso da autorização baseada em declarações, nas quais 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 uma roles 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

Nessa arquitetura de referência, o aplicativo Web e a API não compartilham 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, essa solicitação ocorre entre origens.That means when the application calls the API, it is a cross-origin request. A segurança do navegador impede que uma página da Web envie solicitações do AJAX para outro domínio.Browser security prevents a web page from making AJAX requests to another domain. Essa restrição é chamada de política de mesma origem e impede que um site mal-intencionado 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 CORS (Compartilhamento de recursos entre origens) para o 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 atributo allow-credentials é true.In this example, the allow-credentials attribute is true. Isso autoriza o navegador a enviar credenciais (incluindo cookies) com a solicitação.This authorizes the browser to send credentials (including cookies) with the request. Caso contrário, o navegador envia, por padrão, as credenciais com uma solicitação entre origens.Otherwise, by default the browser does not send credentials with a cross-origin request.

Observação

Tenha muito cuidado ao configurar allow-credentials como true, pois isso significa que um site pode enviar as credenciais do usuário para sua API em nome do usuário, sem que o usuário fique ciente.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. Você deve confiar na origem permitida.You must trust the allowed origin.

Impor o HTTPSEnforce HTTPS

Para obter o máximo de segurança, exija HTTPS em todo o pipeline de solicitações:For maximum security, require HTTPS throughout the request pipeline:

  • CDN.CDN. A CDN do Azure oferece suporte a HTTPS em um subdomínio *.azureedge.net por padrão.Azure CDN supports HTTPS on the *.azureedge.net subdomain by default. Para habilitar HTTPS na CDN para nomes de domínio personalizados, confira Tutorial: Configurar o HTTPS em um domínio personalizado de CDN do Azure.To enable HTTPS in the CDN for custom domain names, see Tutorial: Configure HTTPS on an Azure CDN custom domain.

  • Hospedagem de sites estáticos.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 essa opção estiver habilitada, a conta de armazenamento permitirá apenas solicitações de conexões HTTPS seguras.When this option is enabled, the storage account only allows requests from secure HTTPS connections.

  • Gerenciamento de API.API Management. Configure as APIs para usar somente o protocolo HTTPS.Configure the APIs to use HTTPS protocol only. Configure isso no portal do Azure ou usando o 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" ]
        },
        ...
    }
    
  • Azure Functions.Azure Functions. Habilite a configuração "Somente HTTPS".Enable the "HTTPS Only" setting.

Bloquear o aplicativo de funçõesLock down the function app

Todas as chamadas para a função devem passar pelo gateway de API.All calls to the function should go through the API gateway. Faça isso da seguinte maneira:You can achieve this as follows:

  • Configure o aplicativo de funções para exigir uma chave de função.Configure the function app to require a function key. O gateway de Gerenciamento de API inclui a tecla de função quando ela chamar o aplicativo de funções.The API Management gateway will include the function key when it calls the function app. Isso impede que os clientes chamem a função diretamente, ignorando o gateway.This prevents clients from calling the function directly, bypassing the gateway.

  • O gateway do Gerenciamento de API tem um endereço IP estático.The API Management gateway has a static IP address. Restrinja o Azure Functions 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 Restrições de IP estático do Serviço de Aplicativo do Azure.For more information, see Azure App Service Static IP Restrictions. (Esse recurso está disponível apenas para serviços do tipo Standard.)(This feature is available for Standard tier services only.)

Proteger segredos do aplicativoProtect application secrets

Não armazene segredos do aplicativo, como credenciais de banco de dados, nos arquivos de configuração ou código.Don't store application secrets, such as database credentials, in your code or configuration files. Em vez disso, use as Configurações do Aplicativo, que estão armazenadas criptografadas no Azure.Instead, use App settings, which are stored encrypted in Azure. Para saber mais, confira Segurança no Serviço de Aplicativo do Azure e no Azure Functions.For more information, see Security in Azure App Service and Azure Functions.

Como alternativa, armazene segredos do aplicativo no Key Vault.Alternatively, you can store application secrets in Key Vault. Isso permite que você centralize o armazenamento de segredos, controle sua distribuição e monitore como e quando os segredos são acessados.This allows you to centralize the storage of secrets, control their distribution, and monitor how and when secrets are being accessed. Para saber mais, confira Configurar um aplicativo Web do Azure para ler um segredo do Key Vault.For more information, see Configure an Azure web application to read a secret from Key Vault. No entanto, observe que os gatilhos e associações do Functions carregam suas definições de configuração das configurações do aplicativo.However, note that Functions triggers and bindings load their configuration settings from app settings. Não há modos internos para configurar os gatilhos e associações para usar 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

Implantação de front-endFront-end deployment

O front-end dessa arquitetura de referência é um aplicativo de página única, com JavaScript acessando as APIs de back-end sem servidor e conteúdo estático, fornecendo uma experiência de usuário 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. A seguir estão algumas considerações importantes para tal aplicativo:The following are some important considerations for such an application:

  • Implante o aplicativo uniformemente para os usuários por uma ampla área geográfica com uma CDN pronta para o mundo, com o conteúdo estático hospedado na nuvem.Deploy the application uniformly to users over a wide geographical area with a global-ready CDN, with the static content hosted on the cloud. Isso evita a necessidade de um servidor Web dedicado.This avoids the need for a dedicated web server. Leia integrar uma conta de armazenamento do Azure com a CDN do Azure para começar.Read Integrate an Azure storage account with Azure CDN to get started. Proteja seu aplicativo com https.Secure your application with HTTPS. Leia as práticas recomendadas para usar redes de distribuição de conteúdo para obter recomendações adicionais.Read the Best practices for using content delivery networks for additional recommendations.
  • Use um serviço de CI/CD confiável e rápido, como o Azure pipelines, para compilar e implantar automaticamente todas as alterações de origem.Use a fast and reliable CI/CD service such as Azure Pipelines, to automatically build and deploy every source change. A origem deve residir em um sistema de controle de versão online.The source must reside in an online version control system. Para obter mais detalhes, leia criar seu primeiro pipeline.For more details, read Create your first pipeline.
  • Compacte seus arquivos de site para reduzir o consumo de largura de banda na CDN e melhorar o desempenho.Compress your website files to reduce the bandwidth consumption on the CDN and improve performance. A CDN do Azure permite a compactação em tempo real nos servidores de borda.Azure CDN allows compression on the fly on the edge servers. Como alternativa, o pipeline de implantação nessa arquitetura de referência compacta os arquivos antes de implantá-los no armazenamento de BLOBs.Alternatively, the deploy pipeline in this reference architecture compresses the files before deploying them to the Blob storage. Isso reduz o requisito de armazenamento e lhe dá mais liberdade para escolher as ferramentas de compactação, independentemente das limitações da CDN.This reduces the storage requirement, and gives you more freedom to choose the compression tools, regardless of any CDN limitations.
  • A CDN deve ser capaz de limpar seu cache para garantir que todos os usuários sejam atendidos ao conteúdo mais recente.The CDN should be able to purge its cache to ensure all users are served the freshest content. Uma limpeza de cache é necessária se os processos de compilação e implantação não forem atômicos, por exemplo, se eles substituirem os arquivos antigos por aqueles recém-criados na mesma pasta de origem.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.
  • Uma estratégia de cache diferente, como o controle de versão usando diretórios, pode não exigir uma limpeza da CDN.A different cache strategy such as versioning using directories, may not require a purge by the CDN. O pipeline de Build nesse aplicativo de front-end cria um novo diretório para cada versão criada recentemente.The build pipeline in this front-end application creates a new directory for each newly built version. Esta versão é carregada como uma unidade atômica para o armazenamento de BLOBs.This version is uploaded as an atomic unit to the Blob storage. A CDN do Azure aponta para essa nova versão somente após uma implantação concluída.The Azure CDN points to this new version only after a completed deployment.
  • Aumente a TTL do cache armazenando em cache os arquivos de recurso por uma duração maior, abrangendo meses.Increase the cache TTL by caching resource files for a longer duration, spanning months. Para garantir que os arquivos armazenados em cache sejam atualizados quando eles forem alterados, faça a impressão digital dos nomes de arquivo quando eles forem recriados.To make sure the cached files are updated when they do change, fingerprint the filenames when they are rebuilt. Esse aplicativo front-end digitalizou todos os arquivos, exceto arquivos voltados para o público, como index.html.This front-end application fingerprints all files except for public-facing files such as index.html. Como o index.html é atualizado com frequência, ele reflete os nomes de filealterados que causam uma atualização do cache.Since the index.html is updated frequently, it reflects the changed filenames causing a cache refresh. Consulte a de gerenciar a expiração do conteúdo da Web na CDN do Azure para obter mais informações.See the Manage expiration of web content in Azure CDN for more information.

Implantação de back-endBack-end deployment

Para implantar o aplicativo de funções, é recomendável usar arquivos de pacote (“Execução a partir do pacote”).To deploy the function app, we recommend using package files ("Run from package"). Usando essa abordagem, você carrega um arquivo zip em um contêiner de Armazenamento de Blobs e o runtime das Funções monta o arquivo zip como um sistema de arquivos somente 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. Essa é uma operação atômica, o que reduz a chance de uma implantação com falhas deixar o aplicativo em um 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 é possível melhorar os tempos de inicialização a frio, especialmente para aplicativos Node.js, já que todos os arquivos são trocados ao mesmo tempo.It can also improve cold start times, especially for Node.js apps, because all of the files are swapped at once.

Controle de versão de APIAPI versioning

Uma API é um contrato entre um serviço e os clientes.An API is a contract between a service and clients. Nessa arquitetura, o contrato de API é definido na camada de Gerenciamento 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:

  • As versões permitem que os consumidores escolham uma versão de API com base nas necessidades, como v1 vs. 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 façam alterações sem interrupções em uma API e implantem essas alterações, juntamente com um log de alterações para informar aos consumidores da API 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 você fizer uma alteração significativa em uma API, publique uma nova versão no Gerenciamento de API.If you make a breaking change in an API, publish a new version in API Management. Implante a nova versão lado a lado da versão original em um Aplicativo de funções separado.Deploy the new version side-by-side with the original version, in a separate Function App. Isso permite que você migre clientes existentes para a nova API sem invalidar os aplicativos cliente.This lets you migrate existing clients to the new API without breaking client applications. Por fim, substitua 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 de URL, cabeçalho HTTP ou a cadeia 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, confira Controle de versão de uma API da Web RESTful.For more information about API versioning in general, see Versioning a RESTful web API.

Para atualizações que não são alterações da falha na API, implante a nova versão em um slot de preparo no mesmo Aplicativo de funções.For updates that are not breaking API changes, deploy the new version to a staging slot in the same Function App. Verifique se a implantação foi bem-sucedida e, em seguida, troque a versão de preparo pela versão de produção.Verify the deployment succeeded and then swap the staged version with the production version. Publique uma revisão no Gerenciamento de API.Publish a revision in API Management.

Considerações de custoCost considerations

Use a Calculadora de Preços do Azure para estimar os custos.Use the Azure pricing calculator to estimate costs. Considere esses pontos para otimizar o custo dessa arquitetura.Consider these points to optimize cost of this architecture.

Funções do AzureAzure Functions

O Azure Functions dá suporte a dois modelos de hospedagem.Azure Functions supports two hosting models.

  • Plano de consumo.Consumption plan.

    A potência de computação é alocada automaticamente quando o código está em execução.Compute power is automatically allocated when your code is running.

  • Plano do serviço de aplicativo .App Service plan.

    Um conjunto de VMs é alocado para seu código.A set of VMs are allocated for your code. Esse plano define o número de VMs e o tamanho da VM.This plan defines the number of VMs and the VM size.

Nessa arquitetura, uma função é invocada quando um cliente faz uma solicitação HTTP.In this architecture, a function is invoked when a client makes an HTTP request. Como uma taxa de transferência de alto volume constante não é esperada nesse caso de uso, o plano de consumo é recomendado porque você paga apenas pelos recursos de computação 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 faturas para taxa de transferência provisionada e armazenamento consumido por hora.Azure Cosmos DB bills for provisioned throughput and consumed storage by hour. A taxa de transferência provisionada é expressa em unidades de solicitação por segundo (RU/s), que pode ser usada para operações de banco de dados típicas, como inserções, leituras.Provisioned throughput is expressed in Request Units per second (RU/s), which can be used for typical database operations, such as inserts, reads. O preço é baseado na capacidade em RU/s que você reserva.The price is based on the capacity in RU/s that you reserve.

O armazenamento é cobrado para cada GB usado para os dados armazenados e o índice.Storage is billed for each GB used for your stored data and index.

Consulte Cosmos DB modelo de preços para obter mais informações.See Cosmos DB pricing model for more information.

Nessa arquitetura, o aplicativo de funções busca documentos de Cosmos DB em resposta a solicitações HTTP GET do cliente.In this architecture, the function application fetches documents from Cosmos DB in response to HTTP GET requests from the client. O Cosmos DB é econômico nesse caso porque as operações de leitura são significativamente mais baratas do que as operações de gravação expressas em RU/s.Cosmos DB is cost effective in this case because reading operations are significantly cheaper than write operations expressed on RU/s.

Rede de Distribuição de ConteúdoContent Delivery Network

A taxa de cobrança pode ser diferente dependendo da região de cobrança com base no local do servidor de origem que fornece o conteúdo para o usuário 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. O local físico do cliente não é a região de cobrança.The physical location of the client is not the billing region. Qualquer solicitação HTTP ou HTTPS que atinge a CDN é um evento Faturável, que inclui todos os tipos de resposta: êxito, falha ou outro.Any HTTP or HTTPS request that hits the CDN is a billable event, which includes all response types: success, failure, or other. Respostas diferentes podem gerar diferentes quantidades de tráfego.Different responses may generate different traffic amounts.

Nessa arquitetura de referência, a implantação reside em uma única região do Azure.In this reference architecture the deployment resides in a single Azure region.

Para reduzir os custos, considere aumentar a TTL do cache armazenando arquivos de recurso em cache por uma duração maior e Configurando o TTL mais longo possível em seu conteúdo.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 obter mais informações, consulte a seção de custo em Microsoft Azure Well-Architected Framework.For more information, see the Cost section in Microsoft Azure Well-Architected Framework.

Implantar 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.

Próximas etapasNext steps

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

Diretrizes relacionadas:Related guidance: