Guia do programador das Funções do Azure

No Funções do Azure, as funções específicas partilham alguns dos principais conceitos técnicos e componentes, independentemente do idioma ou enlace que utilizar. Antes de começar a aprender detalhes específicos de um determinado idioma ou enlace, certifique-se de que lê esta descrição geral que se aplica a todas elas.

Este artigo pressupõe que já leu a descrição geral do Funções do Azure.

Código da função

Uma função é o conceito principal no Funções do Azure. Uma função contém duas peças importantes: o seu código, que pode ser escrito numa variedade de idiomas e alguma configuração, o ficheiro function.json. Para idiomas compilados, este ficheiro de configuração é gerado automaticamente a partir de anotações no seu código. Para os idiomas de scripting, tem de fornecer o ficheiro de configuração.

O ficheiro function.json define o acionador, enlaces e outras definições de configuração da função. Cada função tem um, e apenas um, acionador. O runtime utiliza este ficheiro de configuração para determinar os eventos a monitorizar e como transmitir dados para e devolver dados de uma execução de função. Segue-se um ficheiro function.json de exemplo.

{
    "disabled":false,
    "bindings":[
        // ... bindings here
        {
            "type": "bindingType",
            "direction": "in",
            "name": "myParamName",
            // ... more depending on binding
        }
    ]
}

Para obter mais informações, veja Funções do Azure conceitos de acionadores e enlaces.

A bindings propriedade é onde configura os acionadores e os enlaces. Cada enlace partilha algumas definições comuns e algumas definições específicas de um determinado tipo de enlace. Cada enlace requer as seguintes definições:

Propriedade Valores Tipo Comentários
tipo Nome do enlace.

Por exemplo, queueTrigger.
string
direção in, out string Indica se o enlace é para receber dados para a função ou para enviar dados da função.
name Identificador de função.

Por exemplo, myQueue.
string O nome que é utilizado para os dados vinculados na função. Para C#, este é um nome de argumento; para JavaScript, é a chave numa lista chave/valor.

Aplicação de funções

Uma aplicação de funções fornece um contexto de execução no Azure no qual as suas funções são executadas. Como tal, é a unidade de implementação e gestão das suas funções. Uma aplicação de funções é composta por uma ou mais funções individuais que são geridas, implementadas e dimensionadas em conjunto. Todas as funções numa aplicação de funções partilham o mesmo plano de preços, método de implementação e versão de runtime. Pense numa aplicação de funções como uma forma de organizar e gerir coletivamente as suas funções. Para saber mais, veja Como gerir uma aplicação de funções.

Nota

Todas as funções numa aplicação de funções têm de ser criadas no mesmo idioma. Nas versões anteriores do Funções do Azure runtime, tal não era necessário.

Estrutura de pastas

O código para todas as funções numa aplicação de funções específica está localizado numa pasta de projeto de raiz que contém um ficheiro de configuração de anfitrião. O ficheiro host.json contém configurações específicas do runtime e está na pasta raiz da aplicação de funções. Uma pasta bin contém pacotes e outros ficheiros de biblioteca que a aplicação de funções necessita. As estruturas de pastas específicas exigidas pela aplicação de funções dependem do idioma:

Na versão 2.x e superior do runtime das Funções, todas as funções na aplicação de funções têm de partilhar a mesma pilha de idiomas.

Acima encontra-se a estrutura de pastas predefinida (e recomendada) para uma aplicação de Funções. Se quiser alterar a localização do ficheiro do código de uma função, modifique a scriptFile secção do ficheiro function.json . Também recomendamos a utilização da implementação de pacotes para implementar o projeto na sua aplicação de funções no Azure. Também pode utilizar ferramentas existentes, como integração e implementação contínuas e o Azure DevOps.

Nota

Se implementar um pacote manualmente, certifique-se de que implementa as pastas de funções e ficheiro host.json diretamente na wwwroot pasta. Não inclua a wwwroot pasta nas suas implementações. Caso contrário, acaba com wwwroot\wwwroot pastas.

Utilizar ferramentas locais e publicar

As aplicações de funções podem ser criadas e publicadas com uma variedade de ferramentas, incluindo o Visual Studio, Visual Studio Code, IntelliJ, Eclipse e o Funções do Azure Core Tools. Para obter mais informações, veja Código e teste Funções do Azure localmente.

Como editar funções no portal do Azure

O editor de Funções incorporado no portal do Azure permite-lhe atualizar o código e o ficheiro function.json diretamente inline. Isto é recomendado apenas para pequenas alterações ou provas de conceito - a melhor prática é utilizar uma ferramenta de desenvolvimento local como o VS Code.

Execução paralela

Quando vários eventos de acionamento ocorrem mais rapidamente do que um runtime de função de thread único pode processá-los, o runtime pode invocar a função várias vezes em paralelo. Se uma aplicação de funções estiver a utilizar o plano de alojamento consumo, a aplicação de funções pode aumentar horizontalmente automaticamente. Cada instância da aplicação de funções, quer a aplicação seja executada no plano de alojamento consumo ou num plano de alojamento de Serviço de Aplicações regular, pode processar invocações de funções simultâneas em paralelo com vários threads. O número máximo de invocações de funções simultâneas em cada instância da aplicação de funções varia consoante o tipo de acionador que está a ser utilizado, bem como os recursos utilizados por outras funções na aplicação de funções.

Controlo de versões do runtime de funções

Pode configurar a versão do runtime das Funções com a definição da aplicação FUNCTIONS_EXTENSION_VERSION . Por exemplo, o valor "~3" indica que a sua aplicação de funções utilizará 3.x como a sua versão principal. As aplicações de funções são atualizadas para cada nova versão secundária à medida que são lançadas. Para obter mais informações, incluindo como ver a versão exata da sua aplicação de funções, veja Como direcionar Funções do Azure versões de runtime.

Repositórios

O código para Funções do Azure é open source e armazenado nos repositórios do GitHub:

Enlaces

Eis uma tabela de todos os enlaces suportados.

Esta tabela mostra os enlaces suportados nas versões principais do Funções do Azure runtime:

Tipo 1.x 2.x e superior1 Acionador Input Saída
Armazenamento de blobs
BD do Cosmos para o Azure
SQL do Azure (pré-visualização)2
Dapr3
Event Grid
Hubs de Eventos
Webhooks HTTP &
Hub IoT
Kafka2
Aplicações Móveis
Hubs de Notificação
Armazenamento de filas
RabbitMQ2
SendGrid
Service Bus
SignalR
Armazenamento de tabelas
Temporizador
Twilio

1 A partir do runtime da versão 2.x, todos os enlaces exceto HTTP e Temporizador têm de estar registados. Veja Registar extensões de enlace.

2 Os acionadores não são suportados no plano de Consumo. Requer acionadores orientados por runtime.

3 Suportado apenas no Kubernetes, IoT Edge e noutros modos autoalojados.

Está a ter problemas com erros provenientes dos enlaces? Reveja a documentação Funções do Azure Códigos de Erro de Enlace.

Ligações

O projeto de função referencia as informações de ligação por nome do respetivo fornecedor de configuração. Não aceita diretamente os detalhes da ligação, permitindo que sejam alterados entre ambientes. Por exemplo, uma definição de acionador pode incluir uma connection propriedade. Isto pode referir-se a uma cadeia de ligação, mas não pode definir a cadeia de ligação diretamente num function.json. Em vez disso, definiria connection para o nome de uma variável de ambiente que contém a cadeia de ligação.

O fornecedor de configuração predefinido utiliza variáveis de ambiente. Estas podem ser definidas pelas Definições da Aplicação quando são executadas no serviço Funções do Azure ou a partir do ficheiro de definições local ao programar localmente.

Valores de ligação

Quando o nome da ligação é resolvido para um único valor exato, o runtime identifica o valor como uma cadeia de ligação, que normalmente inclui um segredo. Os detalhes de uma cadeia de ligação são definidos pelo serviço ao qual pretende ligar.

No entanto, um nome de ligação também pode referir-se a uma coleção de vários itens de configuração, útil para configurar ligações baseadas em identidade. As variáveis de ambiente podem ser tratadas como uma coleção através de um prefixo partilhado que termina em carateres de sublinhado duplos __. Em seguida, o grupo pode ser referenciado ao definir o nome da ligação para este prefixo.

Por exemplo, a connection propriedade de uma definição de acionador de Blobs do Azure pode ser "Armazenamento1". Desde que não exista um único valor de cadeia configurado por uma variável de ambiente denominada "Storage1", pode ser utilizada uma variável de ambiente com o nome Storage1__blobServiceUri para informar a blobServiceUri propriedade da ligação. As propriedades de ligação são diferentes para cada serviço. Veja a documentação do componente que utiliza a ligação.

Nota

Ao utilizar Azure App Configuration ou Key Vault para fornecer definições para ligações de Identidade Gerida, os nomes das definições devem utilizar um separador de chave válido, como : ou / em vez do para garantir que os __ nomes são resolvidos corretamente.

Por exemplo, Storage1:blobServiceUri.

Configurar uma ligação baseada em identidade

Algumas ligações no Funções do Azure podem ser configuradas para utilizar uma identidade em vez de um segredo. O suporte depende da extensão que utiliza a ligação. Em alguns casos, uma cadeia de ligação ainda pode ser necessária nas Funções, mesmo que o serviço ao qual está a ligar suporte ligações baseadas em identidades. Para obter um tutorial sobre como configurar as suas aplicações de funções com identidades geridas, veja o tutorial para criar uma aplicação de funções com ligações baseadas em identidade.

As ligações baseadas em identidade são suportadas pelos seguintes componentes:

Origem de ligação Planos suportados Saber mais
Acionadores e enlaces de Blobs do Azure Todos Versão 5.0.0 ou posterior da extensão de Blobs do Azure
Pacote de extensão 3.3.0 ou posterior
Acionadores e enlaces de Filas do Azure Todos Extensão de Filas do Azure versão 5.0.0 ou posterior,
Pacote de extensão 3.3.0 ou posterior
Tabelas do Azure (ao utilizar o Armazenamento do Azure) Todos Versão 1.0.0 ou posterior da extensão de Tabelas do Azure
Pacote de extensão 3.3.0 ou posterior
Hubs de Eventos do Azure acionadores e enlaces Todos Hubs de Eventos do Azure versão 5.0.0 ou posterior da extensão,
Pacote de extensão 3.3.0 ou posterior
Azure Service Bus acionadores e enlaces Todos Azure Service Bus versão 5.0.0 ou posterior da extensão,
Pacote de extensão 3.3.0 ou posterior
Acionadores e enlaces do Azure Cosmos DB Todos Versão 4.0.0 ou posterior da extensão do Azure Cosmos DB,
Pacote de extensões 4.0.2 ou posterior
Acionadores e enlaces do Azure SignalR Todos Versão 1.7.0 ou posterior da extensão Azure SignalR
Pacote de extensões 3.6.1 ou posterior
Durable Functions fornecedor de armazenamento (Armazenamento do Azure) Todos Durable Functions versão 2.7.0 ou posterior da extensão,
Pacote de extensão 3.3.0 ou posterior
Armazenamento necessário para o anfitrião ("AzureWebJobsStorage") – Pré-visualização Todos Ligar ao armazenamento de anfitriões com uma identidade

Quando alojadas no serviço Funções do Azure, as ligações baseadas em identidade utilizam uma identidade gerida. A identidade atribuída pelo sistema é utilizada por predefinição, embora uma identidade atribuída pelo utilizador possa ser especificada com as credential propriedades e clientID . Tenha em atenção que a configuração de uma identidade atribuída pelo utilizador com um ID de recurso não é suportada. Quando executado noutros contextos, como o desenvolvimento local, a identidade do programador é utilizada, embora possa ser personalizada. Veja Desenvolvimento local com ligações baseadas em identidade.

Conceder permissão à identidade

Qualquer identidade que esteja a ser utilizada tem de ter permissões para efetuar as ações pretendidas. Para a maioria dos serviços do Azure, isto significa que tem de atribuir uma função no RBAC do Azure, utilizando funções incorporadas ou personalizadas que fornecem essas permissões.

Importante

Algumas permissões podem ser expostas pelo serviço de destino que não são necessárias para todos os contextos. Sempre que possível, adira ao princípio do menor privilégio, concedendo à identidade apenas privilégios necessários. Por exemplo, se a aplicação apenas precisar de ser capaz de ler a partir de uma origem de dados, utilize uma função que tenha apenas permissão para ler. Seria inadequado atribuir uma função que também permite escrever nesse serviço, uma vez que esta seria uma permissão excessiva para uma operação de leitura. Da mesma forma, deve garantir que a atribuição de função está confinada apenas aos recursos que precisam de ser lidos.

Selecione um separador abaixo para saber mais sobre as permissões para cada componente:

Terá de criar uma atribuição de função que forneça acesso ao contentor de blobs no runtime. As funções de gestão, como Proprietário , não são suficientes. A tabela seguinte mostra funções incorporadas que são recomendadas ao utilizar a extensão de Armazenamento de Blobs no funcionamento normal. A sua aplicação pode necessitar de permissões adicionais com base no código que escrever.

Tipo de enlace Funções incorporadas de exemplo
Acionador Proprietário de Dados do Blob de ArmazenamentoeContribuidor de Dados da Fila de Armazenamento1

Também têm de ser concedidas permissões adicionais à ligação AzureWebJobsStorage. 2
Enlace de entrada Leitor de Dados do Armazenamento de Blobs
Enlace de saída Proprietário dos Dados do Armazenamento de Blobs

1 O acionador de blobs processa a falha em várias repetições ao escrever blobs envenenados numa fila na conta de armazenamento especificada pela ligação.

2 A ligação AzureWebJobsStorage é utilizada internamente para blobs e filas que ativam o acionador. Se estiver configurada para utilizar uma ligação baseada em identidade, precisará de permissões adicionais para além do requisito predefinido. Estes são abrangidos pelas funções Proprietário de Dados de Blobs de Armazenamento, Contribuidor de Dados da Fila de Armazenamento e Contribuidor da Conta de Armazenamento . Para saber mais, veja Ligar ao armazenamento de anfitriões com uma identidade.

Propriedades comuns para ligações baseadas em identidades

Uma ligação baseada em identidade para um serviço do Azure aceita as seguintes propriedades comuns, em que <CONNECTION_NAME_PREFIX> é o valor da sua connection propriedade na definição de acionador ou enlace:

Propriedade Modelo de variável de ambiente Description
Credencial de Token <CONNECTION_NAME_PREFIX>__credential Define como um token deve ser obtido para a ligação. Recomendado apenas ao especificar uma identidade atribuída pelo utilizador, quando deve ser definida como "managedidentity". Isto só é válido quando alojado no serviço Funções do Azure.
ID de Cliente <CONNECTION_NAME_PREFIX>__clientId Quando credential está definida como "managedidentity", esta propriedade especifica a identidade atribuída pelo utilizador a ser utilizada ao obter um token. A propriedade aceita um ID de cliente correspondente a uma identidade atribuída pelo utilizador atribuída à aplicação. Se não for especificado, será utilizada a identidade atribuída pelo sistema. Esta propriedade é utilizada de forma diferente em cenários de desenvolvimento local, quando credential não deve ser definida.

Podem ser suportadas opções adicionais para um determinado tipo de ligação. Veja a documentação do componente que efetua a ligação.

Desenvolvimento local com ligações baseadas em identidade

Nota

O desenvolvimento local com ligações baseadas em identidade requer versões atualizadas do Funções do Azure Core Tools. Pode verificar a versão atualmente instalada ao executar func -v. Para Funções v3, utilize a versão ou versão 3.0.3904 posterior. Para Funções v4, utilize a versão ou versão 4.0.3904 posterior.

Ao executar localmente, a configuração acima indica ao runtime para utilizar a sua identidade de programador local. A ligação tentará obter um token a partir das seguintes localizações, por ordem:

  • Uma cache local partilhada entre aplicações microsoft
  • O contexto de utilizador atual no Visual Studio
  • O contexto de utilizador atual no Visual Studio Code
  • O contexto de utilizador atual na CLI do Azure

Se nenhuma destas opções for bem-sucedida, ocorrerá um erro.

A sua identidade pode já ter algumas atribuições de funções em relação aos recursos do Azure utilizados para o desenvolvimento, mas essas funções podem não fornecer o acesso de dados necessário. As funções de gestão como Proprietário não são suficientes. Verifique novamente as permissões necessárias para as ligações de cada componente e certifique-se de que as atribuiu a si próprio.

Em alguns casos, poderá querer especificar a utilização de uma identidade diferente. Pode adicionar propriedades de configuração para a ligação que apontam para a identidade alternativa com base num ID de cliente e no segredo do cliente para um principal de serviço do Azure Active Directory. Esta opção de configuração não é suportada quando alojada no serviço Funções do Azure. Para utilizar um ID e um segredo no seu computador local, defina a ligação com as seguintes propriedades adicionais:

Propriedade Modelo de variável de ambiente Description
ID do inquilino <CONNECTION_NAME_PREFIX>__tenantId O ID do inquilino do Azure Active Directory (diretório).
ID de Cliente <CONNECTION_NAME_PREFIX>__clientId O ID de cliente (aplicação) de um registo de aplicação no inquilino.
Segredo do cliente <CONNECTION_NAME_PREFIX>__clientSecret Um segredo do cliente que foi gerado para o registo da aplicação.

Eis um exemplo das local.settings.json propriedades necessárias para a ligação baseada em identidades aos Blobs do Azure:

{
  "IsEncrypted": false,
  "Values": {
    "<CONNECTION_NAME_PREFIX>__blobServiceUri": "<blobServiceUri>",
    "<CONNECTION_NAME_PREFIX>__queueServiceUri": "<queueServiceUri>",
    "<CONNECTION_NAME_PREFIX>__tenantId": "<tenantId>",
    "<CONNECTION_NAME_PREFIX>__clientId": "<clientId>",
    "<CONNECTION_NAME_PREFIX>__clientSecret": "<clientSecret>"
  }
}

Ligar ao armazenamento de anfitriões com uma identidade (Pré-visualização)

O anfitrião de Funções do Azure utiliza a ligação "AzureWebJobsStorage" para comportamentos fundamentais, tais como a coordenação da execução singleton de acionadores de temporizador e o armazenamento de chaves de aplicação predefinido. Isto também pode ser configurado para tirar partido de uma identidade.

Atenção

Outros componentes nas Funções dependem de "AzureWebJobsStorage" para comportamentos predefinidos. Não deve movê-la para uma ligação baseada em identidade se estiver a utilizar versões mais antigas de extensões que não suportam este tipo de ligação, incluindo acionadores e enlaces para Blobs do Azure, Hubs de Eventos e Durable Functions. Da mesma forma, AzureWebJobsStorage é utilizado para artefactos de implementação ao utilizar a compilação do lado do servidor no Consumo do Linux e, se o ativar, terá de implementar através de um pacote de implementação externo.

Além disso, algumas aplicações reutilizam "AzureWebJobsStorage" para outras ligações de armazenamento nos respetivos acionadores, enlaces e/ou código de função. Certifique-se de que todas as utilizações de "AzureWebJobsStorage" podem utilizar o formato de ligação baseado na identidade antes de alterar esta ligação a partir de uma cadeia de ligação.

Para utilizar uma ligação baseada em identidade para "AzureWebJobsStorage", configure as seguintes definições da aplicação:

Definições Descrição Valor de exemplo
AzureWebJobsStorage__blobServiceUri O URI do plano de dados do serviço de blobs da conta de armazenamento, utilizando o esquema HTTPS. <https:// storage_account_name.blob.core.windows.net>
AzureWebJobsStorage__queueServiceUri O URI do plano de dados do serviço de fila da conta de armazenamento, com o esquema HTTPS. <https:// storage_account_name.queue.core.windows.net>
AzureWebJobsStorage__tableServiceUri O URI do plano de dados de um serviço de tabela da conta de armazenamento, utilizando o esquema HTTPS. <https:// storage_account_name.table.core.windows.net>

Também podem ser definidas propriedades comuns para ligações baseadas em identidades.

Se estiver a configurar o "AzureWebJobsStorage" com uma conta de armazenamento que utiliza o sufixo DNS predefinido e o nome do serviço para o Azure global, seguindo o https://<accountName>.blob/queue/file/table.core.windows.net formato, pode, em vez disso, definir AzureWebJobsStorage__accountName para o nome da sua conta de armazenamento. Os pontos finais para cada serviço de armazenamento serão inferidos para esta conta. Isto não funcionará se a conta de armazenamento estiver numa nuvem soberana ou tiver um DNS personalizado.

Definições Descrição Valor de exemplo
AzureWebJobsStorage__accountName O nome da conta de uma conta de armazenamento, válido apenas se a conta não estiver numa cloud soberana e não tiver um DNS personalizado. Esta sintaxe é exclusiva de "AzureWebJobsStorage" e não pode ser utilizada para outras ligações baseadas em identidades. <storage_account_name>

Terá de criar uma atribuição de função que forneça acesso à conta de armazenamento para "AzureWebJobsStorage" no runtime. As funções de gestão como Proprietário não são suficientes. A função Proprietário de Dados de Blobs de Armazenamento abrange as necessidades básicas do armazenamento do anfitrião de Funções – o runtime precisa de acesso de leitura e escrita a blobs e a capacidade de criar contentores. Várias extensões utilizam esta ligação como uma localização predefinida para blobs, filas e tabelas, e estas utilizações podem adicionar requisitos conforme indicado na tabela abaixo. Poderá precisar de permissões adicionais se utilizar "AzureWebJobsStorage" para qualquer outra finalidade.

Extensão Funções necessárias Explicação
Sem extensão (apenas anfitrião) Proprietário dos Dados do Armazenamento de Blobs Utilizado para coordenação geral, arquivo de chaves predefinido
Blobs do Azure (apenas acionador) Todos de:
Contribuidor da Conta de Armazenamento,
Proprietário de Dados de Blobs de Armazenamento,
Contribuidor de Dados da Fila de Armazenamento
O acionador de blobs utiliza internamente as Filas do Azure e escreve recibos de blobs. Utiliza o AzureWebJobsStorage para estes, independentemente da ligação configurada para o acionador.
Hubs de Eventos do Azure (apenas acionador) (nenhuma alteração do requisito predefinido)
Proprietário dos Dados do Armazenamento de Blobs
Os pontos de verificação são mantidos em blobs com a ligação AzureWebJobsStorage.
Acionador de temporizador (nenhuma alteração do requisito predefinido)
Proprietário dos Dados do Armazenamento de Blobs
Para garantir uma execução por evento, os bloqueios são feitos com blobs com a ligação AzureWebJobsStorage.
Funções Duráveis Todos de:
Contribuidor de Dados do Blob de Armazenamento,
Contribuidor de Dados da Fila de Armazenamento,
Contribuidor de Dados da Tabela de Armazenamento
Durable Functions utiliza blobs, filas e tabelas para coordenar funções de atividade e manter o estado de orquestração. Utiliza a ligação AzureWebJobsStorage para todas estas ligações por predefinição, mas pode especificar uma ligação diferente na configuração da extensão Durable Functions.

Problemas de Relatórios

Item Descrição Ligação
Runtime Anfitrião de Scripts, Enlaces & de Acionadores, Suporte de Idioma Arquivar um Problema
Modelos Problemas de Código com o Modelo de Criação Arquivar um Problema
Portal Problema de Interface de Utilizador ou Experiência Arquivar um Problema

Passos seguintes

Para obter mais informações, veja os seguintes recursos: