Considerações de armazenamento do Azure Functions

O Azure Functions requer uma conta de armazenamento do Azure quando você cria uma instância de aplicativo de funções. Os seguintes serviços de armazenamento podem ser usados pelo aplicativo de funções:

Serviço de armazenamento Uso de funções
Armazenamento de Blobs do Azure Mantenha o estado de associações e as chaves de função 1.
Usado por padrão pelos hubs de tarefas no Durable Functions.
Pode ser usado para armazenar o código do aplicativo de funções para o build remoto de Consumo em Linux ou como parte de implantações de URL do pacote externo.
Arquivos do Azure2 Compartilhamento de arquivos usado para armazenar e executar o código do aplicativo de funções em um Plano de consumo e Plano Premium.
Armazenamento de Filas do Azure Usado por padrão pelos hubs de tarefas no Durable Functions. Usado para tratamento de falha e repetição em gatilhos específicos do Azure Functions. Usado para rastreamento de objetos pelo gatilho de armazenamento de blobs.
Armazenamento de Tabelas do Azure Usado por padrão pelos hubs de tarefas no Durable Functions.

1 O Armazenamento de Blobs é o repositório padrão para chaves de função, mas você pode configurar um repositório alternativo.

2Arquivos do Azure são configurados por padrão, mas você pode criar um aplicativo sem Arquivos do Azure, sob determinadas condições.

Considerações importantes

Você deve considerar seriamente os seguintes fatos sobre as contas de armazenamento usadas por seus aplicativos de funções:

  • Quando o aplicativo de funções é hospedado no plano de Consumo ou no plano Premium, o código de função e os arquivos de configuração são armazenados em Arquivos do Azure na conta de armazenamento vinculada. Ao excluir essa conta de armazenamento, o conteúdo será excluído e não poderá ser recuperado. Para obter mais informações, confira A conta de armazenamento foi excluída

  • Dados importantes, como código de função, chaves de acesso e outros dados importantes relacionados ao serviço, podem ser mantidos na conta de armazenamento. Você deve gerenciar cuidadosamente o acesso às contas de armazenamento usadas pelos aplicativos de funções das seguintes maneiras:

    • Audite e limite o acesso de aplicativos e usuários à conta de armazenamento com base em um modelo de privilégios mínimos. As permissões para a conta de armazenamento podem vir de ações de dados na função atribuída ou por meio da permissão para executar a operação listKeys.

    • Monitore a atividade do painel de controle (como recuperar chaves) e as operações do plano de dados (como gravar em um blob) na conta de armazenamento. Considere manter logs de armazenamento em um local diferente do Armazenamento do Microsoft Azure. Para saber mais, confira Logs de armazenamento.

Requisitos da conta de armazenamento

As contas de armazenamento criadas como parte do fluxo de criação do aplicativo de funções no portal do Azure têm a garantia de funcionar com o novo aplicativo de funções. Quando você opta por usar uma conta de armazenamento existente, a lista fornecida não inclui determinadas contas de armazenamento sem suporte. As seguintes restrições se aplicam às contas de armazenamento usadas pelo aplicativo de funções, portanto, você deve garantir que uma conta de armazenamento existente atenda a estes requisitos:

  • O tipo de conta deve dar suporte ao armazenamento de Blob, Fila e Tabela. Algumas contas de armazenamento não oferecem suporte a filas e tabelas. Essas contas incluem contas de armazenamento somente blob e Armazenamento Premium do Azure. Para saber mais sobre os tipos de contas de armazenamento, confira Visão geral da conta de Armazenamento.

  • Você não pode usar uma conta de armazenamento já protegida usando um firewall ou uma rede virtual privada ao criar seu aplicativo de funções no portal do Azure. No entanto, o portal atualmente não filtra essas contas de armazenamento protegidas. Para saber como usar uma conta de armazenamento protegida com seu aplicativo de funções, confira Como usar uma conta de armazenamento protegida com o Azure Functions.

  • Não é possível usar contas de armazenamento protegidas com aplicativos de funções hospedados no plano Consumo.

  • Ao criar seu aplicativo de funções no portal, você só tem permissão para escolher uma conta de armazenamento existente na mesma região que o aplicativo de funções que você está criando. Essa é uma otimização de desempenho e não uma limitação estrita. Para saber mais, veja Local da conta de armazenamento.

  • Ao criar seu aplicativo de funções em um plano com suporte de zona de disponibilidade habilitado, apenas as contas de armazenamento redundância de zona são suportadas.

Você pode criar aplicativos de funções em um plano Elastic Premium ou Dedicado (Serviço de Aplicativo) usando a automação da implantação. No entanto, você deve incluir configurações de rede específicas no modelo do ARM ou no arquivo Bicep. Quando você não inclui essas configurações e recursos, sua implantação automatizada pode falhar na validação. Para obter mais informações, veja Implantações protegidas.

Orientações sobre a Conta de armazenamento

Cada aplicativo de funções exige uma conta de armazenamento para ser operado. Quando essa conta for excluída, o aplicativo de funções não será executado. Para solucionar problemas relacionados ao armazenamento, consulte Como solucionar problemas relacionados ao armazenamento. As outras considerações a seguir se aplicam à Conta de armazenamento usada pelos aplicativos de funções.

Local da conta de armazenamento

Para obter o melhor desempenho, o aplicativo de funções deve usar uma conta de armazenamento na mesma região, o que reduz a latência. O portal do Azure impõe essa prática recomendada. Se, por algum motivo, você precisar usar uma conta de armazenamento em uma região diferente do aplicativo de funções, deverá criar o aplicativo de funções fora do portal.

A conta de armazenamento precisa estar acessível para o aplicativo de funções. Se você precisar usar uma conta de armazenamento protegida, considere restringir a conta de armazenamento a uma rede virtual.

Configuração da conta de armazenamento

Por padrão, os aplicativos de funções configuram a conexão AzureWebJobsStorage como uma cadeia de conexão armazenada na configuração de aplicativo AzureWebJobsStorage, mas você também pode configurar AzureWebJobsStorage para usar uma conexão baseada em identidade sem um segredo.

Aplicativos de funções em execução em um plano de Consumo (somente Windows) ou em um plano Elastic Premium (Windows ou Linux) podem usar os Arquivos do Azure para armazenar as imagens necessárias para habilitar o dimensionamento dinâmico. Para esses planos, defina a cadeia de conexão para a conta de armazenamento na configuração WEBSITE_CONTENTAZUREFILECONNECTIONSTRING e o nome do compartilhamento de arquivos na configuração WEBSITE_CONTENTSHARE. Geralmente, essa é a mesma conta usada para AzureWebJobsStorage. Você também pode criar um aplicativo de funções que não usa os Arquivos do Azure, mas a colocação em escala pode ser limitada.

Observação

Uma cadeia de conexão da conta de armazenamento deverão ser atualizadas se você regenerar as chaves de armazenamento. Leia mais sobre o gerenciamento de chaves de armazenamento aqui.

Contas de armazenamento compartilhadas

É possível que vários aplicativos de funções compartilhem a mesma conta de armazenamento sem nenhum problema. Por exemplo, no Visual Studio, você pode desenvolver vários aplicativos usando o emulador de armazenamento do Azure. Nesse caso, o emulador age como uma única conta de armazenamento. A mesma conta de armazenamento usada pelo aplicativo de funções também pode ser usada para armazenar os dados do aplicativo. No entanto, essa abordagem nem sempre é uma boa ideia em um ambiente de produção.

Talvez seja necessário usar contas de armazenamento separadas para evitar colisões de ID do host.

Considerações sobre políticas de gerenciamento de ciclo de vida

Você não deve aplicar políticas de gerenciamento do ciclo de vida à sua conta de Armazenamento de Blobs usada pelo aplicativo de funções. O Functions usa o Armazenamento de Blobs para manter informações importantes, como chaves de acesso de função, e as políticas podem remover blobs (como chaves) necessários para o host do Functions. Se você deve usar políticas, exclua os contêineres usados pelo Functions, que possuem o prefixo azure-webjobs ou scm.

Logs de armazenamento

Como o código de função e as chaves podem ser persistentes na conta de armazenamento, o registro em log de atividades na conta de armazenamento é uma boa maneira de monitorar o acesso não autorizado. Os logs de recursos do Azure Monitor podem ser usados para acompanhar eventos no plano de dados de armazenamento. Consulte Monitoramento do Armazenamento do Microsoft Azure para obter detalhes sobre como configurar e examinar esses logs.

O log de atividades do Azure Monitor mostra eventos do painel de controle, incluindo a operação listKeys. No entanto, você também deve configurar logs de recursos para a conta de armazenamento para acompanhar o uso subsequente de chaves ou outras operações de plano de dados baseadas em identidade. Você deve ter pelo menos a categoria de log StorageWrite habilitada para identificar modificações nos dados fora das operações normais do Functions.

Para limitar o impacto potencial de quaisquer permissões de armazenamento com escopo amplo, considere usar um destino que não seja de armazenamento para esses logs, como a Análise de Logs. Para obter mais informações, confira Como monitorar o Armazenamento de Blobs do Azure.

Otimizar o desempenho de armazenamento

Use uma conta de armazenamento separada para cada aplicativo de funções para maximizar o desempenho. Isso será especialmente importante ao disparar as funções do Durable Functions ou do Hub de Eventos, que geram um alto volume de transações de armazenamento. Quando a lógica de aplicativo interagir com o Armazenamento do Azure, de modo direto (usando o SDK de Armazenamento) ou por meio de uma das associações de armazenamento, você deverá usar uma conta de armazenamento dedicada. Por exemplo, caso uma função disparada pelo Hub de Eventos esteja gravando dados no armazenamento de blobs, use duas contas de armazenamento – uma para o aplicativo de funções e outra para os blobs que estão sendo armazenados pela função.

Trabalhando com blobs

Um cenário-chave para o Functions é o processamento de arquivos em um contêiner de blob, como para processamento de imagem ou análise de sentimento. Para saber mais, confira Processar uploads de arquivos.

Gatilho em um contêiner de blob

Há várias maneiras de executar o código de função com base em alterações em blobs em um contêiner de armazenamento. Use a seguinte tabela para determinar qual gatilho de função é melhor para suas necessidades:

Consideração Armazenamento de blobs (sondagem) Armazenamento de blobs (baseado em eventos) Armazenamento de filas Grade de Eventos
Latency Alta (até dez minutos) Baixo Médio Baixo
Limitações da conta de armazenamento Contas somente blob sem suporte¹ uso geral v1 sem suporte nenhum uso geral v1 sem suporte
Versão da extensão Qualquer Armazenamento v5.x+ Qualquer Qualquer
Processa blobs existentes Sim Não No No
Filtros Padrão de nome do blob Filtros de evento n/d Filtros de evento
Requer assinatura de evento No Sim Não Sim
Dá suporte a alta escala² Não Sim Sim Sim
Descrição Comportamento de gatilho padrão, que depende da sondagem do contêiner em busca de atualizações. Para obter mais informações, confira os exemplos na Referência de gatilho de armazenamento de blobs. Consome eventos de armazenamento de blobs de uma assinatura de evento. Requer um valor de parâmetro Source igual a EventGrid. Para obter mais informações, confira Tutorial: disparar o Azure Functions em contêineres de blob usando uma assinatura de evento. A cadeia de caracteres de nome de blob é adicionada manualmente a uma fila de armazenamento quando um blob é adicionado ao contêiner. Esse valor é passado diretamente por um gatilho de armazenamento de filas para uma ligação de entrada de armazenamento de blobs na mesma função. Fornece a flexibilidade de disparar em eventos além daqueles provenientes de um contêiner de armazenamento. Use quando necessário para que eventos que não sejam de armazenamento também disparem a função. Para obter mais informações, confira Como trabalhar com gatilhos e associações da Grade de Eventos no Azure Functions.

1 As ligações de entrada e saída do armazenamento de blobs dão suporte a contas somente de blob.
2 A alta escala pode ser definida vagamente como contêineres que possuem mais de 100.000 blobs ou contas de armazenamento que têm mais de 100 atualizações de blobs por segundo.

Criptografia do armazenamento de dados

O Armazenamento do Azure criptografa todos os dados em uma conta de armazenamento em repouso. Para obter mais informações, consulte Criptografia do Armazenamento do Azure para dados em repouso.

Por padrão, os dados são criptografados com chaves gerenciadas pela Microsoft. Para obter controle adicional sobre as chaves de criptografia, você pode fornecer chaves gerenciadas pelo cliente para usar para criptografia de dados de blob e arquivo. Essas chaves devem estar presentes no Azure Key Vault para que o Functions possa acessar a conta de armazenamento. Para saber mais, confira Criptografia em repouso usando chaves gerenciadas pelo cliente.

Residência de dados na região

Quando todos os dados do cliente devem permanecer em uma única região, a conta de armazenamento associada ao aplicativo de funções deve ser uma com redundância na região. Uma conta de armazenamento redundante na região também deve ser usada com o Azure Durable Functions.

Outros dados do cliente gerenciados pela plataforma são armazenados apenas dentro da região ao hospedar em um ASE (Ambiente do Serviço de Aplicativo) com balanceamento de carga internamente. Para saber mais, veja Redundância de zona do ASE.

Considerações sobre a ID do host

O Functions usa um valor de ID do host como uma maneira de identificar exclusivamente um aplicativo de funções específico em artefatos armazenados. Por padrão, essa ID é gerada automaticamente a partir do nome do aplicativo de funções, truncada para os primeiros 32 caracteres. Essa ID é usada ao armazenar informações de correlação por aplicativo e acompanhamento na conta de armazenamento vinculada. Quando você tem aplicativos de funções com nomes com mais de 32 caracteres e quando os primeiros 32 caracteres são idênticos, esse truncamento pode resultar em valores duplicados de ID do host. Quando dois aplicativos de funções com IDs de host idênticas usam a mesma conta de armazenamento, você obtém uma colisão de ID de host porque os dados armazenados não podem ser vinculados exclusivamente ao aplicativo de funções correto.

Observação

Esse tipo de colisão de ID de host pode ocorrer entre um aplicativo de funções em um slot de produção e o mesmo aplicativo de funções em um slot de preparo, quando ambos os slots usam a mesma conta de armazenamento.

A partir da versão 3.x do runtime do Functions, a colisão da ID do host é detectada e um aviso é registrado. Na versão 4.x, um erro é registrado e o host é interrompido, resultando em uma falha dura. Mais detalhes sobre a colisão da ID do host podem ser encontrados neste problema.

Evitando colisões de ID do host

Você pode usar as seguintes estratégias para evitar colisões de ID do host:

  • Use uma conta de armazenamento separada para cada aplicativo de funções ou slot envolvido na colisão.
  • Renomeie um dos aplicativos de funções para um valor menor que 32 caracteres de comprimento, o que altera a ID do host computado para o aplicativo e remove a colisão.
  • Defina uma ID de host explícita para um ou mais dos aplicativos em colisão. Para saber mais, consulte a substituição da ID do host.

Importante

Alterar a conta de armazenamento associada a um aplicativo de funções existente ou alterar a ID do host do aplicativo pode afetar o comportamento das funções existentes. Por exemplo, um gatilho de armazenamento de Blobs rastreia se são processados blobs individuais gravando recibos em um caminho de ID de host específico no armazenamento. Quando a ID do host é alterada ou você aponta para uma nova conta de armazenamento, os blobs processados anteriormente podem ser reprocessados.

Substituir a ID do host

Você pode definir explicitamente uma ID de host específica para o aplicativo de funções nas configurações do aplicativo usando a configuração AzureFunctionsWebHost__hostid. Para obter mais informações, consulte AzureFunctionsWebHost__hostid.

Quando a colisão ocorre entre slots, você deve definir uma ID de host específica para cada slot, incluindo o slot de produção. Você também deve marcar essas configurações como configurações de implantação para que elas não sejam trocadas. Para saber como criar configurações de aplicativo, consulte Trabalhar com as configurações do aplicativo.

Clusters habilitados para Azure Arc

Quando seu aplicativo de funções é implantado em um cluster do Kubernetes habilitado para Azure Arc, uma conta de armazenamento pode não ser exigida pelo aplicativo de funções. Nesse caso, uma conta de armazenamento só é exigida pelo Functions quando seu aplicativo de funções usa um gatilho que requer armazenamento. A tabela a seguir indica quais gatilhos podem exigir uma conta de armazenamento e quais não.

Não é necessária pode exigir armazenamento
Azure Cosmos DB
HTTP
Kafka
RabbitMQ
Barramento de Serviço
SQL do Azure
Armazenamento de blobs
Grade de Eventos
Hubs de Evento
Hub IoT
Armazenamento de Filas
SendGrid
SignalR
Armazenamento de tabelas
Timer
Twilio

Para criar um aplicativo de funções em um cluster do Kubernetes habilitado para Azure Arc sem armazenamento, você deve usar o comando az functionapp create da CLI do Azure. A versão da CLI do Azure deve incluir a versão 0.1.7 ou uma versão posterior da extensão appservice-kube. Use o comando az --version para verificar se a extensão está instalada e se é a versão correta.

Criar recursos do aplicativo de funções usando métodos diferentes da CLI do Azure requer uma conta de armazenamento existente. Se você planeja usar os gatilhos que exigem uma conta de armazenamento, deve criar a conta antes de criar o aplicativo de funções.

Criar um aplicativo sem Arquivos do Azure

Os Arquivos do Azure são configurados, por padrão, em planos Elastic Premium e em planos de Consumo que não sejam em Linux, para servir como um sistema de arquivos compartilhado em cenários de alta escala. O sistema de arquivos é usado pela plataforma para alguns recursos, como streaming de log, mas garante, principalmente, a consistência do conteúdo da função implantada. Quando um aplicativo é implantado usando uma URL de pacote externo, o conteúdo do aplicativo é servido de um sistema de arquivos somente leitura separado. Isso significa que você pode criar o seu aplicativo de funções sem Arquivos do Azure. Se você criar seu aplicativo de funções com Arquivos do Azure, um sistema de arquivos gravável ainda será fornecido. No entanto, esse sistema de arquivos pode não estar disponível para todas as instâncias do aplicativo de funções.

Quando os Arquivos do Azure não forem usados, você deverá levar em conta os seguintes requisitos:

  • Você precisa implantar a partir de uma URL de pacote externo.
  • Seu aplicativo não pode depender de um sistema compartilhado de arquivos graváveis.
  • O aplicativo não pode usar a versão 1.x do runtime do Functions.
  • Experiências de streaming de log em clientes, como o portal do Azure de padrão para logs do sistema de arquivos. Em vez disso, você deve confiar em logs do Application Insights.

Se os dados acima forem devidamente contabilizados, você poderá criar o aplicativo sem os Arquivos do Azure. Crie o aplicativo de funções sem especificar as configurações dos aplicativos WEBSITE_CONTENTAZUREFILECONNECTIONSTRING e WEBSITE_CONTENTSHARE. Você pode evitar essas configurações gerando um modelo do ARM para uma implantação padrão, removendo essas duas configurações e, em seguida, implantando o modelo.

Como o Functions usa os Arquivos do Azure durante partes do processo de expansão dinâmica, o dimensionamento pode ser limitado ao ser executado sem os Arquivos do Azure nos planos de Consumo e Elastic Premium.

Montar compartilhamento de arquivos

Essa funcionalidade só estará disponível quando estiver em execução no Linux.

Você pode montar compartilhamentos de arquivos existentes do Azure para os aplicativos de funções do Linux. Ao montar um compartilhamento em seu aplicativo de funções do Linux, você pode usar os modelos de machine learning existentes ou outros dados em suas funções. Use o comando a seguir para montar um compartilhamento existente para o aplicativo de funções do Linux.

az webapp config storage-account add

Nesse comando, share-name é o nome do compartilhamento de arquivos do Azure existente e custom-id pode ser qualquer cadeia de caracteres que defina exclusivamente o compartilhamento quando montado no aplicativo de funções. Além disso, mount-path é o caminho do qual o compartilhamento é acessado no aplicativo de funções. mount-path deve estar no formato /dir-name e não pode começar com /home.

Para obter um exemplo completo, consulte os scripts em Criar um aplicativo de função Python e montar um compartilhamento de Arquivos do Azure.

No momento, apenas um storage-type de AzureFiles é compatível. Só é possível montar cinco compartilhamentos para um determinado aplicativo de funções. Montar um compartilhamento de arquivos pode aumentar o tempo de inicialização a frio em pelo menos 200 a 300 ms, ou ainda mais quando a conta de armazenamento estiver em uma região diferente.

O compartilhamento montado está disponível para o código de função no mount-path especificado. Por exemplo, quando mount-path é /path/to/mount, você pode acessar o diretório de destino por APIs do sistema de arquivos, como no exemplo de Python a seguir:

import os
...

files_in_share = os.listdir("/path/to/mount")

Próximas etapas

Saiba mais sobre as opções de hospedagem do Azure Functions.