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:
- Funções do Azure
- Funções do Azure anfitrião
- portal do Funções do Azure
- Funções do Azure modelos
- Azure WebJobs SDK (SDK de WebJobs do Azure)
- Azure WebJobs SDK Extensions (Extensões do SDK de WebJobs do Azure)
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:
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:
- Extensão de Blobs do Azure
- Extensão de Filas do Azure
- Extensão de Tabelas do Azure
- Extensão dos Hubs de Eventos
- Extensão do Service Bus
- Extensão do Azure Cosmos DB
- Extensão do Azure SignalR
- fornecedor de armazenamento Durable Functions
- Armazenamento do anfitrião de funções (pré-visualização)
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: