Академический Документы
Профессиональный Документы
Культура Документы
Documentação do Functions
Visão geral
Sobre o Azure Functions
Funções duráveis
Comparação sem servidor
Opções do plano de hospedagem
Guia de início rápido
Criar função – C#
Criar função – Java
Criar função – JavaScript
Criar função – PowerShell
Criar função - Python
Conectar-se a serviços
Armazenamento – C#
Armazenamento – Java
Armazenamento – JavaScript
Armazenamento – Python
Tutoriais
Functions com Aplicativos Lógicos
Desenvolver funções Python com o VS Code
Definição de OpenAPI para APIs sem servidor
Conectar-se a uma rede virtual
Redimensionamento de imagem com a Grade de Eventos
Criar um aplicativo web sem servidor
Aprendizado de máquina com o TensorFlow
Criar uma imagem personalizada do Linux
Funções no dispositivo do IoT Edge
Java com Azure Cosmos DB e Hubs de Eventos
Exemplos
Azure Serverless Community Library
Exemplos do Azure
C#
Java
JavaScript
PowerShell
Python
TypeScript
CLI do Azure
Conceitos
Comparar versões de tempo de execução
Plano Premium
Implantações
Eventos e mensagens
Processamento de eventos confiável
Como criar para entrada idêntica
Gatilhos e associações
Sobre gatilhos e associações
Exemplo de associação
Registrar as extensões de associação
Padrões de expressões de associação
Usar valores de retorno de associação
Tratar erros de associação
Languages
Idiomas com suporte
C# (biblioteca de classes)
Script do C# (.csx)
F#
JavaScript
Java
PowerShell
Python
TypeScript
Diagnósticos
Custos de plano de consumo
Considerações sobre o desempenho
Proxies de Funções
Opções de rede
Endereços IP
Funções no Kubernetes
Guias de instruções
Desenvolver
Guia do desenvolvedor
Desenvolvimento local
Desenvolver e depurar localmente
Desenvolvimento do Visual Studio Code
Desenvolvimento do Visual Studio
Desenvolvimento das Principais Ferramentas
Criar funções
Gatilho HTTP
Portal do Azure
Linha de comando
Visual Studio
Visual Studio Code
Java usando o Eclipse
Java usando o IntelliJ IDEA
Plano do Serviço de Aplicativo do Linux
Plano de consumo em Linux
Azure for Students Starter
Gatilho do Azure Cosmos DB
Gatilho de armazenamento Blob
Gatilho de armazenamento de filas
Gatilho de temporizador
Adicionar associações
Status do Azure Cosmos DB – portal
Armazenamento – Python
Armazenamento – portal
Armazenamento – Visual Studio Code
Armazenamento – Visual Studio
Depurar e testar
Testar funções
Depurar funções locais do PowerShell
Depurar gatilho da Grade de Eventos localmente
Injeção de dependência
Gerenciar conexões
Tratamento de erros
Executar manualmente uma função não disparada por HTTP
Implantar
Implantação contínua
Slots de implantação
Criar e implantar usando o Azure Pipelines
Criar e implantar usando Ações do GitHub
implantação do Zip
Execução a partir do pacote
Automatizar implantação de recursos
Funções locais
Implantar usando o plug-in do Jenkins
Configurar
Gerenciar um aplicativo de funções
Defina a versão de runtime
Registrar manualmente uma extensão
Desabilitar uma função
Recuperação de desastre geográfico
Monitoramento
Monitorar funções
Analisar logs
Segurança
Adicionar certificado SSL
Autenticar usuários
Autenticar com o Azure AD
Autenticar com o Facebook
Autenticar com o Google
Autenticar com a conta da Microsoft
Autenticar com o Twitter
Autenticação avançada
Restringir IPs
Usar uma identidade gerenciada
Referenciar segredos do Key Vault
Integração
Adicionar associações
Status do Azure Cosmos DB – portal
Armazenamento – Python
Armazenamento – portal
Armazenamento – Visual Studio Code
Armazenamento – Visual Studio
Conectar-se ao Banco de Dados SQL
Conectar-se a uma Rede virtual
Criar uma definição Open API 2.0
Exportar para o PowerApps e para o Microsoft Flow
Usar uma identidade gerenciada
Personalizar ponto de extremidade da função HTTP
Gerenciar recursos locais
Solucionar problemas
Solucionar problemas de armazenamento
Referência
Referências de API
Java
Python
Referência de configurações do aplicativo
Gatilhos e associações
Armazenamento de blob
Azure Cosmos DB
Funções 1.x
Funções 2.x
Grade de Eventos
Hubs de Eventos
Hub IoT
HTTP e webhooks
Microsoft Graph
Aplicativos Móveis
Hubs de Notificação
Armazenamento de filas
SendGrid
Barramento de Serviço
Serviço SignalR
Armazenamento de tabela
Timer
Twilio
Referência do host.json 2.x
Referência do host.json 1.x
Perguntas frequentes sobre a rede
Referência do OpenAPI
Recursos
Desenvolva suas habilidades com o Microsoft Learn
Roteiro do Azure
Preços
Calculadora de preço
Informações de cota
Disponibilidade regional
vídeos
Fórum do MSDN
Stack Overflow
Twitter
Fornecer comentários sobre o produto
Repositório de GitHub do Azure Functions
Atualizações de serviço
Uma introdução ao Azure Functions
25/05/2018 • 10 minutes to read • Edit Online
O Azure Functions é uma solução para executar facilmente pequenos trechos de código, ou "funções", na nuvem.
Você pode simplesmente escrever o código de que necessita para o problema em questão, sem se preocupar
com todo o aplicativo ou a infraestrutura para executá-lo. As funções podem tornar o desenvolvimento ainda
mais produtivo e você pode usar a linguagem de desenvolvimento de sua escolha, como C#, Java, JavaScript,
PowerShell e Python. Pague somente pelo tempo de execução do seu código e confie no Azure para
dimensioná-lo conforme a necessidade. O Azure Functions permite desenvolver aplicativos sem servidor no
Microsoft Azure.
Este tópico fornece uma visão geral de alto nível do Azure Functions. Se você quiser começar a usar
imediatamente o Functions, comece com Criar seu primeiro Azure Function. Se você estiver procurando
informações mais técnicas sobre o Functions, confira a referência do desenvolvedor.
Recursos
Aqui estão alguns dos principais recursos do Functions:
Opção de linguagem – escreva funções usando a linguagem que quiser: C#, Java, JavaScript, Python ou
outra. Consulte as Linguagens compatíveis para obter a lista completa.
Modelo de preços de pagamento por uso – pague somente pelo tempo gasto na execução de seu código.
Veja a opção de plano de hospedagem de consumo na seção de preços.
Traga suas próprias dependências – o Functions dá suporte a NuGet e NPM e, portanto, você pode usar
suas bibliotecas favoritas.
Segurança integrada – proteja funções disparadas por HTTP com provedores de OAuth como Azure Active
Directory, Facebook, Google, Twitter e Conta da Microsoft.
Integração simplificada – aproveite facilmente as ofertas dos serviços do Azure e de SaaS (software como
um serviço). Confira a seção de integrações para obter alguns exemplos.
Desenvolvimento flexível – escreva suas funções diretamente no portal ou configure a integração
contínua e implante seu código por meio do GitHub, do Azure DevOps Services e de outras ferramentas de
desenvolvimento com suporte.
Software livre – O Functions é um software livre e está disponível no GitHub.
Integrações
O Azure Functions integra-se com uma variedade de serviços do Azure e de terceiros. Esses serviços podem
disparar a sua função e iniciar a execução ou podem servir como entrada e saída para seu código. As integrações
de serviço a seguir têm suporte do Azure Functions:
Azure Cosmos DB
Hubs de eventos do Azure
Grade de Eventos do Azure
Hubs de Notificação do Azure
Barramento de Serviço do Azure (filas e tópicos)
Armazenamento do Azure (blob, filas e tabelas)
No local (usando o Barramento de Serviço)
Twilio (mensagens SMS )
As Durable Functions são uma extensão do Azure Functions que permite escrever funções com estado em um
ambiente de computação sem servidor. A extensão permite definir fluxos de trabalho com estado pela escrita de
funções de orquestrador e entidades com estado pela escrita de funções de entidade usando o modelo de
programação do Azure Functions. Nos bastidores, a extensão gerencia o estado, os pontos de verificação e as
reinicializações para você, permitindo que você se concentre na lógica de negócios.
Linguagens compatíveis
Atualmente, as Durable Functions dão suporte às seguintes linguagens:
C# : bibliotecas de classes pré-compiladas e script C#.
F# : bibliotecas de classes pré-compiladas e script F#. Só há suporte para o script F# na versão 1.x do Azure
Functions Runtime.
JavaScript: compatível apenas com a versão 2.x do Azure Functions Runtime. Exige a versão 1.7.0 da extensão
das Durable Functions ou uma versão posterior.
As Durable Functions têm o objetivo de dar suporte a todas as linguagens do Azure Functions. Confira a lista de
problemas das Durable Functions para obter o último status do trabalho para dar suporte a linguagens adicionais.
Assim como o Azure Functions, há modelos para ajudá-lo a desenvolver as Durable Functions usando o Visual
Studio 2019, o Visual Studio Code e o portal do Azure.
Padrões de aplicativo
O principal caso de uso das Durable Functions é simplificar requisitos complexos de coordenação com estado em
aplicativos sem servidor. As seguintes seções descrevem padrões de aplicativo típicos que podem se beneficiar
com as Durable Functions:
Encadeamento de funções
Fan-out/fan-in
APIs HTTP assíncronas
Monitoramento
Interação humana
Agregador
Padrão 1: Encadeamento de funções
No padrão de encadeamento de funções, uma sequência de funções é executada em uma ordem específica. Nesse
padrão, a saída de uma função é aplicada à entrada de outra função.
Use as Durable Functions para implementar o padrão de encadeamento de funções de forma concisa, conforme
mostrado no seguinte exemplo:
C#
[FunctionName("Chaining")]
public static async Task<object> Run(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
try
{
var x = await context.CallActivityAsync<object>("F1", null);
var y = await context.CallActivityAsync<object>("F2", x);
var z = await context.CallActivityAsync<object>("F3", y);
return await context.CallActivityAsync<object>("F4", z);
}
catch (Exception)
{
// Error handling or compensation goes here.
}
}
const df = require("durable-functions");
module.exports = df.orchestrator(function*(context) {
const x = yield context.df.callActivity("F1");
const y = yield context.df.callActivity("F2", x);
const z = yield context.df.callActivity("F3", y);
return yield context.df.callActivity("F4", z);
});
NOTE
O objeto context no JavaScript representa o contexto de função inteiro, não apenas o parâmetro
[DurableOrchestrationContext].
Padrão 2: Fan-out/fan-in
No padrão fan-out/fan-in, execute várias funções em paralelo e, em seguida, aguarde a conclusão de todas as
funções. Frequentemente, algum trabalho de agregação é feito nos resultados retornados pelas funções.
Com funções normais, realize fan-out fazendo com que a função envie várias mensagens para uma fila. No
entanto, o processo de realizar fan-in é muito mais complexo. Para o fan-in, em uma função normal, você escreve
o código a ser controlado quando as funções disparadas por fila terminam e, em seguida, armazena saídas da
função.
A extensão Durable Functions cuida desse padrão com um código relativamente simples:
C#
[FunctionName("FanOutFanIn")]
public static async Task Run(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
var parallelTasks = new List<Task<int>>();
await Task.WhenAll(parallelTasks);
module.exports = df.orchestrator(function*(context) {
const parallelTasks = [];
yield context.df.Task.all(parallelTasks);
O trabalho de fan-out é distribuído para várias instâncias da função F2 . O trabalho é acompanhado usando uma
lista dinâmica de tarefas. A API Task.WhenAll .NET ou context.df.Task.all JavaScript é chamada para aguardar
até que todas as funções chamadas sejam concluídas. Em seguida, as saídas da função F2 são agregadas da lista
de tarefas dinâmicas e passadas para a função F3 .
O ponto de verificação automático que ocorre na chamada await ou yield em Task.WhenAll ou
context.df.Task.all garante que uma possível falha ou reinicialização no meio do processo não exija a
reinicialização de uma tarefa já concluída.
NOTE
Em raras circunstâncias, é possível que uma falha ocorra na janela depois que uma função de atividade for concluída, mas
antes de sua conclusão ser salva no histórico de orquestração. Se isso acontecer, a função de atividade será executada
novamente desde o início depois que o processo for recuperado.
As Durable Functions fornecem suporte interno para esse padrão, simplificando ou, até mesmo, removendo o
código que você precisa escrever para interagir com execuções de função de execução longa. Por exemplo, as
amostras de início rápido das Durable Functions (C# e JavaScript) mostram um comando REST simples que você
pode usar para iniciar novas instâncias de função de orquestrador. Depois que uma instância é iniciada, a extensão
expõe as APIs HTTP de webhook que consultam o status da função de orquestrador.
O exemplo a seguir mostra os comandos REST que iniciam um orquestrador e consultam seu status. Para maior
clareza, alguns detalhes do protocolo foram omitidos do exemplo.
{"id":"b79baf67f717453ca9e86c5da21e03ec", ...}
{"runtimeStatus":"Running","lastUpdatedTime":"2019-03-16T21:20:47Z", ...}
{"runtimeStatus":"Completed","lastUpdatedTime":"2019-03-16T21:20:57Z", ...}
Como o runtime das Durable Functions gerencia o estado para você, você não precisa implementar seu próprio
mecanismo de acompanhamento de status.
A extensão Durable Functions expõe as APIs HTTP internas que gerenciam orquestrações de execução longa.
Como alternativa, você pode implementar esse padrão por conta própria usando seus próprios gatilhos de função
(como HTTP, uma fila ou os Hubs de Eventos do Azure) e a associação de cliente de orquestração. Por exemplo,
você pode usar uma mensagem da fila para disparar o encerramento. Ou você pode usar um gatilho HTTP
protegido por uma política de autenticação do Azure Active Directory, em vez de APIs HTTP internas que usam
uma chave gerada para autenticação.
Para obter mais informações, confira o artigo Recursos HTTP, que explica como você pode expor processos
assíncronos de execução longa via HTTP usando a extensão das Durable Functions.
Padrão 4: Monitoramento
O padrão de monitor refere-se a um processo recorrente e flexível em um fluxo de trabalho. Um exemplo é fazer
uma sondagem até que condições específicas sejam atendidas. Você pode usar um gatilho de temporizador
normal para lidar com um cenário básico, como um trabalho de limpeza periódico, mas seu intervalo é estático e
o gerenciamento do tempo de vida da instância torna-se complexo. Use as Durable Functions para criar intervalos
de recorrência flexíveis, gerenciar os tempos de vida de tarefas e criar vários processos de monitor com base em
uma única orquestração.
Um exemplo do padrão de monitor é reverter o cenário de API HTTP assíncrona anterior. Em vez de expor um
ponto de extremidade para um cliente externo monitorar uma operação de execução longa, o monitor de
execução longa consome um ponto de extremidade externo e, em seguida, aguarda uma alteração de estado.
Em poucas linhas de código, você pode usar as Durable Functions para criar vários monitores que observam
pontos de extremidade arbitrários. Os monitores podem encerrar a execução quando uma condição é atendida ou
o DurableOrchestrationClient pode encerrar os monitores. Você pode alterar o intervalo de wait de um monitor
de acordo com uma condição específica (por exemplo, retirada exponencial).
O seguinte código implementa um monitor básico:
C#
[FunctionName("MonitorJobStatus")]
public static async Task Run(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
int jobId = context.GetInput<int>();
int pollingInterval = GetPollingInterval();
DateTime expiryTime = GetExpiryTime();
module.exports = df.orchestrator(function*(context) {
const jobId = context.df.getInput();
const pollingInternal = getPollingInterval();
const expiryTime = getExpiryTime();
while (moment.utc(context.df.currentUtcDateTime).isBefore(expiryTime)) {
const jobStatus = yield context.df.callActivity("GetJobStatus", jobId);
if (jobStatus === "Completed") {
// Perform an action when a condition is met.
yield context.df.callActivity("SendAlert", machineId);
break;
}
Quando uma solicitação é recebida, uma nova instância de orquestração é criada para essa ID do trabalho. A
instância sonda um status até que uma condição seja atendida e o loop seja encerrado. Um temporizador durável
controla o intervalo de sondagem. Em seguida, mais trabalho pode ser realizado ou a orquestração pode ser
encerrada. Quando o context.CurrentUtcDateTime (.NET) ou o context.df.currentUtcDateTime (JavaScript) excede
o valor expiryTime , o monitor é encerrado.
Padrão 5: Interação humana
Muitos processos automatizados envolvem algum tipo de interação humana. Envolver humanos em um processo
automatizado é complicado, porque as pessoas não estão tão altamente disponíveis nem são tão dinâmicas
quanto os serviços de nuvem. Um processo automatizado pode permitir essa interação usando tempos limite e a
lógica de compensação.
Um processo de aprovação é um exemplo de um processo empresarial que envolve a interação humana. A
aprovação de um gerente pode ser necessária para um relatório de despesas que exceda determinado valor em
dólares. Se o gerente não aprovar o relatório de despesas em até 72 horas (talvez ele esteja de férias), um
processo de escalonamento será iniciado para obter a aprovação de outra pessoa (talvez o gerente do gerente).
Você pode implementar o padrão nesse exemplo usando uma função de orquestrador. O orquestrador usa um
temporizador durável para solicitar aprovação. O orquestrador fará o escalonamento se o tempo limite se esgotar.
O orquestrador aguarda um evento externo, como uma notificação gerada por uma interação humana.
Estes exemplos criam um processo de aprovação para demonstrar o padrão de interação humana:
C#
[FunctionName("ApprovalWorkflow")]
public static async Task Run(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
await context.CallActivityAsync("RequestApproval", null);
using (var timeoutCts = new CancellationTokenSource())
{
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
Task durableTimeout = context.CreateTimer(dueTime, timeoutCts.Token);
const df = require("durable-functions");
const moment = require('moment');
module.exports = df.orchestrator(function*(context) {
yield context.df.callActivity("RequestApproval");
[FunctionName("RaiseEventToOrchestration")]
public static async Task Run(
[HttpTrigger] string instanceId,
[OrchestrationClient] DurableOrchestrationClient client)
{
bool isApproved = true;
await client.RaiseEventAsync(instanceId, "ApprovalEvent", isApproved);
}
const df = require("durable-functions");
curl -d "true"
http://localhost:7071/runtime/webhooks/durabletask/instances/{instanceId}/raiseEvent/ApprovalEvent -H
"Content-Type: application/json"
A complexidade de tentar implementar esse padrão com as funções normais sem estado é que o controle de
simultaneidade se torna um grande desafio. Além de se preocupar com vários threads modificando os mesmos
dados ao mesmo tempo, você precisa se preocupar em garantir que o agregador só seja executado em uma única
VM por vez.
Usando uma função de Entidade Durável, é possível implementar esse padrão com facilidade como uma única
função.
[FunctionName("Counter")]
public static void Counter([EntityTrigger] IDurableEntityContext ctx)
{
int currentValue = ctx.GetState<int>();
switch (ctx.OperationName.ToLowerInvariant())
{
case "add":
int amount = ctx.GetInput<int>();
currentValue += amount;
break;
case "reset":
currentValue = 0;
break;
case "get":
ctx.Return(currentValue);
break;
}
ctx.SetState(currentValue);
}
As Entidades Duráveis também podem ser modeladas como classes .NET. Esse modelo pode ser útil se a lista de
operações é fixa e se torna grande. O exemplo a seguir é uma implementação equivalente da entidade Counter
usando métodos e classes .NET.
[FunctionName(nameof(Counter))]
public static Task Run([EntityTrigger] IDurableEntityContext ctx)
=> ctx.DispatchAsync<Counter>();
}
Os clientes podem enfileirar operações de uma função de entidade (também conhecido como "sinalização")
usando a associação do cliente de entidade.
[FunctionName("EventHubTriggerCSharp")]
public static async Task Run(
[EventHubTrigger("device-sensor-events")] EventData eventData,
[OrchestrationClient] IDurableOrchestrationClient entityClient)
{
var metricType = (string)eventData.Properties["metric"];
var delta = BitConverter.ToInt32(eventData.Body, eventData.Body.Offset);
Os proxies gerados dinamicamente também estão disponíveis para sinalizar entidades para torná-las fortemente
tipadas. Além da sinalização, os clientes também podem consultar o estado de uma função de entidade usando
métodos fortemente tipados na associação do cliente de orquestração.
NOTE
Atualmente, as funções de entidade só estão disponíveis no .NET como parte da versão prévia das Durable Functions 2.0.
A tecnologia
Nos bastidores, a extensão Durable Functions baseia-se na Durable Task Framework, uma biblioteca open-source
no GitHub usada para a criação de fluxos de trabalho em código. Assim como o Azure Functions é a evolução sem
servidor do Azure WebJobs, as Durable Functions são a evolução sem servidor da Durable Task Framework. A
Microsoft e outras organizações usam a Durable Task Framework extensivamente para automatizar processos
críticos. Ele é uma opção natural para o ambiente sem servidor do Azure Functions.
Restrições de código
Para fornecer garantias de execução confiáveis e de execução longa, as funções de orquestrador têm um conjunto
de regras de codificação que precisam ser seguidas. Para obter mais informações, confira o artigo Restrições de
código na função de orquestrador.
Cobrança
As Durable Functions são cobradas da mesma forma que o Azure Functions. Para saber mais, confira Preços do
Azure Functions. Ao executar funções de orquestrador no plano de Consumo do Azure Functions, há alguns
comportamentos de cobrança para sua informação. Para obter mais informações sobre esses comportamentos,
confira o artigo Cobrança das Durable Functions.
Saiba mais
O seguinte vídeo destaca os benefícios das Durable Functions:
Para obter uma discussão mais detalhada sobre as Durable Functions e a tecnologia subjacente, confira o seguinte
vídeo (ele se concentra no .NET, mas os conceitos também se aplicam a outras linguagens compatíveis):
Como as Durable Functions são uma extensão avançada do Azure Functions, elas não são apropriadas para todos
os aplicativos. Para obter uma comparação com outras tecnologias de orquestração do Azure, confira Comparar o
Azure Functions e os Aplicativos Lógicos do Azure.
Próximas etapas
Tipos de função e recursos das Durable Functions
O que são o Microsoft Flow, os Aplicativos Lógicos, o
Functions e o WebJobs?
25/05/2018 • 14 minutes to read • Edit Online
ALM (Gerenciamento do Ciclo de Vida Design e teste em ambientes de não Azure DevOps: controle do código-
do Aplicativo) produção; promoção para produção fonte, teste, suporte, automação e
quando pronto capacidade de gerenciamento no Azure
Resource Manager
Experiência de admin Gerenciar ambientes do Microsoft Flow Gerenciar grupos de recursos, conexões,
e políticas DLP (prevenção contra perda gerenciamento de acesso e log: Portal
de dados), acompanhamento do do Azure
licenciamento: Centro de Administração
do Microsoft Flow
Ações Cada atividade é uma função do Azure. Grande coleção de ações predefinidas
Escrever código para funções de
atividade
Gerenciamento API REST, Visual Studio Portal do Azure, API REST, PowerShell,
Visual Studio
FUNÇÕES DURÁVEIS APLICATIVOS LÓGICOS
1O WebJobs (sem o SDK do WebJobs) é compatível com C#, Java, JavaScript, Bash, .cmd, .bat, PowerShell, PHP,
TypeScript, Python, entre outros. Essa não é uma lista completa. Um WebJob pode executar qualquer programa ou
script que possa ser executado na área restrita do Serviço de Aplicativo.
2O WebJobs (sem o SDK do WebJobs) dá suporte ao NPM e ao NuGet.
Resumo
O Azure Functions oferece mais produtividade para o desenvolvedor do que o WebJobs do Serviço de Aplicativo
do Azure. Também oferece mais opções de linguagens de programação, ambientes de desenvolvimento, integração
de serviços do Azure e preços. Na maioria dos cenários, é a melhor opção.
Aqui estão dois cenários para os quais o WebJobs pode ser a melhor opção:
Você precisa de mais controle sobre o código que escuta eventos, o objeto JobHost . O Functions oferece um
número limitado de maneiras de personalizar o comportamento do JobHost no arquivo host.json. Às vezes,
você precisa fazer coisas que não podem ser especificadas por uma cadeia de caracteres em um arquivo JSON.
Por exemplo, somente o SDK do WebJobs permite configurar uma política de repetição personalizada para o
Armazenamento do Azure.
Você tem um aplicativo do Serviço de Aplicativo para o qual deseja executar snippets de código e deseja
gerenciá-los juntos no mesmo ambiente do Azure DevOps.
Para outros cenários em que você deseja executar snippets de código para integrar o Azure ou serviços de
terceiros, escolha o Azure Functions em vez do WebJobs com o SDK do WebJobs.
Próximas etapas
Comece criando seu primeiro fluxo, aplicativo lógico ou aplicativo de funções. Selecione um dos seguintes links:
Introdução ao Microsoft Flow
Criar um aplicativo lógico
Como criar a sua primeira função do Azure
Escala e hospedagem no Azure Functions
25/05/2018 • 24 minutes to read • Edit Online
Ao criar um aplicativo de funções no Azure, você deve escolher um plano de hospedagem para seu aplicativo. Há
três planos de hospedagem disponíveis para Azure Functions: plano de consumo, plano Premiume plano do
serviço de aplicativo.
O plano de hospedagem que você escolher ditará os seguintes comportamentos:
Como seu aplicativo de funções é dimensionado.
Os recursos disponíveis para cada instância do aplicativo de funções.
Suporte para recursos avançados, como conectividade VNET.
Os planos de consumo e Premium adicionam capacidade de computação automaticamente quando seu código
está em execução. Seu aplicativo é escalado horizontalmente quando necessário para lidar com a carga e diminuído
verticalmente quando o código para de ser executado. Para o plano de consumo, você também não precisa pagar
por VMs ociosas ou reservar a capacidade antecipadamente.
O plano Premium fornece recursos adicionais, como instâncias de computação Premium, a capacidade de manter
instâncias quentes indefinidamente e conectividade VNet.
O plano do serviço de aplicativo permite que você aproveite a infraestrutura dedicada, que você gerencia. Seu
aplicativo de funções não é dimensionado com base em eventos, o que significa que nunca é dimensionado para
zero. (Requer que o Always on esteja habilitado.)
NOTE
Você pode alternar entre consumo e planos Premium alterando a propriedade Plan do recurso de aplicativo de funções.
Windows GA GA GA
Linux GA GA GA
Plano de consumo
Quando você estiver usando o plano de consumo, as instâncias do host Azure Functions serão adicionadas e
removidas dinamicamente com base no número de eventos de entrada. Esse plano sem servidor escala
automaticamente, e você é cobrado pelos recursos de computação apenas durante a execução de suas funções. Em
um plano de consumo, a execução de uma função expire após um período configurável.
A cobrança baseia-se no número de execuções, no tempo de execução e na memória usada. A cobrança é agregada
entre todas as funções em um aplicativo de funções. Para saber mais, confira a página de preços do Azure
Functions.
O plano de Consumo é o plano de hospedagem padrão e oferece os seguintes benefícios:
Pague apenas quando suas funções forem executadas
Escale horizontalmente de forma automática, mesmo durante períodos de carga alta
Os aplicativos de funções na mesma região podem ser atribuídos ao mesmo plano de consumo. Não há nenhuma
desvantagem ou impacto para ter vários aplicativos em execução no mesmo plano de consumo. A atribuição de
vários aplicativos ao mesmo plano de consumo não afeta a resiliência, a escalabilidade ou a confiabilidade de cada
aplicativo.
Para saber mais sobre como estimar os custos durante a execução em um plano de consumo, consulte noções
básicas sobre custos do plano de consumo.
Plano Premium
Quando você estiver usando o plano Premium, as instâncias do host Azure Functions serão adicionadas e
removidas com base no número de eventos de entrada, assim como o plano de consumo. O plano Premium dá
suporte aos seguintes recursos:
Instâncias passivas perpétuas para evitar qualquer início frio
Conectividade de VNet
Duração de execução ilimitada
Tamanhos de instância Premium (um núcleo, duas principais e quatro instâncias de núcleo)
Preços mais previsíveis
Alocação de aplicativo de alta densidade para planos com vários aplicativos de funções
Informações sobre como você pode configurar essas opções podem ser encontradas no documento Azure
Functions plano Premium.
Em vez de cobrança por execução e memória consumida, a cobrança pelo plano Premium é baseada no número de
segundos de núcleo e na memória usada nas instâncias necessárias e pré-configuradas. Pelo menos uma instância
deve estar sempre em espera por plano. Isso significa que há um custo mensal mínimo por plano ativo,
independentemente do número de execuções. Tenha em mente que todos os aplicativos de funções em um plano
Premium compartilham instâncias ativas e pré-configuradas.
Considere o plano Azure Functions Premium nas seguintes situações:
Os aplicativos de funções executam continuamente ou quase continuamente.
Você tem um número alto de execuções pequenas e tem uma cobrança de alta execução, mas a cobrança de
baixo GB por segundo no plano de consumo.
Você precisa de mais opções de CPU ou memória do que o fornecido pelo plano de consumo.
Seu código precisa ser executado por mais tempo do que o máximo permitido no plano de consumo.
Você precisa de recursos que estão disponíveis apenas em um plano Premium, como conectividade VNET/VPN.
Ao executar funções de JavaScript em um plano Premium, você deve escolher uma instância que tenha menos
vCPUs. Para obter mais informações, consulte escolher planos Premium de núcleo único.
VERSÃO DE TEMPO DE
PLANO EXECUÇÃO OS MÁXIMO
Consumo 1.x 5 10
Consumo 2. x 5 10
Consumo 3. x (visualização) 5 10
NOTE
Independentemente da configuração do tempo limite do aplicativo de funções, 230 segundos é a quantidade máxima de
tempo que uma função disparada por HTTP pode levar para responder a uma solicitação. Isso ocorre devido ao tempo limite
de ociosidade padrão de Azure Load Balancer. Para tempos de processamento mais longos, considere usar o padrão
assíncrono Durable Functions ou adiar o trabalho real e retornar uma resposta imediata.
Mesmo com Always On habilitado, o tempo limite de execução para funções individuais é controlado pela
configuração functionTimeout no arquivo de projeto host.json.
Também é possível usar a CLI do Azure para determinar o plano, da seguinte maneira:
Quando a saída desse comando for dynamic , o aplicativo de funções estará no plano de Consumo. Quando a saída
desse comando for ElasticPremium , seu aplicativo de funções estará no plano Premium. Todos os outros valores
indicam diferentes camadas de um plano do serviço de aplicativo.
Limites de serviço
A tabela a seguir indica os limites que se aplicam a aplicativos de funções ao serem executados em vários planos de
hospedagem:
PLANO DE SERVIÇO DE
GRUPOS PLANO DE CONSUMO PLANO PREMIUM APLICATIVO1
Máximo de conexões de 600 ativo (total de 1200) não associado não associado
saída (por instância)
Planos do Serviço de 100 por região 100 por grupo de recursos 100 por grupo de recursos
Aplicativo
domínio personalizado conexão SSL SNI não conexões SSL SNI não conexões SSL SNI não
Suporte a SSL vinculada incluída associadas e 1 IP SSL associadas e 1 IP SSL
incluídas incluídas
1 para limites específicos para as várias opções do plano do serviço de aplicativo, consulte os limites do plano do
serviço de aplicativo.
2 por padrão, o tempo limite para o tempo de execução do Functions 1. x em um plano do serviço de aplicativo é
não associado.
3 requer que o plano do serviço de aplicativo seja definido como Always on. Pague com tarifaspadrão.
4 esses limites são definidos no host.
5 o número real de aplicativos de funções que você pode hospedar depende da atividade dos aplicativos, do
aplicativos no mesmo plano do serviço de aplicativo. O plano de consumo usa os arquivos do Azure para
armazenamento temporário.
7 quando seu aplicativo de funções está hospedado em um plano de consumo, somente a opção CNAME tem
suporte. Para aplicativos de funções em um plano Premium ou um plano do serviço de aplicativo, é possível
mapear um domínio personalizado usando um registro CNAME ou um.
Criar sua primeira função usando o Visual Studio
07/11/2019 • 13 minutes to read • Edit Online
O Azure Functions lhe permite executar seu código em um ambiente sem servidor sem que seja preciso primeiro
criar uma VM ou publicar um aplicativo Web.
Neste artigo, você aprenderá a usar o Visual Studio 2019 para criar e testar localmente uma função “olá, mundo”
e publicá-la no Azure. Este início rápido foi criado para o Visual Studio 2019. Ao criar um projeto do Functions
usando o Visual Studio 2017, é necessário instalar primeiro as ferramentas de Azure Functions mais recentes.
Pré-requisitos
Para concluir este tutorial, é necessário instalar primeiro o Visual Studio 2019. Garanta que a carga de trabalho
de desenvolvimento do Azure também seja instalada.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Tempo de execução do Functions Azure Functions 2.x Essa configuração cria um projeto de
(.NET Core) função que usa o tempo de
execução versão 2.x do Azure
Functions, o qual dá suporte a .NET
Core. O Azure Functions 1.x dá
suporte ao .NET Framework. Para
obter mais informações, consulte
Direcionar o tempo de execução do
Azure Functions.
NOTE
Verifique se você definiu o Nível de autorização como Anonymous . Se você escolher o nível padrão de
Function , é necessário que você apresente a chave da função em solicitações para acessar seu ponto de
extremidade da função.
5. Selecione Criar para criar o projeto de função e a função disparada por HTTP.
O Visual Studio cria um projeto e uma classe que contém o código clichê do tipo de função do gatilho HTTP. O
atributo FunctionName no método define o nome da função, que é HttpTrigger por padrão. O atributo
HttpTrigger especifica que a função é disparada por uma solicitação HTTP. O código padronizado envia uma
resposta HTTP que inclui um valor do corpo de solicitação ou da cadeia de consulta.
É possível estender as funcionalidades de sua função usando associações de entrada e de saída aplicando os
atributos adequados ao método. Para obter mais informações, consulte a seção Gatilhos e associações da
referência do desenvolvedor C# do Azure Functions.
Agora que você criou o seu projeto de função e uma função disparada por HTTP, poderá testá-la em seu
computador local.
3. Cole a URL para a solicitação HTTP na barra de endereços do navegador. Acrescente o valor de cadeia de
consulta ?name=<YOUR_NAME> a essa URL e execute a solicitação. O exemplo a seguir mostra a resposta no
navegador à solicitação GET local retornada pela função:
OPÇÃO DESCRIÇÃO
Plano de consumo do Azure Functions Quando você publica seu projeto em um aplicativo de
funções executado em um Plano de consumo, você paga
apenas pelas execuções do seu aplicativo de funções.
Outros planos de hospedagem incorrem em custos mais
altos. Para saber mais, confira Escala e hospedagem do
Azure Functions.
Executar com base no arquivo de pacote Seu aplicativo de funções é implantado usando a
Implantação de Zip com o modo Run-From-Package
habilitado. Essa é a maneira recomendada de executar
suas funções, que resulta em um melhor desempenho.
Quando não estiver usando essa opção, verifique se você
interrompeu a execução local do projeto de aplicativo de
funções antes de publicar no Azure.
3. Selecione Publicar. Se você ainda não entrou em sua conta do Azure do Visual Studio, selecione Entrar.
Também é possível criar uma conta gratuita do Azure.
4. No Serviço de Aplicativo: Criar, use as configurações de Hospedagem conforme especificadas na
tabela embaixo da imagem:
CONFIGURAÇÃO VALOR SUGERIDO DESCRIÇÃO
http://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?name=<YOUR_NAME>
2. Cole essa nova URL para a solicitação HTTP na barra de endereços do navegador. O exemplo a seguir
mostra a resposta no navegador à solicitação GET remota retornada pela função:
Próximas etapas
Você usou o Visual Studio para criar e publicar um aplicativo de funções C# no Azure com uma função disparada
por HTTP simples. Para saber mais sobre como desenvolver funções como bibliotecas de classes do .NET,
consulte Referência do desenvolvedor de C# do Azure Functions.
Adicionar uma associação de fila do Armazenamento do Azure à sua função
Início Rápido: Usar o Java e o Maven para criar e
publicar uma função no Azure
24/10/2019 • 10 minutes to read • Edit Online
Este artigo mostra como criar e publicar uma função Java no Azure Functions com a ferramenta de linha de
comando Maven. Quando você terminar, o código de função será executado no Azure em um plano de
hospedagem sem servidor e será disparado por uma solicitação HTTP.
Pré-requisitos
Para desenvolver funções usando Java, você deve ter o seguinte instalado:
Java Developer Kit, versão 8
Apache Maven, versão 3.0 ou posterior
CLI do Azure
Azure Functions Core Tools versão 2.6.666 ou posterior
Uma assinatura do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
IMPORTANT
A variável de ambiente JAVA_HOME deve ser definida como o local de instalação do JDK para concluir este guia de
início rápido.
mvn archetype:generate \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype
NOTE
Se você estiver com problemas com a execução do comando, verifique qual versão do maven-archetype-plugin é
usada. Como você está executando o comando em um diretório vazio sem nenhum arquivo .pom , ele pode estar
tentando usar um plug-in da versão mais antiga do
~/.m2/repository/org/apache/maven/plugins/maven-archetype-plugin , se você atualizou o Maven de uma
versão anterior. Nesse caso, tente excluir o diretório maven-archetype-plugin e executar novamente o comando.
Windows
mvn archetype:generate `
"-DarchetypeGroupId=com.microsoft.azure" `
"-DarchetypeArtifactId=azure-functions-archetype"
mvn archetype:generate ^
"-DarchetypeGroupId=com.microsoft.azure" ^
"-DarchetypeArtifactId=azure-functions-archetype"
O Maven solicita os valores necessários para concluir a geração do projeto na implantação. Forneça os
seguintes valores quando solicitado:
VALOR DESCRIÇÃO
Abra o novo arquivo Function.java do caminho src/main/java em um editor de texto e examine o código
gerado. Esse código é uma função disparada por HTTP que ecoa o corpo da solicitação.
cd fabrikam-function
mvn clean package
mvn azure-functions:run
Você verá uma saída semelhante à seguinte no Azure Functions Core Tools quando executar o projeto
localmente:
...
Http Functions:
Dispare a função na linha de comando usando o cURL em uma nova janela de terminal:
Hello AzureFunctions!
A chave de função não é necessária na execução local. Use Ctrl+C no terminal para interromper o código
da função.
az login
TIP
Caso a sua conta possa acessar várias assinaturas, use az account set para definir a assinatura padrão para essa
sessão.
Use o comando do Maven a seguir para implantar o projeto em um novo aplicativo de funções.
mvn azure-functions:deploy
Isso envia uma solicitação POST ao ponto de extremidade da função com AzureFunctions no corpo da
solicitação. Você verá a resposta a seguir.
Hello AzureFunctions!
Próximas etapas
Você criou um projeto de funções Java com uma função disparada por HTTP, executou-o no computador
local e implantou-o no Azure. Agora, estenda sua função por meio da...
Adição de uma associação de saída de fila do Armazenamento do Azure
Criar sua primeira função usando o Visual Studio
Code
07/11/2019 • 14 minutes to read • Edit Online
O Azure Functions lhe permite executar seu código em um ambiente sem servidor sem que seja preciso
primeiro criar uma VM ou publicar um aplicativo Web.
Neste artigo, você aprenderá a usar a extensão Azure Functions para Visual Studio Code para criar e testar
uma função "hello world" no computador local usando o Microsoft Visual Studio Code. Em seguida, você
publicará o código de função no Azure do Visual Studio Code.
A extensão atualmente dá suporte a funções C#, JavaScript, Java e Python. As etapas neste artigo e no artigo
seguinte são compatíveis somente com as funções JavaScript e C#. Para saber como usar o Visual Studio
Code para criar e publicar funções do Python, veja Implantar Python no Azure Functions. Para saber como
usar o Visual Studio Code para criar e publicar funções do PowerShell, veja Criar sua primeira função do
PowerShell no Azure.
Atualmente, a extensão está em versão prévia. Para obter mais informações, consulte a página da extensão
Extensão Azure Functions para Visual Studio Code.
Pré-requisitos
Para concluir este guia de início rápido:
Instale o Visual Studio Code em uma das plataformas compatíveis.
Instale a versão 2.x do Azure Functions Core Tools.
Instale os requisitos específicos para a linguagem de programação escolhida:
LINGUAGEM REQUISITO
C# Extensão C#
JavaScript Node.js*
3. Reinicie o Visual Studio Code e selecione o ícone do Azure na barra Atividade. Você deve ver uma área
do Azure Functions na barra lateral.
Criar seu projeto do Functions com uma função
O modelo de projeto do Azure Functions no Visual Studio Code cria um projeto que pode ser publicado em
um aplicativo de funções no Azure. Um aplicativo de funções permite a você agrupar funções como uma
unidade lógica para o gerenciamento, implantação e compartilhamento de recursos.
1. No Visual Studio Code, pressione F1 para abrir a paleta de comandos. Na paleta de comandos,
pesquise e selecione Azure Functions: Create new project... .
2. Escolha um local de diretório para o workspace do projeto e escolha Selecionar.
NOTE
Estas etapas foram projetadas para serem concluídas fora de um workspace. Nesse caso, não selecione uma
pasta de projeto que faz parte de um workspace.
Selecione um modelo para a Gatilho HTTP Crie uma função disparada por
primeira função do projeto HTTP no novo aplicativo de
funções.
O Visual Studio Code cria o projeto de aplicativo de função em um novo workspace. Este projeto contém os
arquivos de configuração host.json e local.settings.json, além de quaisquer arquivos de projeto específicos a
uma linguagem.
Uma nova função disparada por HTTP também é criada na pasta HttpTrigger do projeto do aplicativo de
função.
3. Cole a URL para a solicitação HTTP na barra de endereços do navegador. Acrescente o valor de cadeia
de consulta ?name=<yourname> a essa URL e execute a solicitação. A execução é pausada quando o
ponto de interrupção é atingido.
4. Quando você continua a execução, o exemplo a seguir mostra a resposta no navegador à solicitação
GET:
Entrar no Azure
Antes de poder publicar seu aplicativo, você precisa entrar no Azure.
1. Na área Azure: Functions, escolha Entrar no Azure… . Se você não tiver uma, poderá Criar uma
conta gratuita do Azure.
IMPORTANT
Publicar em um aplicativo de funções existente substitui o conteúdo desse aplicativo no Azure.
1. No Visual Studio Code, pressione F1 para abrir a paleta de comandos. Na paleta de comandos,
pesquise e selecione Azure Functions: Deploy to function app... .
2. Se você ainda não estiver conectado, será solicitado a Entrar no Azure. Você também pode Criar uma
conta gratuita do Azure. Após entrar pelo navegador, volte ao Visual Studio Code.
3. Se você tiver mais de uma assinatura, Escolha uma assinatura para o aplicativo de funções e, em
seguida, escolha + Criar novo aplicativo de funções no Azure.
4. Digite um nome globalmente exclusivo que identifica seu aplicativo de funções e pressione Enter.
Caracteres válidos para um nome de aplicativo de funções são a-z , 0-9 e - .
Quando você pressiona Enter, os seguintes recursos do Azure são criados em sua assinatura:
Grupo de recursos : Contém todos os recursos criados do Azure. O nome é baseado no nome de
seu aplicativo de funções.
Conta de armazenamento : Uma conta de armazenamento padrão é criada com um nome
exclusivo baseado no nome de seu aplicativo de funções.
Plano de hospedagem : Um plano de consumo é criado na região Oeste dos EUA para hospedar
seu aplicativo de funções sem servidor.
Aplicativo de funções: Seu projeto é implantado e executado no novo aplicativo de funções.
Uma notificação é exibida depois que seu aplicativo de funções é criado e o pacote de implantação é
aplicado. Escolha Exibir Saída nessa notificação para exibir a criação e os resultados da implantação,
incluindo os recursos do Azure que você criou.
5. De volta na área Azure: Functions, expanda o novo aplicativo de funções em sua assinatura. Expanda
Funções, clique com botão direito do mouse em HttpTrigger e, em seguida, escolha Copiar URL da
função.
Executar a função no Azure
1. Copie a URL do gatilho de HTTP do painel Saída. Essa URL inclui a chave de função, que é passada
para o parâmetro de consulta code . Assim como anteriormente, certifique-se de adicionar o valor de
cadeia de caracteres de consulta ?name=<yourname> a essa URL e execute a solicitação.
A URL que chama a função HTTP disparada deve estar no seguinte formato:
http://<functionappname>.azurewebsites.net/api/<functionname>?code=<function_key>&name=<yourname>
2. Cole essa nova URL para a solicitação HTTP na barra de endereços do navegador. O exemplo a seguir
mostra a resposta no navegador à solicitação GET remota retornada pela função:
Próximas etapas
Você usou o Visual Studio Code para criar um aplicativo de funções com uma função disparada por HTTP
simples. No próximo artigo, você pode expandir essa função adicionando uma associação de saída. Essa
associação grava a cadeia de caracteres da solicitação HTTP em uma mensagem em uma fila do
Armazenamento de Filas do Azure. O próximo artigo também mostra como limpar esses novos recursos do
Azure, removendo o grupo de recursos que você criou.
Adicionar uma associação de fila do Armazenamento do Azure à sua função
Criar sua primeira função do PowerShell no Azure
07/11/2019 • 12 minutes to read • Edit Online
Este artigo de Início Rápido explica como criar sua primeira função sem servidor do PowerShell usando o Visual
Studio Code.
Você usará a Extensão Azure Functions para Visual Studio Code para criar uma função do PowerShell
localmente e, em seguida, implantá-la em um novo aplicativo de funções no Azure. Atualmente, a extensão está
em versão prévia. Para obter mais informações, consulte a página da extensão Extensão Azure Functions para
Visual Studio Code.
NOTE
No momento, o suporte do PowerShell para a extensão do Azure Functions está desabilitado por padrão. A habilitação do
suporte do PowerShell é uma das etapas deste artigo.
As etapas a seguir são compatíveis com macOS, Windows e sistemas operacionais baseados em Linux.
Pré-requisitos
Para concluir este guia de início rápido:
Instale o PowerShell Core
Instale o Visual Studio Code em uma das plataformas compatíveis.
Instale a extensão do PowerShell para Visual Studio Code.
Instale o SDK do .NET Core 2.2 e posterior (necessário para o Azure Functions Core Tools e disponível
em todas as plataformas compatíveis).
Instale a versão 2.x do Azure Functions Core Tools.
Você também precisará de uma assinatura ativa do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
3. Reinicie o Visual Studio Code e selecione o ícone do Azure na barra Atividade. Você deve ver uma área do
Azure Functions na barra lateral.
Crie um projeto de aplicativo de funções
O modelo de projeto do Azure Functions no Visual Studio Code cria um projeto que pode ser publicado em um
aplicativo de funções no Azure. Um aplicativo de funções permite a você agrupar funções como uma unidade
lógica para o gerenciamento, implantação e compartilhamento de recursos.
1. No Visual Studio Code, selecione o logotipo do Azure para exibir a área Azure: Functions e, em seguida,
selecione o ícone Criar Projeto.
2. Escolha uma localização para seu workspace do projeto do Functions e escolha Selecionar.
NOTE
Este artigo foi projetado para ser concluídas fora de um workspace. Nesse caso, não selecione uma pasta de
projeto que faz parte de um workspace.
NOTE
O nível de autorização Função exige um valor de chave de função ao chamar o ponto de extremidade da função
no Azure. Isso dificulta para outras pessoas chamarem a função.
3. Acrescente a cadeia de consulta ?name=<yourname> a essa URL e, em seguida, use Invoke-RestMethod para
executar a solicitação da seguinte maneira:
NOTE
Lembre-se de remover todas as chamadas a Wait-Debugger antes de publicar suas funções no Azure.
A criação de um aplicativo de funções no Azure apenas solicitará o nome do aplicativo de funções. Outros valores são
definidos para você. Defina azureFunctions.advancedCreation como true para que seja solicitado a fornecer todos os
outros valores.
IMPORTANT
Publicar em um aplicativo de funções existente substitui o conteúdo desse aplicativo no Azure.
1. No Visual Studio Code, pressione F1 para abrir a paleta de comandos. Na paleta de comandos, pesquise
e selecione Azure Functions: Deploy to function app... .
2. Se você ainda não estiver conectado, será solicitado a Entrar no Azure. Você também pode Criar uma
conta gratuita do Azure. Após entrar pelo navegador, volte ao Visual Studio Code.
3. Se você tiver mais de uma assinatura, Escolha uma assinatura para o aplicativo de funções e, em
seguida, escolha + Criar novo aplicativo de funções no Azure.
4. Digite um nome globalmente exclusivo que identifica seu aplicativo de funções e pressione Enter.
Caracteres válidos para um nome de aplicativo de funções são a-z , 0-9 e - .
Quando você pressiona Enter, os seguintes recursos do Azure são criados em sua assinatura:
Grupo de recursos : Contém todos os recursos criados do Azure. O nome é baseado no nome de seu
aplicativo de funções.
Conta de armazenamento : Uma conta de armazenamento padrão é criada com um nome exclusivo
baseado no nome de seu aplicativo de funções.
Plano de hospedagem : Um plano de consumo é criado na região Oeste dos EUA para hospedar seu
aplicativo de funções sem servidor.
Aplicativo de funções: Seu projeto é implantado e executado no novo aplicativo de funções.
Uma notificação é exibida depois que seu aplicativo de funções é criado e o pacote de implantação é
aplicado. Escolha Exibir Saída nessa notificação para exibir a criação e os resultados da implantação,
incluindo os recursos do Azure que você criou.
5. De volta na área Azure: Functions, expanda o novo aplicativo de funções em sua assinatura. Expanda
Funções, clique com botão direito do mouse em HttpTrigger e, em seguida, escolha Copiar URL da
função.
StatusCode : 200
StatusDescription : OK
Content : Hello PowerShell
RawContent : HTTP/1.1 200 OK
Content-Length: 16
Content-Type: text/plain; charset=utf-8
Date: Thu, 25 Apr 2019 16:01:22 GMT
Hello PowerShell
Forms : {}
Headers : {[Content-Length, 16], [Content-Type, text/plain; charset=utf-8], [Date, Thu, 25 Apr
2019 16:01:22 GMT]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 16
Próximas etapas
Você usou o Visual Studio Code para criar um aplicativo de funções do PowerShell com uma função simples
disparada por HTTP. Talvez você também deseje saber mais sobre como depurar uma função do PowerShell
localmente usando o Azure Functions Core Tools. Confira o guia do desenvolvedor do PowerShell do Azure
Functions.
Habilitar a integração do Application Insights
Criar uma função disparada por HTTP no Azure
29/10/2019 • 13 minutes to read • Edit Online
Este artigo mostra como usar ferramentas de linha de comando para criar um projeto do Python executado
no Azure Functions. Também é possível criar uma função disparada por uma solicitação HTTP. Por fim, você
publicará seu projeto para ser executado como uma função sem servidor no Azure.
Este artigo é o primeiro de dois inícios rápidos do Python para o Azure Functions. Depois de concluir este
início rápido, você poderá adicionar uma associação de saída de fila do Armazenamento do Azure à sua
função.
Pré-requisitos
Antes de começar, é necessário:
Instale o Python 3.6.8. Essa versão do Python é verificada com o Functions. Ainda não há suporte
para a versão 3.7 e versões posteriores.
Instale o Azure Functions Core Tools versão 2.7.1575 ou posterior.
Instalar a CLI do Azure versão 2.x ou posterior.
Ter uma assinatura ativa do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
NOTE
Se o Python não instalou o venv em sua distribuição do Linux, você pode instalá-lo usando o seguinte comando:
Bash:
py -m venv .venv
.venv\scripts\activate
Agora que você ativou o ambiente virtual, execute os comandos restantes nele. Para sair do ambiente
virtual, execute deactivate .
Criar um projeto local do Functions
Um projeto do Functions é o equivalente a um aplicativo de funções no Azure. Ele pode conter várias
funções que compartilham as mesmas configurações locais e de hospedagem.
1. No ambiente virtual, execute o seguinte comando:
cd MyFunctionProj
func new
Quando o host do Azure Functions é iniciado, ele escreve algo parecido com a seguinte saída. Ele
está truncado aqui para que você possa ler melhor:
%%%%%%
%%%%%%
@ %%%%%% @
@@ %%%%%% @@
@@@ %%%%%%%%%%% @@@
@@ %%%%%%%%%% @@
@@ %%%% @@
@@ %%% @@
@@ %% @@
%%
%
...
...
Http Functions:
HttpTrigger: http://localhost:7071/api/HttpTrigger
2. Copie a URL da função HttpTrigger da saída do tempo de execução de função e cole-a na barra de
endereços do navegador.
3. Acrescente o valor de cadeia de consulta ?name=<yourname> a essa URL e execute a solicitação. A
captura de tela a seguir mostra a resposta no navegador à solicitação GET retornada pela função
local:
Em geral, você cria seu grupo de recursos e os recursos em uma região próxima a você.
NOTE
Você não pode hospedar aplicativos Windows e Linux no mesmo grupo de recursos. Se você tiver um grupo de
recursos chamado myResourceGroup com um aplicativo de funções ou um aplicativo Web do Windows, você
precisará usar um grupo de recursos diferente.
O comando anterior também provisiona uma instância do Aplicativo Azure insights associada no mesmo
grupo de recursos. Você pode usar essa instância para monitorar seu aplicativo de funções e exibir logs.
Agora você está pronto para publicar seu projeto de funções local no aplicativo de funções no Azure.
A opção --build remote cria seu projeto do Python remotamente no Azure usando os arquivos no pacote
de implantação.
Você verá uma saída semelhante ao exemplo a seguir. Ele está truncado aqui para que você possa ler
melhor:
Preparing archive...
Uploading content...
Upload completed successfully.
Deployment completed successfully.
Syncing triggers...
Functions in myfunctionapp:
HttpTrigger - [httpTrigger]
Invoke url: https://myfunctionapp.azurewebsites.net/api/httptrigger?
code=cCr8sAxfBiow548FBDLS1....
Você pode copiar o valor Invoke url para seu HttpTrigger e usá-lo para verificar sua função no Azure. A
URL contém um valor de cadeia de caracteres de consulta code que é sua tecla de função, o que dificulta
para outras pessoas chamarem seu ponto de extremidade de gatilho HTTP no Azure.
Cole também a URL copiada, incluindo a chave de função, na barra de endereços do navegador da Web.
Acrescente novamente o valor de cadeia de consulta &name=<yourname> à URL e execute a solicitação.
NOTE
Para exibir logs quase em tempo real para um aplicativo do Python publicado, use o Application Insights Live Metrics
Stream.
Próximas etapas
Você criou um projeto de funções do Python com uma função disparada por HTTP, executou-a no
computador local e implantou-a no Azure. Agora, estenda sua função por meio da...
Adição de uma associação de saída de fila do Armazenamento do Azure
Conectar funções ao Armazenamento do Azure
usando o Visual Studio
24/10/2019 • 13 minutes to read • Edit Online
O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever
seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na
definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo
especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações de
entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.
Este artigo mostra como usar Visual Studio para conectar a função criada no artigo de Início Rápido anterior do
Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados da solicitação
HTTP em uma mensagem na fila.
A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço
vinculado. Para facilitar, use a Conta de armazenamento que você criou com o seu aplicativo de funções. A conexão
com essa conta já está armazenada em uma configuração de aplicativo chamada AzureWebJobsStorage .
Pré-requisitos
Antes de iniciar este artigo, você deve:
Concluir a [parte 1 do Início Rápido do Visual Studio][./functions-create-first-function-vs-code.md].
Entrar em sua assinatura do Azure por meio do Visual Studio.
using Microsoft.Azure.WebJobs.Extensions.Storage;
O parâmetro msg é um tipo ICollector<T> , que representa uma coleção de mensagens que são gravadas em uma
associação de saída quando a função é concluída. Nesse caso, a saída é uma fila de armazenamento denominada
outqueue . A cadeia de conexão para a Conta de armazenamento é definida pelo StorageAccountAttribute . Esse
atributo indica a configuração que contém a cadeia de conexão da Conta de armazenamento e pode ser aplicada no
nível de classe, método ou parâmetro. Nesse caso, você poderia omitir StorageAccountAttribute porque já está
usando a conta de armazenamento padrão.
A definição do método Executar deve agora se parecer com o seguinte:
[FunctionName("HttpTrigger")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, ILogger log)
if (!string.IsNullOrEmpty(name))
{
// Add a message to the output collection.
msg.Add(string.Format("Name passed to the function: {0}", name));
}
[FunctionName("HttpTrigger")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
if (!string.IsNullOrEmpty(name))
{
// Add a message to the output collection.
msg.Add(string.Format("Name passed to the function: {0}", name));
}
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você atualizou sua função disparada por HTTP para gravar dados em uma Fila de armazenamento. Para saber mais
sobre o desenvolvimento do Functions, confira Desenvolver o Azure Functions usando o Visual Studio.
Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções:
Habilitar a integração do Application Insights
Conectar a função Java ao Armazenamento do Azure
24/10/2019 • 13 minutes to read • Edit Online
O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever
seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na
definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo
especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações de
entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.
Este artigo mostra como integrar a função criada no artigo de início rápido anterior com uma fila de
Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados de uma
solicitação HTTP em uma mensagem na fila.
A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço
vinculado. Para facilitar essa conexão, use a conta de armazenamento que você criou com o seu aplicativo de
funções. A conexão com essa conta já está armazenada em uma configuração de aplicativo chamada
AzureWebJobsStorage .
Pré-requisitos
Antes de iniciar este artigo, conclua as etapas na parte 1 do início rápido do Java.
IMPORTANT
Esse comando substitui todas as configurações existentes por valores do aplicativo de funções no Azure.
Como ela contém segredos, o arquivo local.settings.json nunca é publicado e deve ser excluído do controle do código-fonte.
É necessário ter o valor AzureWebJobsStorage , que é a cadeia de conexão da Conta de armazenamento. Use esta
conexão para verificar se a associação de saída funciona conforme o esperado.
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
O parâmetro msg é um tipo OutputBinding<T> , que representa uma coleção de cadeias de caracteres que são
gravadas como mensagens em uma associação de saída quando a função é concluída. Nesse caso, a saída é uma
fila de armazenamento denominada outqueue . A cadeia de conexão para a conta de armazenamento é definida
pelo método connection . Em vez da própria cadeia de conexão, passe a configuração de aplicativo que contém a
cadeia de conexão da conta de armazenamento.
A definição do método run agora deverá ser semelhante ao seguinte exemplo:
@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel =
AuthorizationLevel.FUNCTION)
HttpRequestMessage<Optional<String>> request,
@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage")
OutputBinding<String> msg, final ExecutionContext context) {
...
}
msg.setValue(name);
Ao usar uma associação de saída, não é necessário usar o código do SDK do Armazenamento do Azure para se
autenticar, para obter uma referência de fila ou para escrever dados. O tempo de execução do Functions e a
associação de saída da fila fazem essas tarefas para você.
O método run agora deverá ser semelhante ao seguinte exemplo:
@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel =
AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage")
OutputBinding<String> msg, final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
if (name == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query
string or in the request body").build();
} else {
// Write the name to the message queue.
msg.setValue(name);
Atualizar os testes
Como o arquétipo também cria um conjunto de testes, você precisa atualizar esses testes para manipular o novo
parâmetro msg na assinatura do método run .
Procure a localização do código de teste em src/test/java, abra o arquivo de projeto Function.java e substitua a
linha de código em //Invoke pelo código a seguir.
@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
// Invoke
final HttpResponseMessage ret = new Function().run(req, msg, context);
Agora você está pronto para experimentar a nova associação de saída localmente.
NOTE
Como você habilitou os pacotes de extensões no host.json, a extensão de associação do armazenamento foi baixada e
instalada para você durante a inicialização, juntamente com outras extensões de associação da Microsoft.
Como anteriormente, dispare a função na linha de comando usando o cURL em uma nova janela de terminal:
Dessa vez, a associação de saída também cria uma fila denominada outqueue em sua Conta de armazenamento e
adiciona uma mensagem com essa mesma cadeia de caracteres.
Em seguida, use a CLI do Azure para exibir a nova fila e verifique se uma mensagem foi adicionada. Também é
possível exibir sua fila usando o Gerenciador de Armazenamento do Microsoft Azure ou no portal do Azure.
Definir a conexão da Conta de armazenamento
Abra o arquivo local.settings.json e copie o valor de AzureWebJobsStorage , que é a cadeia de conexão da Conta de
armazenamento. Defina a variável de ambiente AZURE_STORAGE_CONNECTION_STRING como a cadeia de conexão
usando o seguinte comando do Bash:
AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"
A saída desse comando inclui uma fila denominada outqueue , que é a fila que foi criada quando a função foi
executada.
Em seguida, use o comando az storage message peek para exibir as mensagens nessa fila, como no exemplo a
seguir:
echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --
decode`
A cadeia de caracteres retornada deve ser a mesma que a mensagem enviada para testar a função.
NOTE
O exemplo anterior decodifica a cadeia de caracteres retornada de base64. Isso ocorre porque as associações de
Armazenamento de fila gravam e leem do Armazenamento do Azure como cadeias de caracteres base64.
Reimplantar o projeto
Para atualizar o aplicativo publicado, execute o seguinte comando novamente:
mvn azure-functions:deploy
Novamente, use o cURL para testar a função implantada. Como anteriormente, passe o valor AzureFunctions no
corpo da solicitação POST para a URL, como neste exemplo:
Examine a mensagem da Fila de armazenamento novamente para verificar se a associação de saída gera uma nova
mensagem na fila, conforme esperado.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja continuar com Inícios Rápidos
ou tutoriais subsequentes, não limpe os recursos criados neste Início Rápido. Se você não planeja continuar, use o
comando a seguir para excluir todos os recursos criados neste Início Rápido:
Próximas etapas
Você atualizou a função disparada por HTTP para gravar dados em uma fila de armazenamento. Para saber mais
sobre como desenvolver o Azure Functions com o Java, confira o Guia do desenvolvedor de Java para o Azure
Functions e Gatilhos e associações do Azure Functions. Para obter exemplos de projetos completos de funções em
Java, confira as Amostras de funções Java.
Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções:
Habilitar a integração do Application Insights
Conectar funções ao Armazenamento do Azure
usando o Visual Studio Code
24/10/2019 • 20 minutes to read • Edit Online
O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever
seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na
definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo
especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações de
entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.
Este artigo mostra como usar Visual Studio Code para conectar a função criada no artigo de início rápido anterior
ao Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados da solicitação
HTTP em uma mensagem na fila.
A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço
vinculado. Para facilitar, use a Conta de armazenamento que você criou com o seu aplicativo de funções. A conexão
com essa conta já está armazenada em uma configuração de aplicativo chamada AzureWebJobsStorage .
Pré-requisitos
Antes de iniciar este artigo, você deve atender aos seguintes requisitos:
Instale a extensão de Armazenamento do Azure para o Visual Studio Code.
Instale o Gerenciador de Armazenamento do Azure. O Gerenciador de Armazenamento é uma ferramenta que
você usará para examinar as mensagens da fila geradas pela associação de saída. O Gerenciador de
Armazenamento tem suporte em sistemas operacionais baseados em macOS, Windows e Linux.
Instale ferramentas de CLI do .NET Core (somente projetos C#).
Conclua as etapas na parte 1 do início rápido do Visual Studio Code.
Este artigo pressupõe que você já esteja conectado à sua assinatura do Azure do Visual Studio Code. Você pode
entrar executando Azure: Sign In na paleta de comandos.
2. Escolha o aplicativo de função que você criou no artigo anterior. Selecione Sim para todos para substituir
as configurações locais existentes.
IMPORTANT
Como ela contém segredos, o arquivo local.settings.json nunca é publicado e é excluído do controle do código-fonte.
3. Copie o valor AzureWebJobsStorage , que é a chave do valor da cadeia de conexão da Conta de
armazenamento. Use esta conexão para verificar se a associação de saída funciona conforme o esperado.
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Selecionar associação com direção... Azure Queue Storage A associação é uma associação de fila do
Armazenamento do Azure.
O nome usado para identificar essa msg Nome que identifica o parâmetro de
associação em seu código associação referenciado em seu código.
PROMPT VALOR DESCRIÇÃO
Uma associação é incluída na matriz bindings no seu arquivo function.json, que agora deve se parecer com o
seguinte exemplo:
{
...
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
3. Cole a URL para a solicitação HTTP na barra de endereços do navegador. Acrescente o valor de cadeia de
consulta ?name=<yourname> a essa URL e execute a solicitação. A execução é pausada quando o ponto de
interrupção é atingido.
4. Quando você continua a execução, o exemplo a seguir mostra a resposta no navegador à solicitação GET:
5. Para interromper a depuração, pressione Shift + F5.
Uma nova fila denominada outqueue é criada na sua conta de armazenamento pelo tempo de execução do
Functions quando a associação de saída é usada pela primeira vez. Você usará o Gerenciador de Armazenamento
para verificar se a fila foi criada junto com a nova mensagem.
Conectar o Gerenciador de Armazenamento à sua conta
Ignore esta seção se você já instalou o Gerenciador de Armazenamento do Azure e o conectou à sua conta do
Azure.
1. Execute a ferramenta Gerenciador de Armazenamento do Azure, selecione o ícone de conexão à esquerda e
selecione Adicionar uma conta.
2. Na caixa de diálogo Conectar, escolha Adicionar uma conta do Azure, escolha seu Ambiente do Azure
e selecione Entrar... .
Depois de entrar na sua conta, você verá todas as assinaturas do Azure associadas à ela.
Examinar a fila de saída
1. No Visual Studio Code, pressione a tecla F1 para abrir a paleta de comandos, em seguida, procure e execute
o comando Azure Storage: Open in Storage Explorer e escolha o nome da sua conta de armazenamento.
Sua conta de armazenamento é aberta no Gerenciador de Armazenamento do Azure.
2. Expanda o nó Filas e selecione a fila denominada outqueue.
A fila contém a mensagem que a associação de saída de fila criou quando você executou a função disparada
por HTTP. Se você tiver invocado a função com o valor name padrão do Azure, a mensagem da fila será
Nome transmitido à função: Azure.
3. Execute a função novamente, envie outra solicitação e você verá uma nova mensagem na fila.
Agora, chegou a hora de republicar o aplicativo de funções atualizado no Azure.
curl https://myfunctionapp.azurewebsites.net/api/httptrigger?code=cCr8sAxfBiow548FBDLS1....&name=
<yourname>
4. Novamente, Examinar a Mensagem da fila de armazenamento para verificar se a associação de saída gera
novamente uma nova mensagem na fila.
Limpar recursos
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No Visual Studio Code, pressione F1 para abrir a paleta de comandos. Na paleta de comandos, pesquise e
selecione Azure Functions: Open in portal .
2. Escolha seu aplicativo de funções e pressione Enter. A página do aplicativo de funções é aberta no portal do
Azure.
3. Na guia Visão geral, selecione o link nomeado em Grupo de Recursos.
4. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
5. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você atualizou sua função disparada por HTTP para gravar dados em uma Fila de armazenamento. Para saber mais
sobre o desenvolvimento de funções, confira Desenvolver Funções do Azure usando o Visual Studio Code.
Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções:
Habilitar a integração do Application Insights
Adicionar uma associação de fila do Armazenamento
do Azure à sua função do Python
24/10/2019 • 14 minutes to read • Edit Online
O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever
seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na
definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo
especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações de
entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.
Este artigo mostra como integrar a função criada no artigo de início rápido anterior com uma fila de
Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados de uma solicitação
HTTP em uma mensagem na fila.
A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço
vinculado. Para facilitar essa conexão, use a conta de armazenamento que você criou com o seu aplicativo de
funções. A conexão com essa conta já está armazenada em uma configuração de aplicativo chamada
AzureWebJobsStorage .
Pré-requisitos
Antes de iniciar este artigo, conclua as etapas na parte 1 do início rápido do Python.
NOTE
Os comandos da CLI do Azure neste artigo funcionam em Bash e são verificados para serem executados no Azure Cloud
Shell. Você deve modificá-los para eles serem executados em um prompt de comando local do Windows.
IMPORTANT
Esse comando substitui todas as configurações existentes por valores do aplicativo de funções no Azure.
Como ela contém segredos, o arquivo local.settings.json nunca é publicado e deve ser excluído do controle do código-fonte.
É necessário ter o valor AzureWebJobsStorage , que é a cadeia de conexão da Conta de armazenamento. Use esta
conexão para verificar se a associação de saída funciona conforme o esperado.
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Selecionar associação com direção... Azure Queue Storage A associação é uma associação de fila do
Armazenamento do Azure.
O nome usado para identificar essa msg Nome que identifica o parâmetro de
associação em seu código associação referenciado em seu código.
Uma associação é incluída na matriz bindings no seu arquivo function.json, que agora deve se parecer com o
seguinte exemplo:
{
...
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')
if name:
msg.set(name)
return func.HttpResponse(f"Hello {name}!")
else:
return func.HttpResponse(
"Please pass a name on the query string or in the request body",
status_code=400
)
Ao usar uma associação de saída, não é necessário usar o código do SDK do Armazenamento do Azure para se
autenticar, para obter uma referência de fila ou para escrever dados. O tempo de execução do Functions e a
associação de saída da fila fazem essas tarefas para você.
NOTE
Como você habilitou os pacotes de extensões no host.json, a extensão de associação do armazenamento foi baixada e
instalada para você durante a inicialização, juntamente com outras extensões de associação da Microsoft.
Copie a URL da função HttpTrigger da saída do tempo de execução de função e cole-a na barra de endereços do
navegador. Acrescente o valor de cadeia de consulta ?name=<yourname> a essa URL e execute a solicitação. Você
deve ver a mesma resposta no navegador como você viu no artigo anterior.
Dessa vez, a associação de saída também cria uma fila denominada outqueue em sua Conta de armazenamento e
adiciona uma mensagem com essa mesma cadeia de caracteres.
Em seguida, use a CLI do Azure para exibir a nova fila e verifique se uma mensagem foi adicionada. Também é
possível exibir sua fila usando o Gerenciador de Armazenamento do Microsoft Azure ou no portal do Azure.
Definir a conexão da Conta de armazenamento
Abra o arquivo local.settings.json e copie o valor de AzureWebJobsStorage , que é a cadeia de conexão da Conta de
armazenamento. Defina a variável de ambiente AZURE_STORAGE_CONNECTION_STRING como a cadeia de conexão usando
o seguinte comando do Bash:
AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"
Quando você definir a cadeia de conexão na variável de ambiente AZURE_STORAGE_CONNECTION_STRING , é possível
acessar a conta de Armazenamento sem ter que fornecer a autenticação toda vez.
Consultar a Fila de armazenamento
É possível usar o comando az storage queue list para exibir as Filas de armazenamento em sua conta, como no
exemplo a seguir:
A saída desse comando inclui uma fila denominada outqueue , que é a fila que foi criada quando a função foi
executada.
Em seguida, use o comando az storage message peek para exibir as mensagens nessa fila, como no exemplo a
seguir:
echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --
decode`
A cadeia de caracteres retornada deve ser a mesma que a mensagem enviada para testar a função.
NOTE
O exemplo anterior decodifica a cadeia de caracteres retornada de base64. Isso ocorre porque as associações de
Armazenamento de fila gravam e leem do Armazenamento do Azure como cadeias de caracteres base64.
Reimplantar o projeto
Para atualizar o aplicativo publicado, use o comando func azure functionapp publish do Core Tools para implantar
o código do projeto no Azure. Nesse exemplo, substitua <APP_NAME> pelo nome de seu aplicativo.
Novamente, é possível usar cURL ou um navegador para testar a função implantada. Como antes, acrescente a
cadeia de caracteres de consulta &name=<yourname> à URL, como mostrado no exemplo a seguir:
curl https://myfunctionapp.azurewebsites.net/api/httptrigger?code=cCr8sAxfBiow548FBDLS1....&name=<yourname>
Examine a mensagem da Fila de armazenamento novamente para verificar se a associação de saída gera uma nova
mensagem na fila, conforme esperado.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja continuar com Inícios Rápidos
ou tutoriais subsequentes, não limpe os recursos criados neste Início Rápido. Se você não planeja continuar, use o
comando a seguir para excluir todos os recursos criados neste Início Rápido:
Próximas etapas
Você atualizou a função disparada por HTTP para gravar dados em uma fila de armazenamento. Para saber mais
sobre como desenvolver o Azure Functions usando o Python, confira o Guia do desenvolvedor de Python para o
Azure Functions e Gatilhos e associações do Azure Functions. Para obter exemplos de projetos de funções
completos no Python, confira os Exemplos de funções de Python.
Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções:
Habilitar a integração do Application Insights
Criar uma função que se integra aos Aplicativos
Lógicos do Azure
07/11/2019 • 20 minutes to read • Edit Online
O Azure Functions integra-se aos Aplicativos Lógicos do Azure no Designer de Aplicativos Lógicos. Essa
integração permite usar o poder de computação do Functions em orquestrações com outros serviços de terceiros
e do Azure.
Este tutorial mostra como usar o Functions com os Aplicativos Lógicos e os Serviços Cognitivos no Azure para
executar a análise de sentimento de postagens do Twitter. Uma função HTTP disparada categoriza tweets com
cores verde, amarelo ou vermelho com base na pontuação de sentimento. Um email é enviado quando um
sentimento inadequado é detectado.
Pré-requisitos
Uma conta do Twitter ativa.
Uma conta do Outlook.com (para enviar notificações).
Este artigo usa como ponto de partida os recursos criados em Criar sua primeira função no portal do Azure.
Se você ainda não fez isso, conclua estas etapas agora para criar seu aplicativo de função.
Criar um recurso dos Serviços Cognitivos
As APIs de Serviços Cognitivos estão disponíveis no Azure como recursos individuais. Use a API de Análise de
Texto para detectar o sentimento dos tweets que estão sendo monitorados.
1. Entre no Portal do Azure.
2. Clique em Criar um recurso no canto superior esquerdo do Portal do Azure.
3. Clique em IA + Machine Learning > Análise de Texto. Em seguida, use as configurações especificadas
na tabela para criar o recurso.
6. Na coluna de navegação à esquerda, clique em Chaves, copie o valor da Chave 1 e salve-o em um editor
de texto. Você pode usar a chave para conectar o aplicativo lógico à API dos Serviços Cognitivos.
Nome do aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
#r "Newtonsoft.Json"
using System;
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
Esse código de função retorna uma categoria de cor com base na pontuação de sentimento recebida na
solicitação.
4. Para testar a função, clique em Testar na extremidade direita para expandir a guia Teste. Digite um valor de
0.2 para o corpo da solicitaçãoe clique em Executar. Um valor RED é retornado no corpo da resposta.
Agora você tem uma função que categoriza as pontuações de sentimento. Em seguida, você pode criar um
aplicativo lógico que integra sua função ao Twitter e à API dos Serviços Cognitivos.
4. Depois de inserir os valores de configurações corretos, clique em Criar para criar o aplicativo lógico.
5. Depois que o aplicativo for criado, clique em seu novo aplicativo lógico fixado no painel. Em seguida, no
Designer de Aplicativos Lógicos, role para baixo e clique no modelo Aplicativo Lógico em Branco.
Agora você pode usar o Designer de Aplicativos Lógicos para adicionar serviços e gatilhos ao aplicativo.
Conectar-se ao Twitter
Primeiro, crie uma conexão para sua conta do Twitter. O aplicativo lógico sonda tweets, o que dispara a execução
do aplicativo.
1. No designer, clique no serviço Twitter e clique no gatilho Quando um novo tweet é publicado. Entre na
sua conta do Twitter e autorize os Aplicativos Lógicos a usar sua conta.
2. Use as configurações de gatilho do Twitter conforme especificado na tabela.
3. Digite um nome de conexão, como MyCognitiveServicesConnection , cole a chave da API dos Serviços
Cognitivos e o ponto de extremidade de Serviços Cognitivos que você anotou em um editor de texto e
clique em Criar.
4. Em seguida, insira Texto do Tweet na caixa de texto e clique em Nova Etapa.
Agora que a detecção de sentimento está configurada, você pode adicionar uma conexão à função que consome a
saída da pontuação de sentimento.
Agora, sua função é disparada quando uma pontuação de sentimento é enviada do aplicativo lógico. Uma
categoria com codificação de cores é retornada para o aplicativo lógico pela função. Em seguida, adicione uma
notificação por email que é enviada quando um valor de sentimento RED é retornado pela função.
5. Quando um sentimento potencialmente negativo é detectado, você recebe um email. Se você ainda não
recebeu um email, poderá alterar o código de função para retornar RED sempre que:
Agora você viu como é fácil integrar o Functions a um fluxo de trabalho dos Aplicativos Lógicos.
Próximas etapas
Neste tutorial, você aprendeu como:
Crie um Recurso de API de Serviços Cognitivos.
Crie uma função que categorize o sentimento do tweet.
Crie um aplicativo lógico que se conecte ao Twitter.
Adicione a detecção de sentimento ao aplicativo lógico.
Conecte o aplicativo lógico à função.
Envie um email com base na resposta da função.
Vá para o próximo tutorial para aprender a criar uma API sem servidor para sua função.
Criar uma API sem servidor usando o Azure Functions
Para saber mais sobre os Aplicativos Lógicos, consulte Aplicativos Lógicos do Azure.
Crie uma definição de OpenAPI para uma API sem
servidor usando o Gerenciamento de API do Azure
07/11/2019 • 13 minutes to read • Edit Online
APIs REST geralmente são descritas usando uma definição de OpenAPI. Esta definição contém informações sobre
as operações que estão disponíveis em uma API e como os dados de solicitação e resposta para a API devem ser
estruturados.
Neste tutorial, você deve criar uma função que determina se um reparo de emergência em uma turbina eólica é
eficaz em termos de custo. Em seguida, crie uma definição de OpenAPI para o aplicativo de funções usando o
Gerenciamento de API do Azure para que a função possa ser chamada de outros aplicativos e serviços.
Neste tutorial, você aprenderá como:
Criar uma função no Azure
Gerar uma definição de OpenAPI usando o Gerenciamento de API do Azure
Testar a definição chamando a função
Baixar a definição de OpenAPI
Nome do aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
Criar a função
Este tutorial usa uma função disparada por HTTP que usa dois parâmetros:
O tempo estimado para reparar uma turbina, em horas.
A capacidade da turbina, em quilowatts.
A função, em seguida, calcula o custo do reparo e o valor da receita que a turbina proporcionaria em um período
de 24 horas. PARA criar uma função disparada pelo HTTP no portal do Azure.
1. Expanda seu aplicativo de funções e selecione o botão + ao lado de Functions. Selecione No portal >
Continuar.
2. Selecione Mais modelos... e, em seguida, Concluir e exibir modelos
3. Selecione o acionador HTTP, digite TurbineRepair para sua função Nome, escolha Function para Nível
de autenticação e, em seguida, selecione Criar.
4. Substitua o conteúdo do arquivo do script C# run.csx pelo código abaixo e selecione Salvar:
#r "Newtonsoft.Json"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
Esse código de função retorna uma mensagem de Yes ou No para indicar se um reparo de emergência é
econômico, bem como as oportunidades de receita que representa a turbina e o custo para reparar a
turbina.
5. Para testar a função, clique em Testar na extremidade direita para expandir a guia Teste. Digite o seguinte
valor para o Corpo da solicitação e clique em Executar.
{
"hours": "6",
"capacity": "2500"
}
O valor a seguir é retornado no corpo da resposta.
{"message":"Yes","revenueOpportunity":"$7200","costToFix":"$1600"}
Agora você tem uma função que determina o custo-benefício de reparos de emergências. Em seguida, você pode
gerar uma definição de OpenAPI para o aplicativo de funções.
3. Escolha Criar para criar a instância de Gerenciamento de API, o que pode levar vários minutos.
4. Selecione Habilitar o Application Insights para enviar logs para o mesmo local que o aplicativo de
função, aceite os padrões restantes e selecione API de link.
5. Importar Funções do Azure é exibido com a função TurbineRepair realçada. Clique em Selecionar para
continuar.
Testar a API
Antes de usar a definição de OpenAPI, você deve verificar se a API funciona.
1. Na guia Testar da sua função, selecione a operação POST.
2. Insira valores para horas e capacidade
{
"hours": "6",
"capacity": "2500"
}
Limpar recursos
Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você não espera precisar
desses recursos no futuro, poderá excluí-los ao excluir o grupo de recursos.
No menu do portal do Azure ou na página Inicial, selecione Grupos de Recursos e, na página Grupos de
Recursos, selecione myResourceGroup.
Na página myResourceGroup, certifique-se de que os recursos listados são aqueles que deseja excluir.
Selecione Excluir, digite myResourceGroup na caixa de texto e selecione Excluir.
Próximas etapas
Você usou a integração do Gerenciamento de API para gerar uma definição de OpenAPI de suas funções. Agora
você pode editar a definição no Gerenciamento de API no portal. Também é possível saber mais sobre o
Gerenciamento de API.
Editar a definição de OpenAPI no Gerenciamento de API
Tutorial: integrar funções com uma rede virtual do
Azure
07/11/2019 • 18 minutes to read • Edit Online
Este tutorial mostra como usar Azure Functions para se conectar a recursos em uma rede virtual do Azure. Você
criará uma função que tem acesso à Internet e a uma VM que executa o WordPress na rede virtual.
Criar um aplicativo de funções no plano Premium
Implantar um site do WordPress na VM em uma rede virtual
Conectar o aplicativo de funções à rede virtual
Criar um proxy de função para acessar recursos do WordPress
Solicitar um arquivo do WordPress de dentro da rede virtual
Topologia
O diagrama a seguir mostra a arquitetura da solução que você cria:
As funções em execução no plano Premium têm os mesmos recursos de hospedagem que os aplicativos Web no
serviço Azure App, que inclui o recurso de integração VNet. Para saber mais sobre a integração VNet, incluindo
solução de problemas e configuração avançada, confira integrar seu aplicativo a uma rede virtual do Azure.
Pré-requisitos
Para este tutorial, é importante que você compreenda o endereçamento IP e a sub-rede. Você pode começar com
Este artigo que aborda os conceitos básicos de endereçamento e sub-rede. Muitos outros artigos e vídeos estão
disponíveis online.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Nome do Aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
2. Escolha o desempenho máximo do WordPress LEMP nos resultados da pesquisa. Selecione um plano
de software de desempenho do WordPress LEMP Max para centos como o plano de software e
selecione criar.
3. Na guia noções básicas , use as configurações da VM, conforme especificado na tabela abaixo da imagem:
Agora você tem um site do WordPress implantado inteiramente em sua rede virtual. Esse site não pode ser
acessado pela Internet pública.
5. Selecione OK para adicionar a sub-rede. Feche as páginas integração VNet e status do recurso de rede
para retornar à página do aplicativo de funções.
O aplicativo de funções agora pode acessar a rede virtual onde o site do WordPress está em execução. Em
seguida, você usa proxies do Azure Functions para retornar um arquivo do site do WordPress.
Experimentar
1. No navegador, tente acessar a URL usada como a URL de back-end. Conforme esperado, a solicitação
atinge o tempo limite. Um tempo limite ocorre porque o site do WordPress está conectado somente à sua
rede virtual e não à Internet.
2. Copie o valor da URL do proxy do seu novo proxy e cole-o na barra de endereços do seu navegador. A
imagem retornada é do site do WordPress em execução dentro de sua rede virtual.
Seu aplicativo de funções está conectado à Internet e à sua rede virtual. O proxy está recebendo uma solicitação
pela Internet pública e, em seguida, agindo como um proxy HTTP simples para encaminhar essa solicitação para a
rede virtual conectada. Em seguida, o proxy transmite a resposta de volta para você publicamente pela Internet.
Limpar recursos
Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você não espera precisar
desses recursos no futuro, poderá excluí-los ao excluir o grupo de recursos.
No menu do portal do Azure ou na página Inicial, selecione Grupos de Recursos e, na página Grupos de
Recursos, selecione myResourceGroup.
Na página myResourceGroup, certifique-se de que os recursos listados são aqueles que deseja excluir.
Selecione Excluir, digite myResourceGroup na caixa de texto e selecione Excluir.
Próximas etapas
Neste tutorial, o site do WordPress serve como uma API que é chamada usando um proxy no aplicativo de
funções. Esse cenário faz um bom tutorial porque é fácil de configurar e Visualizar. Você pode usar qualquer outra
API implantada em uma rede virtual. Você também pode ter criado uma função com código que chama APIs
implantadas na rede virtual. Um cenário mais realista é uma função que usa APIs de cliente de dados para chamar
uma instância de SQL Server implantada na rede virtual.
As funções em execução em um plano Premium compartilham a mesma infraestrutura de serviço de aplicativo
subjacente que aplicativos Web em planos de PremiumV2. Toda a documentação dos aplicativos Web no serviço
Azure app se aplica às suas funções de plano Premium.
Saiba mais sobre as opções de rede no functions
Tutorial: Automatizar o redimensionamento de
imagens carregadas usando a Grade de Eventos
28/10/2019 • 19 minutes to read • Edit Online
A Grade de Eventos do Azure é um serviço de eventos para a nuvem. A Grade de Eventos permite criar
assinaturas em eventos gerados pelos serviços do Azure ou por recursos de terceiros.
Este tutorial é a segunda parte de uma série de tutoriais sobre o Armazenamento. Ele estende o tutorial anterior
sobre o Armazenamento para adicionar a geração automática de miniaturas sem servidor usando a Grade de
Eventos do Azure e o Azure Functions. A Grade de Eventos permite que o Azure Functions responda aos eventos
do armazenamento de Blobs do Azure e gere miniaturas das imagens carregadas. Uma assinatura de evento é
criada no evento de criação do armazenamento de Blobs. Quando um blob é adicionado a um contêiner de
armazenamento de Blobs específico, um ponto de extremidade de função é chamado. Os dados passados para a
associação de função da Grade de Eventos são usados para acessar o blob e gerar a imagem em miniatura.
Use a CLI do Azure e o portal do Azure para adicionar a funcionalidade de redimensionamento a um aplicativo
de upload de imagens existente.
.NET
SDK do Node.js V2
SDK do Node.js V10
Neste tutorial, você aprenderá como:
Criar uma conta geral do Armazenamento do Azure
Implantar o código sem servidor usando o Azure Functions
Criar uma assinatura de evento do armazenamento de Blobs na Grade de Eventos
Pré-requisitos
NOTE
Este artigo foi atualizado para usar o novo módulo Az do Azure PowerShell. Você ainda pode usar o módulo AzureRM, que
continuará a receber as correções de bugs até pelo menos dezembro de 2020. Para saber mais sobre o novo módulo Az e a
compatibilidade com o AzureRM, confira Apresentação do novo módulo Az do Azure PowerShell. Para obter instruções de
instalação do módulo Az, confira Instalar o Azure PowerShell.
OPÇÃO EXEMPLO/LINK
resourceGroupName=myResourceGroup
2. Defina uma variável para o nome da nova conta de armazenamento necessária para o Azure Functions.
functionstorage=<name of the storage account to be used by the function>
Agora você deve configurar o aplicativo de função para se conectar à conta de armazenamento de Blobs criada
no tutorial anterior.
blobStorageAccount=<name of the Blob storage account you created in the previous tutorial>
storageConnectionString=$(az storage account show-connection-string --resource-group $resourceGroupName \
--name $blobStorageAccount --query connectionString --output tsv)
A configuração FUNCTIONS_EXTENSION_VERSION=~2 faz com que o aplicativo de funções execute na versão 2.x do
Azure Functions Runtime.
Agora você pode implantar um projeto de código de função nesse aplicativo de funções.
A função de redimensionamento de imagem é disparada por solicitações HTTP enviadas a ele a partir do serviço
de Grade de Eventos. Você informa à Grade de Eventos que você deseja obter essas notificações na URL da
função criando uma assinatura de evento. Neste tutorial, você assina eventos criados de blob.
Os dados passados para a função da notificação de Grade de Eventos incluem a URL do blob. Essa URL, por sua
vez, é passada para a associação de entrada para obter a imagem carregada a partir do armazenamento de Blob.
A função gera uma imagem em miniatura e grava o fluxo resultante em um contêiner separado no
armazenamento de Blobs.
Este projeto usa EventGridTrigger para o tipo de gatilho. O uso do gatilho de Grade de Eventos é recomendado
em gatilhos HTTP genéricos. A Grade de Eventos valida automaticamente os gatilhos de Função da Grade de
Eventos. Com os gatilhos HTTP genéricos, você deve implementar a resposta de validação.
.NET
SDK do Node.js V2
SDK do Node.js V10
Para saber mais sobre essa função, consulte os arquivos function.json e run.csx.
O código de projeto de função é implantado diretamente no repositório público de exemplo. Para saber mais
sobre as opções de implantação para o Azure Functions, consulte Implantação contínua para o Azure Functions.
5. Selecione Criar para adicionar a assinatura de evento. Isso criará uma assinatura de evento que dispara a
função Thumbnail quando um blob é adicionado ao contêiner images . A função redimensiona as imagens
e as adiciona ao contêiner thumbnails .
Agora que os serviços de back-end estão configurados, teste a funcionalidade de redimensionamento da imagem
no aplicativo Web de exemplo.
Próximas etapas
Neste tutorial, você aprendeu como:
Criar uma conta geral do Armazenamento do Azure
Implantar o código sem servidor usando o Azure Functions
Criar uma assinatura de evento do armazenamento de Blobs na Grade de Eventos
Avance até a terceira parte da série de tutoriais sobre o Armazenamento para saber como proteger o acesso à
conta de armazenamento.
Proteger o acesso aos dados de um aplicativo na nuvem
Para saber mais sobre a Grade de Eventos, consulte Uma introdução à Grade de Eventos do Azure.
Para experimentar outro tutorial que mostra o Azure Functions, consulte Criar uma função que é integrada
aos Aplicativos Lógicos do Azure.
Tutorial: Aplicar modelos de machine learning no
Azure Functions com o Python e o TensorFlow
01/11/2019 • 12 minutes to read • Edit Online
Este artigo demonstra como o Azure Functions permite que você use o Python e o TensorFlow com um modelo de
machine learning para classificar uma imagem com base no respectivo conteúdo.
Neste tutorial, você aprenderá a:
Inicializar um ambiente local para o desenvolvimento de Azure Functions no Python
Importar um modelo de machine learning do TensorFlow personalizado para um aplicativo de funções
Criar uma API HTTP sem servidor para prever se uma foto contém um cão ou um gato
Consumir a API de um aplicativo Web
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Pré-requisitos
Para criar Azure Functions em Python, você precisa instalar algumas ferramentas.
Python 3.6
Ferramentas básicas do Azure Functions
Um editor de códigos como o Visual Studio Code
cd start
python3.6 -m venv .venv
source .venv/bin/activate
Windows:
cd start
py -3.6 -m venv .venv
.venv\scripts\activate
o prompt de terminal agora é prefixado com (.venv) , o que indica que você ativou com êxito o ambiente virtual.
Verifique se o python , no ambiente virtual, é de fato o Python 3.6.x.
python --version
NOTE
Para o restante do tutorial, você executa comandos no ambiente virtual. Se você precisar reativar o ambiente virtual em um
terminal, execute o comando de ativação apropriado para o sistema operacional.
Um aplicativo de funções pode conter uma ou mais Azure Functions. Abra a pasta start em um editor e examine o
conteúdo.
local.settings.json: contém as configurações de aplicativo usadas para desenvolvimento local
host.json: contém configurações para o host e as extensões do Azure Functions
requirements.txt: contém os pacotes do Python exigidos por este aplicativo
func start
Abra uma janela de navegador e navegue até a URL a seguir. A função deve ser executada e retornar Olá Azure!
http://localhost:7071/api/classify?name=Azure
NOTE
Se quiser criar seu próprio modelo usando a camada gratuita do Serviço de Visão Personalizada, você poderá seguir as
instruções no repositório do projeto de exemplo.
cp ../resources/model/* classify
Windows:
verifique se você incluiu o * no comando acima. Verifique se classify agora contém arquivos denominados
model.pb e labels.txt.
Adicionar as funções auxiliares e dependências
Algumas funções auxiliares para preparar a imagem de entrada e fazer uma previsão usando o TensorFlow estão
em um arquivo chamado predict.py, na pasta resources. Copie esse arquivo para a pasta da função classify.
Linux e macOS:
cp ../resources/predict.py classify
Windows:
tensorflow==1.14
Pillow
requests
Salve o arquivo.
No terminal com o ambiente virtual ativado, execute o comando a seguir na pasta start para instalar as
dependências. Algumas etapas de instalação podem levar alguns minutos para serem concluídas.
import json
from .predict import predict_image_from_url
headers = {
"Content-type": "application/json",
"Access-Control-Allow-Origin": "*"
}
return func.HttpResponse(json.dumps(results), headers = headers)
NOTE
Em um aplicativo de produção, altere * para a origem específica da página da Web para obter segurança adicional.
func start
Em um navegador, abra esta URL que chama sua função com a URL de uma foto de gato. Verifique se um
resultado de previsão válido é retornado.
http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-
tensorflow-tutorial/master/resources/assets/samples/cat1.png
cd <FRONT_END_FOLDER>
python3.6 -m http.server
Windows:
cd <FRONT_END_FOLDER>
py -3.6 -m http.server
Em um navegador, navegue até a URL do servidor HTTP que é exibida no terminal. Um aplicativo Web deve
aparecer. Insira uma das URLs de foto a seguir na caixa de texto. Você também pode usar uma URL de uma foto de
gato ou de cachorro publicamente acessível.
https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-
tutorial/master/resources/assets/samples/cat1.png
https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-
tutorial/master/resources/assets/samples/cat2.png
https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-
tutorial/master/resources/assets/samples/dog1.png
https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-
tutorial/master/resources/assets/samples/dog2.png
Quando você clica em enviar, o aplicativo de funções é chamado e um resultado é exibido na página.
Limpar recursos
Todo este tutorial é executado localmente em seu computador, portanto, não há recursos ou serviços do Azure a
serem limpos.
Próximas etapas
Neste tutorial, você aprendeu a criar e personalizar uma API HTTP com o Azure Functions para fazer previsões
usando um modelo do TensorFlow. Você também aprendeu como chamar a API de um aplicativo Web.
É possível usar as técnicas deste tutorial para criar APIs de qualquer complexidade, fazendo-o simultaneamente à
execução no modelo de computação sem servidor fornecido pelo Azure Functions.
Para implantar o aplicativo de funções no Azure, use o Azure Functions Core Tools ou o Visual Studio Code.
Guia do desenvolvedor do Python para o Azure Functions
Crie uma função no Linux usando uma imagem
personalizada
24/10/2019 • 38 minutes to read • Edit Online
O Azure Functions permite hospedar suas funções no Linux em seu próprio contêiner personalizado. Você
também pode hospedar em um contêiner padrão do Serviço de Aplicativo do Azure. Essa funcionalidade requer o
tempo de execução do Functions 2.x.
Neste tutorial, você aprenderá a implantar suas funções no Azure como uma imagem personalizada do Docker.
Esse padrão será útil quando você precisar personalizar a imagem de contêiner interna. Convém usar uma
imagem personalizada quando suas funções precisarem de uma versão de idioma específico, ou exigirem uma
configuração ou dependência específica que não é fornecida na imagem interna. Imagens base com suporte para
Azure Functions encontram-se no repositório de imagens de base do Azure Functions.
Este tutorial explica como usar o Azure Functions Core Tools para criar uma função em uma imagem
personalizada do Linux. Publique essa imagem em um aplicativo de funções no Azure, que foi criado usando a
CLI do Azure. Posteriormente, você atualizará a função para se conectar ao armazenamento de Filas do Azure.
Você também a habilitará.
Neste tutorial, você aprenderá como:
Crie um aplicativo de funções e o Dockerfile usando o Core Tools.
Compile uma imagem personalizada usando o Docker.
Publique uma imagem personalizada em um registro de contêiner.
Criar uma conta do Armazenamento do Azure.
Criar um plano de hospedagem Premium.
Implante um aplicativo de funções do Hub do Docker.
Adicione configurações de aplicativo ao aplicativo de funções.
Habilitar a implantação contínua.
Habilitar conexões SSH para o contêiner.
Adicionar uma associação de saída de armazenamento de filas.
Adicionar o monitoramento do Application Insights.
As etapas a seguir têm suporte em um computador Mac, Windows ou Linux.
Pré-requisitos
Antes de executar este exemplo, você deve ter o seguinte:
Instale a versão do Azure Core Tools 2.x.
Instale a CLI do Azure. Este artigo requer a CLI do Azure versão 2.0 ou posterior. Execute az --version
descobrir a versão que você tem.
Você também pode usar o Azure Cloud Shell.
Uma assinatura ativa do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
NOTE
Os comandos da CLI do Azure neste artigo funcionam em Bash e são verificados para serem executados no Azure Cloud
Shell. Você deve modificá-los para eles serem executados em um prompt de comando local do Windows.
Quando você inclui a opção --docker , um dockerfile é gerada para o projeto. Esse arquivo é usado para criar um
contêiner personalizado no qual executar o projeto. A imagem base usada depende da linguagem do tempo de
execução do trabalho escolhida.
Quando solicitado, escolha um tempo de execução do trabalho com as seguintes linguagens:
dotnet : cria um projeto de biblioteca de classes do .NET Core (.csproj).
node : cria um projeto de JavaScript.
python : cria um projeto do Python.
Use o comando a seguir para navegar até a nova pasta do projeto MyFunctionProj .
cd MyFunctionProj
Quando o comando for executado, você verá algo parecido com a seguinte saída:
The function "MyHttpTrigger" was created successfully from the "HttpTrigger" template.
JavaScript
func start
TypeScript
npm install
npm start
Quando o host do Functions é iniciado, ele escreve algo parecido com a seguinte saída, que foi truncada para
facilitar a leitura:
%%%%%%
%%%%%%
@ %%%%%% @
@@ %%%%%% @@
@@@ %%%%%%%%%%% @@@
@@ %%%%%%%%%% @@
@@ %%%% @@
@@ %%% @@
@@ %% @@
%%
%
...
...
Http Functions:
HttpTrigger: http://localhost:7071/api/MyHttpTrigger
Copie a URL da função HttpTrigger da saída do tempo de execução de função e cole-a na barra de endereços do
navegador. Acrescente o valor de cadeia de consulta ?name=<yourname> a essa URL e execute a solicitação. O
exemplo a seguir mostra a resposta no navegador à solicitação GET retornada pela função local:
Agora que você executou a função localmente, poderá criar o aplicativo de funções e outros recursos necessários
no Azure.
FROM mcr.microsoft.com/azure-functions/node:2.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot
COPY . /home/site/wwwroot
NOTE
A lista completa de imagens base com suporte para Azure Functions encontram-se na página de imagens de base do Azure
Functions.
Na pasta raiz, execute o comando docker build e forneça um nome, mydockerimage , e uma marca, v1.0.0 .
Substitua <docker-id> pela ID da conta do Hub do Docker. Esse comando compila a imagem do Docker para o
contêiner.
Quando o comando for concluído, você poderá executar o novo contêiner localmente.
Executar a imagem localmente
Verifique se a imagem criada funciona executando a imagem do Docker em um contêiner local. Execute o
comando docker run e envie o nome e a marcação da imagem para ele. Lembre-se de especificar a porta usando
o argumento -p .
Com a imagem personalizada em execução em um contêiner local do Docker, verifique se o aplicativo de funções
e o contêiner estão funcionando corretamente navegando até http://localhost:8080.
NOTE
Neste ponto, ao tentar chamar sua função HTTP específica, você obtém uma resposta de erro HTTP 401. Isso ocorre porque
sua função é executada no contêiner local como ocorreria no Azure, o que significa que a chave de função é necessária.
Como o contêiner ainda não foi publicado em um aplicativo de funções, não há nenhuma chave de função disponível. Você
verá posteriormente que, quando usar as Core Tools para publicar seu contêiner, as teclas de função serão mostradas a
você. Se quiser testar sua função em execução no contêiner local, você poderá alterar a chave de autorização para
anonymous .
Depois de verificar o aplicativo de funções no contêiner, interrompa a execução. Agora, você pode enviar por push
a imagem personalizada à sua conta do Hub do Docker.
Uma mensagem “logon com êxito” confirma que você está conectado. Depois de conectado, envie a imagem por
push para o Hub do Docker usando o comando docker push.
Em geral, você cria seu grupo de recursos e os recursos em uma região próxima a você.
az storage account create --name <storage_name> --location westeurope --resource-group myResourceGroup --sku
Standard_LRS
NOTE
Se o contêiner for privado, você precisaria definir as seguintes configurações de aplicativo também
DOCKER_REGISTRY_SERVER_USERNAME
DOCKER_REGISTRY_SERVER_PASSWORD
Você terá que parar e iniciar o aplicativo de função para que esses valores sejam coletados
Verificar as funções
A função disparada por HTTP que você criou requer uma chave de função ao chamar o ponto de extremidade.
Neste momento, a maneira mais fácil de obter a URL da função, incluindo a chave, é do portal do Azure.
TIP
Você também pode obter suas chaves de função usando as APIs de gerenciamento de chaves, o que exige que você
apresente um token de portador para autenticação.
Localize seu novo aplicativo de funções no portal do Azure digitando o nome do aplicativo de funções na caixa
Pesquisar na parte superior da página e selecionando o recurso Serviço de Aplicativo.
Selecione a função MyHttpTrigger, selecione </> Obter URL da função > padrão (Chave de função) >
Copiar.
Nessa URL, a chave de função é o parâmetro de consulta code .
NOTE
Já que seu aplicativo de funções é implantado como um contêiner, você não pode fazer alterações no seu código de função
no portal. Em vez disso, você deve atualizar o projeto no contêiner local e republicá-lo no Azure.
Cole a URL de função na barra de endereços do navegador. Adicione o valor da cadeia de caracteres de consulta
&name=<yourname> ao final desta URL e pressione Enter em seu teclado para executar a solicitação. Você deverá
ver a resposta retornada pela função exibida no navegador.
O exemplo a seguir mostra a resposta no navegador:
A URL da solicitação inclui uma chave que é necessária, por padrão, para acessar sua função via HTTP.
Esse comando retorna a URL de webhook de implantação após a implantação contínua ser habilitada. Você
também pode usar o comando az functionapp deployment container show -cd-url para retornar essa URL.
Copie a URL de implantação e navegue até seu repositório DockerHub, escolha a guia Webhooks, digite um
nome do Webhook para o webhook, cole a URL em URL do Webhooke, em seguida, escolha o sinal de adição
( + ).
Com o conjunto de webhook, todas as atualizações para a imagem vinculada no DockerHub fazem com que o
aplicativo de funções baixe e instale a imagem mais recente.
FROM mcr.microsoft.com/azure-functions/node:2.0-appservice
As diferenças nas duas imagens base habilitam conexões SSH em seu contêiner. Essas diferenças são detalhadas
neste tutorial dos Serviços de Aplicativos.
Recompilar e reimplantar a imagem
Na pasta raiz, execute o comando docker build novamente e, assim como antes, substitua <docker-id> pela ID da
conta do Docker Hub.
docker build --tag <docker-id>/mydockerimage:v1.0.0 .
https://<app_name>.scm.azurewebsites.net/
Entre em sua conta do Azure e selecione a guia SSH para criar uma conexão SSH em seu contêiner.
Depois que a conexão for estabelecida, execute o comando top para exibir os processos em execução
atualmente.
IMPORTANT
Esse comando substitui todas as configurações existentes por valores do aplicativo de funções no Azure.
Como ela contém segredos, o arquivo local.settings.json nunca é publicado e deve ser excluído do controle do código-fonte.
É necessário ter o valor AzureWebJobsStorage , que é a cadeia de conexão da Conta de armazenamento. Use esta
conexão para verificar se a associação de saída funciona conforme o esperado.
Habilitar pacotes de extensão
Como está usando uma associação de saída Armazenamento de Filas, você precisa ter a extensão de associações
de Armazenamento instalada antes de executar o projeto.
JavaScript/Python
C#
A maneira mais fácil de instalar as extensões de associação é habilitar pacotes de extensão. Quando você habilita
os pacotes, um conjunto predefinido de pacotes de extensão é instalado automaticamente.
Para habilitar pacotes de extensão, abra o arquivo host.json e atualize seu conteúdo de acordo com o código a
seguir:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Selecionar associação com Azure Queue Storage A associação é uma associação de fila
direção... do Armazenamento do Azure.
O nome usado para identificar essa msg Nome que identifica o parâmetro de
associação em seu código associação referenciado em seu código.
Uma associação é incluída na matriz bindings no seu arquivo function.json, que agora deve se parecer com o
seguinte exemplo:
{
...
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"
A saída desse comando inclui uma fila denominada outqueue , que é a fila que foi criada quando a função foi
executada.
Em seguida, use o comando az storage message peek para exibir as mensagens nessa fila, como no exemplo a
seguir:
echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --
decode`
A cadeia de caracteres retornada deve ser a mesma que a mensagem enviada para testar a função.
NOTE
O exemplo anterior decodifica a cadeia de caracteres retornada de base64. Isso ocorre porque as associações de
Armazenamento de fila gravam e leem do Armazenamento do Azure como cadeias de caracteres base64.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja continuar com Inícios
Rápidos ou tutoriais subsequentes, não limpe os recursos criados neste Início Rápido. Se você não planeja
continuar, use o comando a seguir para excluir todos os recursos criados neste Início Rápido:
Próximas etapas
Agora que você implantou com êxito o contêiner personalizado em um aplicativo de funções no Azure, considere
ler mais sobre os seguintes tópicos:
Funções de monitoramento
Opções de escala e de hospedagem
Hospedagem sem servidor baseada em Kubernetes
Tutorial: Implantar funções do Azure como módulos
do IoT Edge
24/10/2019 • 18 minutes to read • Edit Online
Use o Azure Functions para implantar um código que implementa a lógica de negócios diretamente em seus
dispositivos Azure IoT Edge. Este tutorial o orienta através da criação e implantação de uma função do Azure que
filtra dados do sensor em um dispositivo IoT Edge simulado. Use o dispositivo IoT Edge simulado que foi criado
em Implantar Azure IoT Edge em um dispositivo simulado nos inícios rápidos do Windows ou do Linux. Neste
tutorial, você aprenderá como:
Usar o Visual Studio Code para criar uma função do Azure.
Usar o VS Code e o Docker para criar uma imagem do Docker e publicá-la em um registro de contêiner.
Implantar o módulo do registro do contêiner para seu dispositivo IoT Edge.
Exibir dados filtrados.
NOTE
Os módulos de funções do Azure no Azure IoT Edge são públicos na versão prévia.
A função do Azure criada neste tutorial filtra os dados de temperatura gerados pelo seu dispositivo. Ela só envia
mensagens upstream para o Hub IoT do Azure quando a temperatura estiver acima de um limite especificado.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Pré-requisitos
Antes de iniciar este tutorial, você deve ter passado pelo tutorial anterior para configurar seu ambiente de
desenvolvimento para o desenvolvimento de contêiner do Linux: Desenvolver módulos do IoT Edge para
dispositivos Linux. Ao concluir esse tutorial, você deve ter os seguintes pré-requisitos implementados:
Um Hub IoT na camada padrão ou gratuito no Azure.
Um dispositivo Linux que executa o Azure IoT Edge
Um registro de contêiner, como o Registro de Contêiner do Azure.
O Visual Studio Code configurado com o Azure IoT Tools.
O Docker CE configurado para executar contêineres do Linux.
Para desenvolver um módulo do IoT Edge com o Azure Functions, instale os seguintes pré-requisitos adicionais
em seu computador de desenvolvimento:
C# para extensão do Visual Studio Code (com OmniSharp).
O SDK 2.1 do .NET Core.
CAMPO VALOR
Fornecer um nome para a solução Insira um nome descritivo para a solução, como
FunctionSolution ou aceite o padrão.
Fornecer o repositório de imagem do Docker para o Um repositório de imagem inclui o nome do registro de
módulo contêiner e o nome da imagem de contêiner. Sua imagem
de contêiner foi preenchida automaticamente na última
etapa. Substitua localhost:5000 pelo valor do servidor de
logon do seu registro de contêiner do Azure. Você pode
recuperar o servidor de logon da página Visão Geral do
seu registro de contêiner no portal do Azure. A cadeia de
caracteres final se parece com <nome do
registro>.azurecr.io/CSharpFunction.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Devices.Client;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EdgeHub;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace Functions.Samples
{
public static class CSharpFunction
{
[FunctionName("CSharpFunction")]
public static async Task FilterMessageAndSendMessage(
[EdgeHubTrigger("input1")] Message messageReceived,
[EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output,
ILogger logger)
{
const int temperatureThreshold = 20;
byte[] messageBytes = messageReceived.GetBytes();
var messageString = System.Text.Encoding.UTF8.GetString(messageBytes);
if (!string.IsNullOrEmpty(messageString))
{
logger.LogInformation("Info: Received one non-empty message");
// Get the body of the message and deserialize it.
var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
{
// Send the message to the output as the temperature value is greater than the
threshold.
using (var filteredMessage = new Message(messageBytes))
{
// Copy the properties of the original message into the new Message object.
foreach (KeyValuePair<string, string> prop in messageReceived.Properties)
{filteredMessage.Properties.Add(prop.Key, prop.Value);}
// Add a new property to the message to indicate it is an alert.
filteredMessage.Properties.Add("MessageType", "Alert");
// Send the message.
await output.AddAsync(filteredMessage);
logger.LogInformation("Info: Received and transferred a message with
temperature above the threshold");
}
}
}
}
}
//Define the expected schema for the body of incoming messages.
class MessageBody
{
public Machine machine {get; set;}
public Ambient ambient {get; set;}
public string timeCreated {get; set;}
}
class Machine
{
public double temperature {get; set;}
public double pressure {get; set;}
}
class Ambient
{
public double temperature {get; set;}
public int humidity {get; set;}
}
}
3. Salve o arquivo.
Quando você for solicitado a inserir a senha, cole a senha (ela não ficará visível na janela do terminal) do seu
registro de contêiner e pressione Enter.
Password: <paste in the ACR password and press enter>
Login Succeeded
Limpar recursos
Se você pretende continuar no próximo artigo recomendado, pode manter os recursos e as configurações já
criados e reutilizá-los. Você também pode continuar usando o mesmo dispositivo IoT Edge como um dispositivo
de teste.
Caso contrário, você pode excluir as configurações locais e os recursos do Azure criados neste artigo para evitar
encargos.
Excluir recursos do Azure
A exclusão de recursos do Azure e dos grupos de recursos é irreversível. Não exclua acidentalmente grupo de
recursos ou recursos incorretos. Caso tenha criado o hub IoT dentro de um grupo de recursos existente com
recursos que você deseja manter, exclua o próprio recurso hub IoT em vez de excluir o grupo de recursos.
Para excluir os recursos:
1. Entre no portal do Azure e selecione Grupos de recursos.
2. Selecione o nome do grupo de recursos que contém os recursos de teste do IoT Edge.
3. Reveja a lista de recursos contidos no grupo de recursos. Se você deseja excluir todos eles, selecione Excluir
grupo de recursos. Se você quiser excluir apenas alguns deles, clique em cada recurso para excluí-los
individualmente.
Próximas etapas
Neste tutorial, você criou um módulo de função do Azure com o código para filtrar os dados brutos gerados pelo
seu dispositivo IoT Edge. Quando estiver pronto para criar seus próprios módulos, você poderá saber mais sobre
como Desenvolver com o Azure IoT Edge para Visual Studio Code.
Siga para os próximos tutoriais para conhecer outras formas pelas quais o Azure IoT Edge pode ajudá-lo a
transformar dados em informações de negócios na borda.
Localizar médias usando uma janela flutuante no Azure Stream Analytics
Exemplos de CLI do Azure
24/10/2019 • 2 minutes to read • Edit Online
A tabela a seguir inclui links para scripts bash criados para Azure Functions que usam a CLI do Azure.
Criar um Aplicativo de funções para execução sem servidor Cria um aplicativo de funções em um plano de consumo.
Criar um Aplicativo de funções em um Plano do Serviço de Crie um aplicativo de funções em um Plano do Serviço de
Aplicativo Aplicativo dedicado.
INTEGRAÇÃO DESCRIÇÃO
Criar um aplicativo de funções e conectá-lo a uma conta de Crie um aplicativo de funções e conecte-o a uma conta de
armazenamento armazenamento.
Criar um aplicativo de funções e conectá-lo a um Banco de Criar um aplicativo de funções e conectá-lo a um Azure
Dados Cosmo do Azure Cosmos DB.
Mapear um domínio personalizado para um aplicativo de Defina um domínio personalizado para suas funções.
funções
Associar um certificado SSL em um Aplicativo de funções Carregue certificados SSL para funções em um domínio
personalizado.
Visão geral das versões do Azure Functions
Runtime
08/11/2019 • 19 minutes to read • Edit Online
As versões principais do tempo de execução do Azure Functions estão relacionadas à versão do .NET na qual
o tempo de execução se baseia. A tabela a seguir indica a versão atual do tempo de execução, o nível de
versão e a versão do .NET relacionada.
NOTE
A versão 3. x do tempo de execução do Functions está em versão prévia e não tem suporte para ambientes de
produção. Para obter mais informações sobre como experimentar a versão 3. x, consulte este comunicado.
Este artigo detalha algumas das diferenças entre as várias versões, como você pode criar cada versão e como
alterar versões.
Linguagens
A partir da versão 2. x, o tempo de execução usa um modelo de extensibilidade de linguagem e todas as
funções em um aplicativo de funções devem compartilhar o mesmo idioma. O idioma das funções em um
aplicativo de funções é escolhido ao criar o aplicativo e é mantido na configuração _WORKER _RUNTIME do
Functions .
As linguagens experimentais Azure Functions 1. x não podem usar o novo modelo, portanto, não há suporte
no 2. x. A tabela a seguir indica quais linguagens de programação têm suporte no momento em cada versão
de tempo de execução.
IDIOMA 1.X 2. X 3. X 1
Para melhorar o monitoramento, o painel trabalhos Web no portal, que usou a configuração
AzureWebJobsDashboard , é substituído por aplicativo Azure insights, que usa a configuração
APPINSIGHTS_INSTRUMENTATIONKEY . Para obter mais informações, consulte monitorar Azure Functions.
<TargetFramework>net461</TargetFramework>
<AzureFunctionsVersion>v1</AzureFunctionsVersion>
Ve r sã o 2 . x
<TargetFramework>netcoreapp2.2</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>
Quando você depura ou publica seu projeto, a versão correta do runtime é usada.
VS Code e Azure Functions Core Tools
Azure Functions Core Tools é usado para o desenvolvimento de linha de comando e também pela extensão
de Azure Functions para Visual Studio Code. Para desenvolver na versão 2. x, instale a versão 2. x das
principais ferramentas. O desenvolvimento da versão 1. x requer a versão 1. x das principais ferramentas.
Para obter mais informações, consulte instalar o Azure Functions Core Tools.
Para o desenvolvimento de Visual Studio Code, talvez você também precise atualizar a configuração de
usuário do azureFunctions.projectRuntime para corresponder à versão das ferramentas instaladas. Essa
configuração também atualiza os modelos e os idiomas usados durante a criação do aplicativo de funções.
Alterando a versão dos aplicativos no Azure
A versão do tempo de execução do Functions usada por aplicativos publicados no Azure é ditada pela
configuração do aplicativo FUNCTIONS_EXTENSION_VERSION . Um valor de ~2 tem como alvo o tempo de
execução da versão 2. x e ~1 tem como alvo o tempo de execução da versão 1. x. Não altere arbitrariamente
essa configuração, pois é provável que outras alterações de configuração de aplicativo e alterações de código
em suas funções sejam necessárias. Para saber mais sobre a maneira recomendada de migrar seu aplicativo
de funções para uma versão de tempo de execução diferente, consulte como direcionar Azure Functions
versões de tempo de execução.
Associações
A partir da versão 2. x, o tempo de execução usa um novo modelo de extensibilidade de associação que
oferece essas vantagens:
Suporte para extensões de associação de terceiros.
Desacoplamento de runtime e associações. Essa alteração permite que as extensões de ligação tenham
controle de versão e sejam liberadas de forma independente. Você pode, por exemplo, optar por
atualizar para uma versão de uma extensão que dependa de uma versão mais recente de um SDK
subjacente.
Um ambiente de execução mais leve, em que apenas as associações em uso são conhecidas e
carregadas pelo tempo de execução.
Com exceção dos gatilhos HTTP e Timer, todas as associações devem ser adicionadas explicitamente ao
projeto de aplicativo de funções ou registradas no Portal. Para obter mais informações, consulte registrar
extensões de associação.
A tabela a seguir mostra quais associações têm suporte em cada versão de tempo de execução.
Esta tabela mostra as associações com suporte nas duas versões principais do tempo de execução de Azure
Functions:
TIPO 1.X 2. X 1 OF ENTRADA SAÍDA
Armazenamento ✔ ✔ ✔ ✔ ✔
de Blobs
BD Cosmos ✔ ✔ ✔ ✔ ✔
Grade de ✔ ✔ ✔
eventos
Hubs de ✔ ✔ ✔ ✔
Eventos
WebHooks de & ✔ ✔ ✔ ✔
de HTTP
Hub IoT ✔ ✔ ✔ ✔
Microsoft Graph ✔ ✔ ✔
Excel tabelas
Arquivos de ✔ ✔ ✔
OneDrive
Microsoft Graph
Microsoft Graph ✔ ✔
Outlook email
Microsoft Graph ✔ ✔ ✔ ✔
events
Tokens de ✔ ✔
Auth Microsoft
Graph
Aplicativos ✔ ✔ ✔
Móveis
Hubs de ✔ ✔
Notificação
Armazenamento ✔ ✔ ✔ ✔
de filas
SendGrid ✔ ✔ ✔
Barramento de ✔ ✔ ✔ ✔
Serviço
SignalR ✔ ✔ ✔
Armazenamento ✔ ✔ ✔ ✔
de tabelas
Timer ✔ ✔ ✔
TIPO 1.X 2. X OF ENTRADA SAÍDA
Twilio ✔ ✔ ✔
1 no tempo de execução da versão 2. x, todas as associações, exceto http e Timer, devemser registradas.
Consulte registrar extensões de associação. Todas as associações 2. x com suporte também têm suporte na
versão 3. x, salvo indicação em contrário.
VERSÃO DE TEMPO DE
PLANO EXECUÇÃO OS MÁXIMO
Consumo 1.x 5 10
Consumo 2. x 5 10
Consumo 3. x (visualização) 5 10
NOTE
Independentemente da configuração do tempo limite do aplicativo de funções, 230 segundos é a quantidade máxima
de tempo que uma função disparada por HTTP pode levar para responder a uma solicitação. Isso ocorre devido ao
tempo limite de ociosidade padrão de Azure Load Balancer. Para tempos de processamento mais longos, considere
usar o padrão assíncrono Durable Functions ou adiar o trabalho real e retornar uma resposta imediata.
Próximos passos
Para obter mais informações, consulte os seguintes recursos:
Codificar e testar Azure Functions localmente
Como direcionar Azure Functions versões de tempo de execução
Notas de versão
Plano Premium do Azure Functions
07/11/2019 • 13 minutes to read • Edit Online
O plano Premium Azure Functions é uma opção de hospedagem para aplicativos de funções. O plano Premium
fornece recursos como conectividade VNet, sem início frio e hardware Premium. Vários aplicativos de funções
podem ser implantados no mesmo plano Premium e o plano permite que você configure o tamanho da instância
de computação, o tamanho do plano base e o tamanho máximo do plano. Para obter uma comparação do plano
Premium e outros tipos de plano e hospedagem, consulte Opções de escala e Hospedagem de função.
Nome do Aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
Neste exemplo, substitua <RESOURCE_GROUP> pelo seu grupo de recursos e <PLAN_NAME> com um nome para seu
plano que seja exclusivo no grupo de recursos. Especifique um <REGION> com suporte . Para criar um plano
Premium que ofereça suporte ao Linux, inclua a opção --is-linux .
Com o plano criado, você pode usar AZ functionapp Create para criar seu aplicativo de funções. No portal, o
plano e o aplicativo são criados ao mesmo tempo.
Recursos
Os recursos a seguir estão disponíveis para aplicativos de funções implantados em um plano Premium.
Instâncias pré -passivas
Se nenhum evento e execução ocorrer hoje no plano de consumo, seu aplicativo poderá reduzir verticalmente até
zero instâncias. Quando novos eventos chegam, uma nova instância precisa ser especializada em seu aplicativo
em execução. A especialização de novas instâncias pode levar algum tempo, dependendo do aplicativo. Essa
latência adicional na primeira chamada geralmente é chamada de inicialização a frio do aplicativo.
No plano Premium, você pode fazer com que seu aplicativo fique quente em um número especificado de
instâncias, até o tamanho mínimo do plano. As instâncias pré-configuradas também permitem que você
dimensione previamente um aplicativo antes da alta carga. À medida que o aplicativo é dimensionado, ele é
dimensionado primeiro para as instâncias pré-configuradas. As instâncias adicionais continuam a ficar em buffer
e ficam quentes imediatamente em preparação para a próxima operação de escala. Tendo um buffer de instâncias
pré-configuradas, você pode evitar latências de início frio. As instâncias pré-configuradas são um recurso do
plano Premium, e você precisa manter pelo menos uma instância em execução e disponível sempre que o plano
estiver ativo.
Você pode configurar o número de instâncias pré-configuradas no portal do Azure selecionando sua aplicativo
de funções, acessando a guia recursos da plataforma e selecionando as opções de scale out . Na janela Editar
do aplicativo de funções, as instâncias pré-configuradas são específicas para esse aplicativo, mas as instâncias
mínima e máxima se aplicam ao seu plano inteiro.
Você também pode configurar instâncias pré-configuradas para um aplicativo com o CLI do Azure
IMPORTANT
Você é cobrado por cada instância alocada na contagem mínima de instâncias, independentemente de as funções serem
executadas ou não.
Se seu aplicativo exigir instâncias além do tamanho do plano, ele poderá continuar a escalar horizontalmente até
que o número de instâncias atinja o limite máximo de intermitência. Você será cobrado por instâncias além do
tamanho do plano somente enquanto eles estiverem em execução e alugados para você. Faremos um melhor
esforço em dimensionar seu aplicativo para o limite máximo definido, enquanto que as instâncias de plano
mínimas são garantidas para seu aplicativo.
Você pode configurar o tamanho do plano e os máximos no portal do Azure selecionando as opções de scale
out no plano ou um aplicativo de funções implantado nesse plano (em recursos da plataforma).
Você também pode aumentar o limite máximo de intermitência do CLI do Azure:
EP2 2 7 GB 250 GB
EP3 4 14 GB 250 GB
Regiões
Abaixo estão as regiões com suporte no momento para cada sistema operacional.
Austrália Central ✔1
REGIÃO WINDOWS LINUX
Austrália Central 2 ✔1
Leste da Austrália ✔
Sudeste da Austrália ✔ ✔
Sul do Brasil ✔2
Canadá Central ✔
Ásia Oriental ✔
França Central ✔
Leste do Japão ✔ ✔
Oeste do Japão ✔
Coreia Central ✔
Norte da Europa ✔ ✔
Sul da Índia ✔
Sudeste Asiático ✔ ✔
Europa Ocidental ✔ ✔
Índia Ocidental ✔
Você pode usar algumas tecnologias diferentes para implantar o código do projeto Azure Functions no Azure. Este artigo fornece uma lista completa dessas
tecnologias, descreve quais tecnologias estão disponíveis para quais tipos de funções, explica o que acontece quando você usa cada método e fornece
recomendações para o melhor método a ser usado em vários cenários . As várias ferramentas que dão suporte à implantação em Azure Functions são ajustadas
para a tecnologia certa com base em seu contexto. Em geral, a implantação de zip é a tecnologia de implantação recomendada para Azure Functions.
TECNOLOGIA DE CONSUMO DO
IMPLANTAÇÃO WINDOWS WINDOWS PREMIUM WINDOWS DEDICADO CONSUMO DO LINUX LINUX PREMIUM LINUX DEDICADO
URL do pacote ✔ ✔ ✔ ✔ ✔ ✔
externo1
Implantação de zip ✔ ✔ ✔ ✔ ✔ ✔
Contêiner do Docker ✔ ✔
Implantação da Web ✔ ✔ ✔
Controle do código- ✔ ✔ ✔ ✔ ✔
fonte
Git local1 ✔ ✔ ✔ ✔ ✔
Sincronização de ✔ ✔ ✔ ✔ ✔
nuvem1
FTP1 ✔ ✔ ✔ ✔ ✔
Edição do portal ✔ ✔ ✔ ✔2 ✔2
Principais conceitos
Alguns conceitos importantes são essenciais para entender como as implantações funcionam em Azure Functions.
Disparar sincronização
Quando você altera qualquer um de seus gatilhos, a infraestrutura do Functions deve estar ciente das alterações. A sincronização ocorre automaticamente para
muitas tecnologias de implantação. No entanto, em alguns casos, você deve sincronizar manualmente seus gatilhos. Ao implantar suas atualizações referenciando
uma URL de pacote externo, git local, sincronização de nuvem ou FTP, você deve sincronizar manualmente seus gatilhos. Você pode sincronizar gatilhos de uma
destas três maneiras:
Reinicie seu aplicativo de funções no portal do Azure
Envie uma solicitação HTTP POST para https://{functionappname}.azurewebsites.net/admin/host/synctriggers?code=<API_KEY> usando a chave mestra.
Enviar uma solicitação HTTP POST para
https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.Web/sites/<FUNCTION_APP_NAME>/syncfunctiontriggers?
api-version=2016-08-01
. Substitua os espaços reservados por sua ID de assinatura, nome do grupo de recursos e o nome do seu aplicativo de funções.
Build remoto
Azure Functions pode executar compilações automaticamente no código que recebe após implantações de zip. Essas compilações se comportam um pouco
diferente dependendo se seu aplicativo está em execução no Windows ou no Linux. As compilações remotas não são executadas quando um aplicativo tiver sido
previamente definido para execução em execução no modo de pacote . Para saber como usar a compilação remota, navegue até a implantação de zip.
NOTE
Se você estiver tendo problemas com a compilação remota, pode ser porque seu aplicativo foi criado antes de o recurso ser disponibilizado (1º de agosto de 2019). Tente criar um
novo aplicativo de funções ou execute az functionapp update -g <RESOURCE_GROUP_NAME> -n <APP_NAME> para atualizar seu aplicativo de funções. Esse comando pode levar
duas tentativas de sucesso.
Por padrão, Azure Functions Core Tools e a extensão Azure Functions para Visual Studio Code executar compilações remotas ao implantar no Linux. Por isso,
ambas as ferramentas criam automaticamente essas configurações para você no Azure.
Quando os aplicativos são criados remotamente no Linux, eles são executados a partir do pacote de implantação.
P l a n o d e c o n su m o
Os aplicativos de funções do Linux em execução no plano de consumo não têm um site SCM/kudu, que limita as opções de implantação. No entanto, os
aplicativos de funções no Linux em execução no plano de consumo oferecem suporte a compilações remotas.
Pl an o s dedi c ado e Pr em i u m
Os aplicativos de funções em execução no Linux no plano dedicado (serviço de aplicativo) e no plano Premium também têm um site do SCM/kudu limitado.
Como usá-lo: Adicione WEBSITE_RUN_FROM_PACKAGE às configurações do aplicativo. O valor dessa configuração deve ser uma URL (o local do arquivo de pacote
específico que você deseja executar). Você pode adicionar configurações no portal ou usando o CLI do Azure.
Se você usar o armazenamento de BLOBs do Azure, use um contêiner privado com uma assinatura de acesso compartilhado (SAS) para dar acesso às funções
ao pacote. Sempre que o aplicativo for reiniciado, ele buscará uma cópia do conteúdo. Sua referência deve ser válida durante o tempo de vida do aplicativo.
Quando usá-lo: A URL do pacote externo é o único método de implantação com suporte para Azure Functions em execução no Linux no plano de consumo,
se o usuário não quiser que uma compilação remota ocorra. Ao atualizar o arquivo de pacote que um aplicativo de funções referencia, você deve sincronizar os
gatilhos manualmente para informar ao Azure que seu aplicativo foi alterado.
Implantação de zip
Use a implantação de zip para enviar por push um arquivo. zip que contém seu aplicativo de funções para o Azure. Opcionalmente, você pode definir seu
aplicativo para iniciar a execução a partir do pacoteou especificar que ocorra uma compilação remota .
Como usá-lo: Implante usando sua ferramenta de cliente favorita: Visual Studio Code, Visual Studio, o Azure Functions Core Toolsou o CLI do Azure. Por
padrão, essas ferramentas usam a implantação zip e são executadas a partir do pacote. As ferramentas principais e a extensão Visual Studio Code habilitam a
compilação remota ao implantar no Linux. Para implantar manualmente um arquivo. zip em seu aplicativo de funções, siga as instruções em implantar de um
arquivo. zip ou de uma URL.
Ao implantar usando a implantação de zip, você pode definir seu aplicativo para ser executado do pacote. Para executar a partir do pacote, defina o valor de
configuração WEBSITE_RUN_FROM_PACKAGE aplicativo como 1 . Recomendamos a implantação de zip. Ele produz tempos de carregamento mais rápidos para seus
aplicativos e é o padrão para VS Code, o Visual Studio e o CLI do Azure.
Quando usá-lo: A implantação de zip é a tecnologia de implantação recomendada para Azure Functions.
Contêiner do Docker
Você pode implantar uma imagem de contêiner do Linux que contém seu aplicativo de funções.
Como usá-lo: Crie um aplicativo de funções do Linux no plano Premium ou dedicado e especifique a imagem de contêiner a ser executada. É possível fazer
isso de duas formas:
Crie um aplicativo de funções do Linux em um plano de serviço Azure App no portal do Azure. Para publicar, selecione imagem do Dockere configure o
contêiner. Insira o local onde a imagem está hospedada.
Crie um aplicativo de funções do Linux em um plano do serviço de aplicativo usando o CLI do Azure. Para saber como, consulte criar uma função no Linux
usando uma imagem personalizada.
Para implantar em um aplicativo existente usando um contêiner personalizado, em Azure Functions Core Tools, use o comando func deploy .
Quando usá-lo: Use a opção de contêiner do Docker quando precisar de mais controle sobre o ambiente do Linux em que seu aplicativo de funções é
executado. Esse mecanismo de implantação está disponível somente para funções em execução no Linux.
Como usá-lo: Use as Ferramentas do Visual Studio para Azure Functions. Desmarque a caixa de seleção Executar do arquivo de pacote (recomendado)
.
Você também pode baixar Implantação da Web 3,6 e chamar MSDeploy.exe diretamente.
Quando usá-lo: Implantação da Web tem suporte e não tem problemas, mas o mecanismo preferencial é a implantação de zip com a execução do pacote
habilitado. Para saber mais, consulte o Guia de desenvolvimento do Visual Studio.
Controle do código-fonte
Use o controle do código-fonte para conectar seu aplicativo de funções a um repositório git. Uma atualização de código nesse repositório dispara a implantação.
Para obter mais informações, consulte o wiki do kudu.
Como usá-lo: Use a central de implantação na área funções do portal para configurar a publicação do controle do código-fonte. Para saber mais, confira
Implantação contínua do Azure Functions.
Quando usá-lo: Usar o controle do código-fonte é a melhor prática para as equipes que colaboram com seus aplicativos de funções. O controle do código-
fonte é uma boa opção de implantação que permite pipelines de implantação mais sofisticados.
Git local
Você pode usar o Git local para enviar código por push do computador local para Azure Functions usando o git.
Como usá-lo: Siga as instruções em implantação do git local para Azure app serviço.
Quando usá-lo: Em geral, recomendamos que você use um método de implantação diferente. Ao publicar do git local, você deve sincronizar os gatilhos
manualmente.
Sincronização de nuvem
Use a sincronização de nuvem para sincronizar seu conteúdo do Dropbox e do OneDrive para Azure Functions.
Quando usá-lo: Em geral, recomendamos outros métodos de implantação. Ao publicar usando a sincronização de nuvem, você deve sincronizar os gatilhos
manualmente.
FTP
Você pode usar o FTP para transferir arquivos diretamente para o Azure Functions.
Quando usá-lo: Em geral, recomendamos outros métodos de implantação. Ao publicar usando FTP, você deve sincronizar os gatilhos manualmente.
Edição do portal
No editor baseado em portal, você pode editar diretamente os arquivos que estão em seu aplicativo de funções (essencialmente implantando sempre que você
salvar suas alterações).
Como usá-lo: Para poder editar suas funções no portal do Azure, você deve ter criado suas funções no portal. Para preservar uma única fonte de verdade,
usar qualquer outro método de implantação torna sua função somente leitura e impede a edição continuada do Portal. Para retornar a um estado no qual você
pode editar os arquivos na portal do Azure, você pode ativar manualmente o modo de edição para Read/Write e remover quaisquer configurações de
aplicativo relacionadas à implantação (como WEBSITE_RUN_FROM_PACKAGE ).
Quando usá-lo: O portal é uma boa maneira de começar a usar o Azure Functions. Para um trabalho de desenvolvimento mais intenso, recomendamos que
você use uma das seguintes ferramentas de cliente:
Visual Studio Code
Azure Functions Core Tools (linha de comando)
Visual Studio
A tabela a seguir mostra os sistemas operacionais e idiomas que dão suporte à edição do portal:
CONSUMO DO
WINDOWS WINDOWS PREMIUM WINDOWS DEDICADO CONSUMO DO LINUX LINUX PREMIUM LINUX DEDICADO
C#
Script do C# ✔ ✔ ✔ ✔* ✔*
CONSUMO DO
WINDOWS WINDOWS PREMIUM WINDOWS DEDICADO CONSUMO DO LINUX LINUX PREMIUM LINUX DEDICADO
F#
Java
JavaScript (Node.js) ✔ ✔ ✔ ✔* ✔*
Python (versão
prévia)
PowerShell ✔ ✔ ✔
(visualização)
* A edição do portal é habilitada apenas para gatilhos HTTP e de temporizador para funções no Linux usando planos Premium e dedicados.
Slots de implantação
Ao implantar seu aplicativo de funções no Azure, você pode implantar em um slot de implantação separado em vez de diretamente na produção. Para obter mais
informações sobre slots de implantação, consulte a documentação dos Slots de implantação do Azure Functions para obter detalhes.
Próximas etapas
Leia estes artigos para saber mais sobre como implantar seus aplicativos de funções:
Implantação contínua para Azure Functions
Entrega contínua usando o Azure DevOps
Implantações zip para Azure Functions
Executar o Azure Functions de um arquivo de pacote
Automatizar a implantação de recursos para seu aplicativo de funções no Azure Functions
Azure Functions o processamento confiável de
eventos
24/10/2019 • 14 minutes to read • Edit Online
O processamento de eventos é um dos cenários mais comuns associados à arquitetura sem servidor. Este artigo
descreve como criar um processador de mensagens confiável com Azure Functions para evitar a perda de
mensagens.
Tratamento de exceções
Como regra geral, cada função deve incluir um bloco try/catch no nível mais alto de código. Especificamente,
todas as funções que consomem eventos de hubs de eventos devem ter um bloco catch . Dessa forma, quando
uma exceção é gerada, o bloco catch trata o erro antes de o ponteiro progredir.
Mecanismos e políticas de repetição
Algumas exceções são transitórias por natureza e não são reexibidas quando uma operação é tentada novamente
mais tarde. É por isso que a primeira etapa é sempre repetir a operação. Você pode escrever novas regras de
processamento, mas elas são tão comuns que várias ferramentas disponíveis. O uso dessas bibliotecas permite
que você defina políticas de repetição robustas, que também podem ajudar a preservar a ordem de
processamento.
A introdução de bibliotecas de tratamento de falhas às suas funções permite que você defina políticas básicas e
avançadas de repetição. Por exemplo, você pode implementar uma política que segue um fluxo de trabalho
ilustrado pelas seguintes regras:
Tente inserir uma mensagem três vezes (potencialmente com um atraso entre repetições).
Se o resultado eventual de todas as novas tentativas for uma falha, adicione uma mensagem a uma fila para
que o processamento possa continuar no fluxo.
As mensagens corrompidas ou não processadas são tratadas posteriormente.
NOTE
Polly é um exemplo de uma biblioteca de resiliência e de tratamento de falhas transitórias C# para aplicativos.
Ao trabalhar com bibliotecas de C# classes previamente compatíveis, os filtros de exceção permitem que você
execute o código sempre que uma exceção sem tratamento ocorrer.
Exemplos que demonstram como usar filtros de exceção estão disponíveis no repositório SDK do Azure WebJobs .
Recursos
Exemplos de processamento de eventos confiáveis
Disjuntor de Durable Functions do Azure
Próximas etapas
Para obter mais informações, consulte os seguintes recursos:
Tratamento de erros do Azure Functions
Automatizar o redimensionamento de imagens carregadas usando a Grade de Eventos
Criar uma função que se integra nos Aplicativos Lógicos do Azure
Criando Azure Functions para entrada idêntica
24/10/2019 • 3 minutes to read • Edit Online
Neste artigo, você aprende os conceitos de alto nível em torno de gatilhos e associações de
funções.
Os gatilhos são o que causa a execução de uma função. Um gatilho define como uma função é
invocada e uma função deve ter exatamente um gatilho. Os gatilhos têm dados associados,
que geralmente são fornecidos como a carga da função.
A associação a uma função é uma maneira de conectar declarativamente outro recurso à
função; as associações podem ser conectadas como associações de entrada, associações de
saídaou ambas. Dados de associações são fornecidos à função como parâmetros.
Você pode misturar e combinar associações diferentes para atender às suas necessidades.
Associações são opcionais e uma função pode ter uma ou várias associações de entrada e/ou
saída.
Gatilhos e associações permitem que você evite codificar o acesso a outros serviços. Sua
função recebe dados (por exemplo, o conteúdo de uma mensagem da fila) em parâmetros de
função. Você envia dados (por exemplo, para criar uma mensagem da fila) usando o valor
retornado da função.
Considere os exemplos a seguir de como você pode implementar funções diferentes.
ASSOCIAÇÃO DE
CENÁRIO DE EXEMPLO DISPARADOR ENTRADA ASSOCIAÇÃO DE SAÍDA
Esses exemplos não devem ser completos, mas são fornecidos para ilustrar como você pode
usar gatilhos e associações juntos.
Definições de associação e gatilho
Os gatilhos e as associações são definidos de forma diferente, dependendo da abordagem de
desenvolvimento.
O portal fornece uma interface do usuário para essa configuração, mas você pode editar o
arquivo diretamente abrindo o Editor avançado disponível por meio da guia integrar da sua
função.
No .NET, o tipo de parâmetro define o tipo de dados para dados de entrada. Por exemplo, use
string para associar ao texto de um gatilho de fila, uma matriz de bytes para ler como
binário e um tipo personalizado para desserializar para um objeto.
Para idiomas que são digitados dinamicamente como JavaScript, use a propriedade dataType
no arquivo function.json. Por exemplo, para ler o conteúdo de uma solicitação HTTP em
formato binário, defina dataType para binary :
{
"dataType": "binary",
"type": "httpTrigger",
"name": "req",
"direction": "in"
}
Direção de associação
Todos os disparadores e associações têm uma propriedade direction no arquivo
function.json:
Para gatilhos, a direção sempre é in
Associações de entrada e saída usam in e out
Algumas associações dão suporte a uma direção especial inout . Se você usar inout ,
somente o Editor avançado estará disponível por meio da guia integrar no Portal.
Quando você usa atributos em uma biblioteca de classes para configurar associações e
gatilhos, a direção é fornecida em um construtor de atributo ou inferida do tipo de parâmetro.
Armazename ✔ ✔ ✔ ✔ ✔
nto de Blobs
BD Cosmos ✔ ✔ ✔ ✔ ✔
Grade de ✔ ✔ ✔
eventos
Hubs de ✔ ✔ ✔ ✔
Eventos
WebHooks ✔ ✔ ✔ ✔
de & de
HTTP
Hub IoT ✔ ✔ ✔ ✔
Microsoft ✔ ✔ ✔
Graph
Excel tabelas
Arquivos de ✔ ✔ ✔
OneDrive
Microsoft
Graph
Microsoft ✔ ✔
Graph
Outlook
email
Microsoft ✔ ✔ ✔ ✔
Graph
events
Tokens de ✔ ✔
Auth
Microsoft
Graph
Aplicativos ✔ ✔ ✔
Móveis
Hubs de ✔ ✔
Notificação
Armazename ✔ ✔ ✔ ✔
nto de filas
TIPO 1.X 2. X OF ENTRADA SAÍDA
SendGrid ✔ ✔ ✔
Barramento ✔ ✔ ✔ ✔
de Serviço
SignalR ✔ ✔ ✔
Armazename ✔ ✔ ✔ ✔
nto de
tabelas
Timer ✔ ✔ ✔
Twilio ✔ ✔ ✔
1 no tempo de execução da versão 2. x, todas as associações, exceto http e Timer, devem ser
registradas. Consulte registrar extensões de associação. Todas as associações 2. x com suporte
também têm suporte na versão 3. x, salvo indicação em contrário.
Para obter informações sobre quais associações estão na visualização ou são aprovadas para
o uso de produção, consulte Idiomas com suporte.
Recursos
Expressões e padrões de associação
Usando o valor de retorno da função do Azure
Como registrar uma expressão de associação
Teste:
Estratégias para testar seu código no Azure Functions
Executar manualmente uma função não disparada por HTTP
Tratamento de erros de associação
Próximas etapas
Registrar Azure Functions extensões de associação
Exemplo de gatilho e Associação de Azure Functions
24/10/2019 • 5 minutes to read • Edit Online
Este artigo demonstra como configurar um gatilho e associações em uma função do Azure.
Suponha que você deseja gravar uma nova linha no Armazenamento de Tabelas do Azure sempre que uma nova
mensagem aparece no Armazenamento de Filas do Azure. Esse cenário pode ser implementado usando um
gatilho do Armazenamento de Filas do Azure e uma associação de saída do Armazenamento de Tabelas do Azure.
Aqui está um arquivo function.json para esse cenário.
{
"bindings": [
{
"type": "queueTrigger",
"direction": "in",
"name": "order",
"queueName": "myqueue-items",
"connection": "MY_STORAGE_ACCT_APP_SETTING"
},
{
"type": "table",
"direction": "out",
"name": "$return",
"tableName": "outTable",
"connection": "MY_TABLE_STORAGE_ACCT_APP_SETTING"
}
]
}
NOTE
O valor de connection é o nome de uma configuração de aplicativo que contém a cadeia de conexão, não a cadeia de
conexão propriamente dita. Associações usam cadeias de conexão armazenadas em configurações de aplicativo para impor a
melhor prática que dita que function.json não contêm segredos do serviço.
Exemplo 2 de C# script
Aqui está o código de script C# que funciona com esse gatilho e essa associação. Observe que o nome do
parâmetro que fornece o conteúdo da mensagem da fila é order ; esse nome é necessário porque o valor da
propriedade name em function.json é order
#r "Newtonsoft.Json"
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
// From an incoming queue message that is a JSON object, add fields and write to Table storage
// The method return value creates a new row in Table Storage
public static Person Run(JObject order, ILogger log)
{
return new Person() {
PartitionKey = "Orders",
RowKey = Guid.NewGuid().ToString(),
Name = order["Name"].ToString(),
MobileNumber = order["MobileNumber"].ToString() };
}
Exemplo de JavaScript
O mesmo arquivo Function. JSON pode ser usado com uma função JavaScript:
// From an incoming queue message that is a JSON object, add fields and write to Table Storage
// The second parameter to context.done is used as the value for the new row
module.exports = function (context, order) {
order.PartitionKey = "Orders";
order.RowKey = generateRandomId();
context.done(null, order);
};
function generateRandomId() {
return Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
}
Agora você tem uma função funcional que é disparada por uma fila do Azure e gera dados para o armazenamento
de tabelas do Azure.
Próximas etapas
Padrões de expressão de associação de Azure Functions
Registrar Azure Functions extensões de associação
24/10/2019 • 7 minutes to read • Edit Online
No Azure Functions versão 2. x, as associações estão disponíveis como pacotes separados do tempo de
execução do functions. Enquanto as funções do .NET acessam associações por meio de pacotes NuGet, os
pacotes de extensão permitem que outras funções acessem todas as associações por meio de um parâmetro de
configuração.
Considere os seguintes itens relacionados a extensões de associação:
As extensões de associação não são explicitamente registradas no functions 1. x, exceto ao criar uma
biblioteca de classes usando C# o Visual Studio.
Os gatilhos HTTP e Timer têm suporte por padrão e não exigem uma extensão.
A tabela a seguir indica quando e como você registra as associações.
REGISTRO REGISTRO
AMBIENTE DE DESENVOLVIMENTO EM FUNÇÕES DE 1. X EM FUNÇÕES 2. X
PROPRIEDADE DESCRIÇÃO
As versões do pacote são incrementadas como pacotes na alteração do pacote. As alterações de versão
principal ocorrem quando os pacotes no pacote são incrementados por uma versão principal, que geralmente
coincide com uma alteração na versão principal do tempo de execução do functions.
O conjunto atual de extensões instaladas pelo pacote padrão é enumerado neste arquivo Extensions. JSON.
O nome do pacote usado para uma determinada associação é fornecido no artigo de referência para essa
associação. Para obter um exemplo, consulte o pacotes seção do artigo de referência de associação do
barramento de serviço.
Substituir <TARGET_VERSION> no exemplo com uma versão específica do pacote, como 3.0.0-beta5 . Versões
válidas são listadas nas páginas de pacotes individuais em NuGet.org. As versões principais que correspondem
às funções de tempo de execução 1. x ou 2. x são especificadas no artigo de referência para a associação.
Se você usar Install-Package o para fazer referência a uma associação, não será necessário usar pacotes de
extensão. Essa abordagem é específica para bibliotecas de classes criadas no Visual Studio.
No Visual Studio Code, instale pacotes para um C# projeto de biblioteca de classes do prompt de comando
usando o comando dotnet adicionar pacote na CLI do .NET Core. O exemplo a seguir demonstra como você
adiciona uma associação:
O .NET Core CLI só pode ser usado para o desenvolvimento do Azure Functions 2.x.
Substitua <BINDING_TYPE_NAME> pelo nome do pacote fornecido no artigo de referência para a associação
desejada. Você pode encontrar o artigo de referência de associação desejada na lista de associações com
suporte.
Substituir <TARGET_VERSION> no exemplo com uma versão específica do pacote, como 3.0.0-beta5 . Versões
válidas são listadas nas páginas de pacotes individuais em NuGet.org. As versões principais que correspondem
às funções de tempo de execução 1. x ou 2. x são especificadas no artigo de referência para a associação.
Próximas etapas
Exemplo de gatilho e associação do Azure function
Padrões de expressão de associação de Azure
Functions
24/10/2019 • 11 minutes to read • Edit Online
[FunctionName("QueueTrigger")]
public static void Run(
[QueueTrigger("%input-queue-name%")]string myQueueItem,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
}
{
"bindings": [
{
"name": "image",
"type": "blobTrigger",
"path": "sample-images/{filename}",
"direction": "in",
"connection": "MyStorageConnection"
},
...
A expressão filename pode ser usada em uma associação de saída para especificar o nome do blob que está
sendo criado:
...
{
"name": "imageSmall",
"type": "blob",
"path": "sample-images-sm/{filename}",
"direction": "out",
"connection": "MyStorageConnection"
}
],
}
Código de função tem acesso a esse mesmo valor usando filename como um nome de parâmetro:
// C# example of binding to {filename}
public static void Run(Stream image, string filename, Stream imageSmall, ILogger log)
{
log.LogInformation($"Blob trigger processing: {filename}");
// ...
}
[FunctionName("ResizeImage")]
public static void Run(
[BlobTrigger("sample-images/{filename}")] Stream image,
[Blob("sample-images-sm/{filename}", FileAccess.Write)] Stream imageSmall,
string filename,
ILogger log)
{
log.LogInformation($"Blob trigger processing: {filename}");
// ...
}
Você também pode criar expressões para partes do nome do arquivo, como a extensão. Para obter mais
informações sobre como usar padrões e expressões na cadeia de caracteres de caminho de Blob, consulte a
referência de associação de blob de Armazenamento.
Metadados de gatilho
Além do conteúdo dos dados fornecido por um gatilho (como o conteúdo da mensagem da fila que disparou
uma função), vários gatilhos fornecem valores de metadados adicionais. Esses valores podem ser usados
como parâmetros de entrada em C# e F# ou propriedades no objeto context.bindings em JavaScript.
Por exemplo, um gatilho do Armazenamento de Filas do Azure é compatível com as seguintes propriedades:
QueueTrigger – disparar o conteúdo da mensagem em caso de uma cadeia de caracteres válida
DequeueCount
ExpirationTime
Id
InsertionTime
NextVisibleTime
PopReceipt
Esses valores de metadados estão acessíveis nas propriedades do arquivo function.json. Por exemplo, suponha
que você usa um gatilho de fila e que a mensagem da fila contém o nome de um blob que você deseja ler. No
arquivo function.json, você pode usar a propriedade de metadados queueTrigger na propriedade path do
blob, conforme mostrado no exemplo a seguir:
"bindings": [
{
"name": "myQueueItem",
"type": "queueTrigger",
"queueName": "myqueue-items",
"connection": "MyStorageConnection",
},
{
"name": "myInputBlob",
"type": "blob",
"path": "samples-workitems/{queueTrigger}",
"direction": "in",
"connection": "MyStorageConnection"
}
]
Detalhes de propriedades de metadados para cada gatilho são descritos no artigo de referência
correspondente. Para obter um exemplo, consulte metadados de gatilho de fila. A documentação também está
disponível na guia Integrar do portal, na seção Documentação abaixo da área de configuração de
associação.
Cargas JSON
Quando uma carga de gatilho for JSON, você pode consultar as propriedades na configuração de outras
associações na mesma função e no código de função.
A exemplo a seguir mostra o arquivo function.json arquivo para uma função de webhook que recebe um nome
de blob em JSON: {"BlobName":"HelloWorld.txt"} . Uma associação de entrada do Blob lê o blob e associação
de saída HTTP retorna o conteúdo de blob na resposta HTTP. Observe que a associação de entrada do Blob
obtém o nome do blob referindo-se diretamente à BlobName propriedade ( "path": "strings/{BlobName}" )
{
"bindings": [
{
"name": "info",
"type": "httpTrigger",
"direction": "in",
"webHookType": "genericJson"
},
{
"name": "blobContents",
"type": "blob",
"direction": "in",
"path": "strings/{BlobName}",
"connection": "AzureWebJobsStorage"
},
{
"name": "res",
"type": "http",
"direction": "out"
}
]
}
Para este trabalho em C# e F#, você precisa de uma classe que define os campos a serem desserializados,
como no exemplo a seguir:
using System.Net;
using Microsoft.Extensions.Logging;
public static HttpResponseMessage Run(HttpRequestMessage req, BlobInfo info, string blobContents, ILogger
log)
{
if (blobContents == null) {
return req.CreateResponse(HttpStatusCode.NotFound);
}
log.LogInformation($"Processing: {info.BlobName}");
Notação de ponto
Se algumas das propriedades na sua carga JSON são objetos com propriedades, você pode consultar esses
diretamente usando a notação de ponto. Por exemplo, suponha que o JSON tem esta aparência:
{
"BlobName": {
"FileName":"HelloWorld",
"Extension":"txt"
}
}
Você pode se referir diretamente a FileName como BlobName.FileName . Com esse formato JSON, aqui está
como se parece a propriedade path no exemplo anterior:
"path": "strings/{BlobName.FileName}.{BlobName.Extension}",
Criar GUIDs
A expressão de associação {rand-guid} cria um GUID. O seguinte caminho de blob em um function.json
arquivo cria um blob com um nome como 50710cb5 -84b9 -4d87 -9d 83 -a03d6976a682.txt.
{
"type": "blob",
"name": "blobOutput",
"direction": "out",
"path": "my-output-container/{rand-guid}"
}
Hora atual
A expressão de associação DateTime resolve para DateTime.UtcNow . O seguinte caminho de blob em um
function.json arquivo cria um blob com um nome como 2018 -02 -16T17 -59 -55Z.txt.
{
"type": "blob",
"name": "blobOutput",
"direction": "out",
"path": "my-output-container/{DateTime}"
}
Próximas etapas
Usando o valor de retorno da função do Azure
Usando o valor de retorno da função do Azure
24/10/2019 • 3 minutes to read • Edit Online
Este artigo explica como os valores de retorno funcionam dentro de uma função.
Em idiomas que têm um valor de retorno, você pode associar uma Associação de saída de função ao valor de
retorno:
Em uma biblioteca de classe C#, aplique o atributo de associação de saída para o valor de retorno do método.
Em outras linguagens, defina a propriedade name em function.json para $return .
Se houver várias associações de saída, use o valor de retorno de apenas um deles.
No C# e script C#, formas alternativas de enviar os dados para uma associação de saída são parâmetros out e
objetos de coletor.
Veja o exemplo específico de uma linguagem que mostra o uso do valor de retorno:
C#
Script do C# (.csx)
F#
JavaScript
Python
Exemplo de C#
Aqui está o código C# que usa o valor de retorno para uma associação de saída, seguido por um exemplo de
assíncrono:
[FunctionName("QueueTrigger")]
[return: Blob("output-container/{id}")]
public static string Run([QueueTrigger("inputqueue")]WorkItem input, ILogger log)
{
string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
log.LogInformation($"C# script processed queue message. Item={json}");
return json;
}
[FunctionName("QueueTrigger")]
[return: Blob("output-container/{id}")]
public static Task<string> Run([QueueTrigger("inputqueue")]WorkItem input, ILogger log)
{
string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
log.LogInformation($"C# script processed queue message. Item={json}");
return Task.FromResult(json);
}
Exemplo 2 de C# script
Aqui está a associação de saída no arquivo function.json:
{
"name": "$return",
"type": "blob",
"direction": "out",
"path": "output-container/{id}"
}
Exemplo de F#
Aqui está a associação de saída no arquivo function.json:
{
"name": "$return",
"type": "blob",
"direction": "out",
"path": "output-container/{id}"
}
O código F# é o seguinte:
Exemplo de JavaScript
Aqui está a associação de saída no arquivo function.json:
{
"name": "$return",
"type": "blob",
"direction": "out",
"path": "output-container/{id}"
}
Exemplo de Python
Aqui está a associação de saída no arquivo function.json:
{
"name": "$return",
"type": "blob",
"direction": "out",
"path": "output-container/{id}"
}
Próximas etapas
Manipular erros de associação de Azure Functions
Manipular erros de associação de Azure Functions
07/11/2019 • 2 minutes to read • Edit Online
Os erros gerados em um Azure Functions podem vir de qualquer uma das seguintes origens:
Uso de gatilhos e associações de Azure Functions internos
Chamadas para APIs de serviços subjacentes do Azure
Chamadas para pontos de extremidade REST
Chamadas para bibliotecas de cliente, pacotes ou APIs de terceiros
Seguir as práticas sólidas de tratamento de erros é importante para evitar a perda de dados ou mensagens
perdidas. As práticas recomendadas de tratamento de erros incluem as seguintes ações:
Habilitar Application Insights
Usar tratamento de erro estruturado
Design para Idempotência
Implementar políticas de repetição (quando apropriado)
Usar tratamento de erro estruturado
Capturar e publicar erros é essencial para monitorar a integridade do seu aplicativo. O nível mais alto de qualquer
código de função deve incluir um bloco try/catch. No bloco catch, você pode capturar e publicar erros.
Tentar suporte novamente
Os seguintes gatilhos têm suporte interno de repetição:
Armazenamento de Blobs do Azure
Armazenamento de Filas do Azure
Barramento de Serviço do Azure (fila/tópico)
Por padrão, esses gatilhos retentam solicitações até cinco vezes. Após a quinta repetição, os dois gatilhos gravam
uma mensagem em uma fila suspeita.
Você precisa implementar manualmente as políticas de repetição para quaisquer outros tipos de associações ou
disparadores. Implementações manuais podem incluir a gravação de informações de erro em uma fila de
mensagens suspeitas. Ao gravar em uma fila suspeita, você tem a oportunidade de tentar novamente as operações
mais tarde. Essa abordagem é a mesma usada pelo gatilho do armazenamento de BLOBs.
Para obter informações sobre erros retornados por serviços com suporte pelas funções, consulte a seção códigos
de erro de ligação do artigo Azure Functions visão geral de tratamento de erros .
Linguagens com suporte no Azure Functions
08/11/2019 • 3 minutes to read • Edit Online
Este artigo explica os níveis de suporte oferecido para linguagens que você pode usar com o Azure Functions.
Níveis de suporte
Há três níveis de suporte:
Geralmente disponível (GA ) – com suporte total e aprovado para uso em produção.
Versão prévia – ainda não tem suporte, mas é esperado para alcançar o status de GA no futuro.
Experimental – não tem suporte e pode ser abandonado no futuro; nenhuma garantia de status de GA ou
de versão prévia eventual.
IDIOMA 1.X 2. X 3. X 1
Próximos passos
Para saber mais sobre como desenvolver funções nos idiomas com suporte, consulte os seguintes recursos:
C#referência do desenvolvedor da biblioteca de classes
C#referência do desenvolvedor de script
Referência do desenvolvedor Java
Referência do desenvolvedor de JavaScript
Referência do desenvolvedor do PowerShell
Referência do desenvolvedor do Python
Referência do desenvolvedor TypeScript
Referência do desenvolvedor de C#
do Azure Functions
07/11/2019 • 22 minutes to read • Edit Online
<framework.version>
| - bin
| - MyFirstFunction
| | - function.json
| - MySecondFunction
| | - function.json
| - host.json
Microsoft.NET.Sdk.Functions
A geração do arquivo function.json é realizada pelo pacote NuGet
Microsoft.NET.Sdk.Functions.
O mesmo pacote é usado para a versão 1.x e 2.x do tempo de execução do
Functions. A estrutura de destino é o que diferencia um projeto de 1.x de um projeto
de 2.x. Estas são as partes relevantes dos arquivos .csproj, mostrando estruturas de
destino diferentes e o mesmo pacote Sdk :
Functions 1.x
<PropertyGroup>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.8" />
</ItemGroup>
Functions 2.x
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.8" />
</ItemGroup>
TIP
Se você planeja usar as ligações HTTP ou WebHook, planeje evitar o esgotamento de
porta que pode ser causado pela instanciação incorreta do HttpClient . Para saber mais,
confira Como gerenciar conexões no Azure Functions.
Registrando em log
A saída de log para logs de streaming em C#, inclue um argumento do tipo ILogger.
É recomendável que você nomeie log , conforme mostrado no exemplo a seguir:
Assíncrono
Para tornar uma função assíncrona, use a palavra-chave async e retorne um objeto
Task .
Tokens de cancelamento
Uma função pode aceitar um parâmetro CancellationToken que permite ao sistema
operacional notificar seu código quando a função está prestes a ser encerrada. Você
pode usar essa notificação para certificar-se de que a função não finalize
inesperadamente de uma maneira que os dados fiquem em um estado
inconsistente.
O exemplo a seguir mostra como verificar o encerramento da função iminente.
Variáveis de ambiente
Para obter uma variável de ambiente ou um valor de configuração do aplicativo, use
System.Environment.GetEnvironmentVariable , conforme mostrado no exemplo de
código a seguir:
Gatilhos e associações
Esta tabela mostra as associações com suporte nas duas versões principais do
tempo de execução de Azure Functions:
TIPO 1.X 2. X 1 OF ENTRADA SAÍDA
Armazenam ✔ ✔ ✔ ✔ ✔
ento de
Blobs
BD Cosmos ✔ ✔ ✔ ✔ ✔
Grade de ✔ ✔ ✔
eventos
Hubs de ✔ ✔ ✔ ✔
Eventos
WebHooks ✔ ✔ ✔ ✔
de & de
HTTP
Hub IoT ✔ ✔ ✔ ✔
Microsoft ✔ ✔ ✔
Graph
Excel
tabelas
Arquivos de ✔ ✔ ✔
OneDrive
Microsoft
Graph
Microsoft ✔ ✔
Graph
Outlook
email
Microsoft ✔ ✔ ✔ ✔
Graph
events
Tokens de ✔ ✔
Auth
Microsoft
Graph
Aplicativos ✔ ✔ ✔
Móveis
Hubs de ✔ ✔
Notificação
Armazenam ✔ ✔ ✔ ✔
ento de
filas
SendGrid ✔ ✔ ✔
TIPO 1.X 2. X OF ENTRADA SAÍDA
Barramento ✔ ✔ ✔ ✔
de Serviço
SignalR ✔ ✔ ✔
Armazenam ✔ ✔ ✔ ✔
ento de
tabelas
Timer ✔ ✔ ✔
Twilio ✔ ✔ ✔
Próximas etapas
Saiba mais sobre gatilhos e associações
Saiba mais sobre práticas recomendadas do Azure Functions
Referência do desenvolvedor de scripts C# (.csx) do
Azure Functions
25/05/2018 • 20 minutes to read • Edit Online
Este artigo é uma introdução ao desenvolvimento do Azure Functions usando o script C# ( .csx).
O Azure Functions oferece suporte às linguagens de programação C# e script C#. Se você estiver procurando
diretrizes sobre usar C# em um projeto de biblioteca de classes do Visual Studio, consulte Referência do
desenvolvedor C#.
Este artigo pressupõe que você já tenha lido o Guia de desenvolvedores do Azure Functions.
O formato .csx permite escrever menos “texto clichê” e se concentrar apenas em escrever uma função C#. Em vez
de encapsular tudo em um namespace e uma classe, basta definir um método Run . Inclua todas as referências de
assembly e todos os namespaces no início do arquivo, como de costume.
Arquivos .csx do aplicativo de função são compilados quando uma instância é inicializada. Nessa etapa de
compilação, coisas como a inicialização a frio podem levar mais tempo para funções de script C# em comparação a
bibliotecas de classes do C#. Essa etapa de compilação também mostra porque funções do script C# são editáveis
no portal do Azure enquanto objetos visuais do C# não são.
Estrutura de pastas
A estrutura de pastas para um projeto de script C# é semelhante à seguinte:
FunctionsProject
| - MyFirstFunction
| | - run.csx
| | - function.json
| | - function.proj
| - MySecondFunction
| | - run.csx
| | - function.json
| | - function.proj
| - host.json
| - extensions.csproj
| - bin
Há um arquivo host.json compartilhado que pode ser usado para configurar o aplicativo de funções. Cada função
possui seu próprio arquivo de código (.csx) e arquivo de configuração de associação (function.json).
As extensões de associação necessárias na versão 2.x do tempo de execução do Functions são definidas no arquivo
extensions.csproj , com os arquivos de biblioteca reais na pasta bin . Ao desenvolver localmente, você precisa
registrar as extensões de associação. Ao desenvolver funções no portal do Azure, esse registro é feito para você.
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;
TIP
Se você planeja usar as ligações HTTP ou WebHook, planeje evitar o esgotamento de porta que pode ser causado pela
instanciação incorreta do HttpClient . Para saber mais, confira Como gerenciar conexões no Azure Functions.
Uma classe POCO deve ter getter e setter definidos para cada propriedade.
#load "mylogger.csx"
using Microsoft.Extensions.Logging;
Exemplo de mylogger.csx:
Usar um arquivo .csx compartilhado é um padrão comum quando você deseja tipar fortemente os argumentos
transmitidos entre as funções usando um objeto POCO. No seguinte exemplo simplificado, um gatilho HTTP e um
gatilho de fila compartilham um objeto POCO chamado Order para tipar fortemente os dados do pedido:
Exemplo run.csx para o gatilho HTTP:
#load "..\shared\order.csx"
using System.Net;
using Microsoft.Extensions.Logging;
if (req.orderId == null)
{
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
else
{
await outputQueueItem.AddAsync(req);
return new HttpResponseMessage(HttpStatusCode.OK);
}
}
#load "..\shared\order.csx"
using System;
using Microsoft.Extensions.Logging;
public static void Run(Order myQueueItem, out Order outputQueueItem, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed order...");
log.LogInformation(myQueueItem.ToString());
outputQueueItem = myQueueItem;
}
Exemplo order.csx:
public class Order
{
public string orderId {get; set; }
public string custName {get; set;}
public string custAddress {get; set;}
public string custEmail {get; set;}
public string cartId {get; set; }
Registro em log
A saída de log para logs de streaming em C#, inclue um argumento do tipo ILogger. Recomendamos nomeá-lo
como log . Evite usar Console.Write no Azure Functions.
NOTE
Para obter informações sobre uma estrutura de log mais recente que pode ser usada no lugar de TraceWriter , consulte
Gravar logs nas funções C# no artigo Monitorar o Azure Functions.
Assíncrono
Para tornar uma função assíncrona, use a palavra-chave async e retorne um objeto Task .
Não é possível usar parâmetros out em funções assíncronas. Para associações de saída, use o valor de retorno de
função ou um objeto coletor.
Tokens de cancelamento
Uma função pode aceitar um parâmetro CancellationToken que permite ao sistema operacional notificar seu
código quando a função está prestes a ser encerrada. Você pode usar essa notificação para certificar-se de que a
função não finalize inesperadamente de uma maneira que os dados fiquem em um estado inconsistente.
O exemplo a seguir mostra como verificar o encerramento da função iminente.
using System;
using System.IO;
using System.Threading;
Importando namespaces
Se precisar importar namespaces, você poderá fazer como geralmente faz, com a cláusula using .
using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
#r "System.Web.Http"
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
Os seguintes assemblies são adicionados automaticamente pelo ambiente de hospedagem do Azure Functions:
mscorlib
System
System.Core
System.Xml
System.Net.Http
Microsoft.Azure.WebJobs
Microsoft.Azure.WebJobs.Host
Microsoft.Azure.WebJobs.Extensions
System.Web.Http
System.Net.Http.Formatting
Os seguintes assemblies podem ser referenciados por um nome simples (por exemplo, #r "AssemblyName" ):
Newtonsoft.Json
Microsoft.WindowsAzure.Storage
Microsoft.ServiceBus
Microsoft.AspNet.WebHooks.Receivers
Microsoft.AspNet.WebHooks.Common
Microsoft.Azure.NotificationHubs
Para obter informações sobre como carregar arquivos na pasta da função, consulte a seção sobre gerenciamento
de pacotes.
Diretórios inspecionados
O diretório que contém o arquivo de script da função é inspecionado automaticamente quanto às alterações nos
assemblies. Para inspecionar alterações de assembly em outros diretórios, adicione-os à lista watchDirectories em
host.json.
<ItemGroup>
<PackageReference Include="Microsoft.ProjectOxford.Face" Version="1.1.0" />
</ItemGroup>
</Project>
Para usar um feed do NuGet personalizado, especifique o feed em um arquivo Nuget.Config na raiz do Aplicativo
de Funções. Para obter mais informações, consulte Configurando o comportamento do NuGet.
NOTE
Em funções 1. C# x, os pacotes NuGet são referenciados com um arquivo Project. JSON em vez de um arquivo Function. proj
.
Para funções 1. x, use um arquivo Project. JSON em vez disso. Aqui está um exemplo de arquivo Project. JSON :
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.ProjectOxford.Face": "1.1.0"
}
}
}
}
Variáveis de ambiente
Para obter uma variável de ambiente ou um valor de configuração do aplicativo, use
System.Environment.GetEnvironmentVariable , conforme mostrado no exemplo de código a seguir:
public static void Run(TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}
Associando no runtime
No C#, e em outras linguagens .NET, você pode usar um padrão de associação obrigatório, em vez de associações
declarativas em function.json. A associação obrigatória é útil quando os parâmetros de associação precisam ser
calculado no runtime, em vez do tempo de design. Com esse padrão, é possível se vincular a associações de
entrada e saída com suporte instantaneamente no código da função.
Defina uma associação obrigatória da seguinte maneira:
Não inclua uma entrada em function.json para as associações obrigatórias desejadas.
Passe um parâmetro de entrada Binder binder ou IBinder binder .
Use o padrão de C# a seguir para realizar a associação de dados.
BindingTypeAttribute é o atributo do .NET que define a associação, e T é um tipo de entrada ou saída com
suporte nesse tipo de associação. T não pode ser um tipo de parâmetro out (como out JObject ). Por exemplo, a
associação de saída de tabela de aplicativos móveis dá suporte a seis tipos de saída, mas você só pode usar
ICollector<t > ou IAsyncCollector<T> para T .
Exemplo de atributo único
O código de exemplo a seguir cria uma associação de saída do Armazenamento de Blobs com o caminho do blob
definido em tempo de execução e grava uma cadeia de caracteres no blob.
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;
A tabela a seguir lista os atributos .NET para cada tipo de associação e os pacotes no qual eles são definidos.
Cosmos DB Microsoft.Azure.WebJobs.DocumentDBAttribute
#r
"Microsoft.Azure.WebJobs.Extensions.CosmosDB"
Twilio Microsoft.Azure.WebJobs.TwilioSmsAttribute
#r
"Microsoft.Azure.WebJobs.Extensions.Twilio"
Próximos passos
Saiba mais sobre gatilhos e associações
Saiba mais sobre práticas recomendadas do Azure Functions
Referência do desenvolvedor em F# do Azure
Functions
25/05/2018 • 13 minutes to read • Edit Online
F# para Azure Functions é uma solução para executar facilmente pequenos trechos de código, ou
"funções", na nuvem. Fluxos de dados em sua função F# por meio de argumentos de função. Os nomes
de argumentos são especificados em function.json e há nomes predefinidos para acessar itens como a
função logger e os tokens de cancelamento.
IMPORTANT
O script F# (.fsx) só tem suporte da versão 1.x do tempo de execução do Azure Functions. Se você desejar usar o
F# com o tempo de execução da versão 2.x, deverá usar um projeto de biblioteca de classes F# pré-compilado (.fs).
Crie, gerencie e publique um projeto de biblioteca de classe F# usando o Visual Studio como faria com um projeto
de biblioteca de classe C#. Para saber mais sobre as versões do Functions, confira Visão geral de versões de tempo
de execução do Azure Functions.
Este artigo pressupõe que você já tenha lido a referência do desenvolvedor do Azure Functions.
Estrutura de pastas
A estrutura de pastas para um projeto de script F# é semelhante à seguinte:
FunctionsProject
| - MyFirstFunction
| | - run.fsx
| | - function.json
| | - function.proj
| - MySecondFunction
| | - run.fsx
| | - function.json
| | - function.proj
| - host.json
| - extensions.csproj
| - bin
Há um arquivo host.json compartilhado que pode ser usado para configurar o aplicativo de funções. Cada
função possui seu próprio arquivo de código (.fsx) e arquivo de configuração de associação (function.json).
As extensões de associação necessárias na versão 2.x do tempo de execução do Functions são definidas
no arquivo extensions.csproj , com os arquivos de biblioteca reais na pasta bin . Ao desenvolver
localmente, você precisa registrar as extensões de associação. Ao desenvolver funções no portal do Azure,
esse registro é feito para você.
O Azure Function em F# usará um ou mais argumentos. Quando falamos sobre os argumentos do Azure
Functions, nos referimos a argumentos de entrada e argumentos de saída. Um argumento de entrada é
exatamente o que parece: uma entrada para o Azure Function em F#. Um argumento de saída são dados
mutáveis ou um argumento byref<> que serve como uma maneira de passar dados de volta saindo de
sua função.
No exemplo acima, blob é um argumento de entrada e output é um argumento de saída. Observe que
utilizamos byref<> para output (não é necessário adicionar a anotação [<Out>] ). O uso de um tipo
byref<> permite que sua função altere o registro ou o objeto ao qual o argumento se refere.
Quando um registro em F# é usado como um tipo de entrada, a definição de registro deve ser marcada
com [<CLIMutable>] para permitir que a estrutura do Azure Functions defina os campos adequadamente
antes de passar o registro para a função. Nos bastidores, [<CLIMutable>] gera setters para as
propriedades de registro. Por exemplo:
[<CLIMutable>]
type TestObject =
{ SenderName : string
Greeting : string }
Uma classe de F# também pode ser usada para ambos os argumentos. Para uma classe, as propriedades
geralmente exigirão getters e setters. Por exemplo:
type Item() =
member val Id = "" with get,set
member val Text = "" with get,set
Registrando em log
Para registrar a saída em seus logs de streaming em F#, sua função deve usar um argumento do tipo
ILogger. Para manter a consistência, recomendamos que esse argumento seja denominado log . Por
exemplo:
let Run(blob: string, output: byref<string>, log: ILogger) =
log.LogInformation(sprintf "F# Azure Function processed a blob: %s" blob)
output <- input
Assíncrono
O fluxo de trabalho de async pode ser usado, mas o resultado precisa retornar um Task . Isso pode ser
feito com Async.StartAsTask , por exemplo:
Token de cancelamento
Se a sua função precisar manipular o desligamento com cuidado, atribua um argumento
CancellationToken . Isso pode ser combinado com async , por exemplo:
Importando namespaces
É possível abrir os namespaces como de costume:
open System.Net
open System.Threading.Tasks
open Microsoft.Extensions.Logging
open System.Net
open System.Net.Http
open System.Threading.Tasks
open Microsoft.Extensions.Logging
Além disso, os seguintes assemblies têm regras de maiúsculas e minúsculas especiais e podem ser
referenciados por simplename (por exemplo, #r "AssemblyName" ):
Newtonsoft.Json
Microsoft.WindowsAzure.Storage
Microsoft.ServiceBus
Microsoft.AspNet.WebHooks.Receivers
Microsoft.AspNEt.WebHooks.Common .
Se precisar fazer referência a um assembly particular, carregue o arquivo do assembly em uma pasta bin
relativa à sua função e faça referência a ela usando o nome do arquivo (por exemplo, #r "MyAssembly.dll"
). Para obter informações sobre como carregar arquivos na pasta da função, consulte a seção a seguir
sobre gerenciamento de pacotes.
Prelúdio do editor
Um editor que oferece suporte aos Serviços de compilador em F# não estará ciente dos namespaces e
assemblies que o Azure Functions inclui automaticamente. Dessa forma, pode ser útil incluir um prelúdio
que ajuda o editor a encontrar os assemblies que você está usando e a abrir explicitamente os
namespaces. Por exemplo:
#if !COMPILED
#I "../../bin/Binaries/WebJobs.Script.Host"
#r "Microsoft.Azure.WebJobs.Host.dll"
#endif
open System
open Microsoft.Azure.WebJobs.Host
open Microsoft.Extensions.Logging
Quando o Azure Functions executa seu código, ele processa o código-fonte com COMPILED definido, e o
prelúdio do editor é ignorado.
Gerenciamento de pacote
Para usar os pacotes do NuGet em uma função F#, adicione um arquivo project.json à pasta da função,
no sistema de arquivos do aplicativo de funções. Veja um exemplo de arquivo project.json que adiciona
uma referência do pacote NuGet ao Microsoft.ProjectOxford.Face versão 1.1.0:
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.ProjectOxford.Face": "1.1.0"
}
}
}
}
Somente o .NET Framework 4.6 tem suporte. Desse modo, tenha certeza de que o arquivo project.json
especifica net46 , como mostrado aqui.
Quando você carrega um arquivo project.json , o tempo de execução obtém os pacotes e adiciona
referências automaticamente aos assemblies do pacote. Você não precisa adicionar diretivas
#r "AssemblyName" . Basta adicionar as instruções open necessárias ao seu arquivo .fsx .
Talvez você queira colocar automaticamente assemblies de referência no prelúdio de seu editor, para
melhorar a interação do editor com os Serviços de compilação em F#.
Como adicionar um arquivo project.json ao Azure Function
1. Comece verificando se o aplicativo está em execução, o que pode ser feito abrindo a função no portal
do Azure. Isso também permite acessar os logs de streaming nos quais a saída da instalação do pacote
será exibida.
2. Para carregar um arquivo project.json , use um dos métodos descritos em Como atualizar os
arquivos de aplicativo de funções. Se você estiver usando a Implantação contínua para o Azure
Functions, adicione um arquivo project.json à sua ramificação de preparo a fim de testar antes de
adicioná-lo à sua ramificação de implantação.
3. Depois que o arquivo project.json for adicionado, você verá uma saída semelhante ao exemplo a
seguir em seu log de streaming da função:
2016-04-04T19:02:48.745 Restoring packages.
2016-04-04T19:02:48.745 Starting NuGet restore
2016-04-04T19:02:50.183 MSBuild auto-detection: using msbuild version '14.0' from 'D:\Program Files
(x86)\MSBuild\14.0\bin'.
2016-04-04T19:02:50.261 Feeds used:
2016-04-04T19:02:50.261 C:\DWASFiles\Sites\facavalfunctest\LocalAppData\NuGet\Cache
2016-04-04T19:02:50.261 https://api.nuget.org/v3/index.json
2016-04-04T19:02:50.261
2016-04-04T19:02:50.511 Restoring packages for D:\home\site\wwwroot\HttpTriggerCSharp1\Project.json...
2016-04-04T19:02:52.800 Installing Newtonsoft.Json 6.0.8.
2016-04-04T19:02:52.800 Installing Microsoft.ProjectOxford.Face 1.1.0.
2016-04-04T19:02:57.095 All packages are compatible with .NETFramework,Version=v4.6.
2016-04-04T19:02:57.189
2016-04-04T19:02:57.189
2016-04-04T19:02:57.455 Packages restored.
Variáveis de ambiente
Para obter uma variável de ambiente ou um valor de configuração do aplicativo, use
System.Environment.GetEnvironmentVariable , por exemplo:
open System.Environment
open Microsoft.Extensions.Logging
#load "logger.fsx"
logger.fsx
Os caminhos fornecidos para a diretiva #load são relativos ao local de seu arquivo .fsx .
#load "logger.fsx" carrega um arquivo localizado na pasta de função.
#load "package\logger.fsx" carrega um arquivo localizado na pasta package na pasta da função.
#load "..\shared\mylogger.fsx" carrega um arquivo localizado em uma pasta shared no mesmo nível
que a pasta de função, ou seja, diretamente em wwwroot .
A diretiva #load só funciona com arquivos .fsx (script em F#) e não com arquivos .fs .
Próximas etapas
Para saber mais, consulte os recursos a seguir:
Guia de F#
Práticas recomendadas para o Azure Functions
Referência do desenvolvedor do Azure Functions
Gatilhos e associações de Azure Functions
Teste do Azure Functions
Dimensionamento do Azure Functions
Guia do desenvolvedor de JavaScript do Azure
Functions
25/05/2018 • 40 minutes to read • Edit Online
Este guia contém informações sobre as complexidades de escrever Azure Functions com JavaScript.
Uma função JavaScript é um function exportado que é executado quando acionado ( acionadores são
configurados em function.json). O primeiro argumento passado para cada função é um objeto context , que é
usado para receber e enviar dados de associação, registro em log e comunicação com o tempo de execução.
Este artigo pressupõe que você já tenha lido a Referência do desenvolvedor do Azure Functions. Conclua o início
rápido do Functions para criar sua primeira função, usando Visual Studio Code ou no portal.
Este artigo também dá suporte ao desenvolvimento de aplicativos TypeScript.
Estrutura de pastas
A estrutura de pastas necessárias para um projeto JavaScript é semelhante à seguinte. Este padrão pode ser
alterado. Para mais informações, consulte a seção scriptArquivo abaixo.
FunctionsProject
| - MyFirstFunction
| | - index.js
| | - function.json
| - MySecondFunction
| | - index.js
| | - function.json
| - SharedCode
| | - myFirstHelperFunction.js
| | - mySecondHelperFunction.js
| - node_modules
| - host.json
| - package.json
| - extensions.csproj
Na raiz do projeto, há um arquivo host.json compartilhado que pode ser usado para configurar o aplicativo de
funções. Cada função tem uma pasta com seu próprio arquivo de código (.js) e o arquivo de configuração de
associação (function.json). O nome do diretório pai de function.json é sempre o nome da sua função.
As extensões de associação necessárias na versão 2.x do tempo de execução do Functions são definidas no arquivo
extensions.csproj , com os arquivos de biblioteca reais na pasta bin . Ao desenvolver localmente, você precisa
registrar as extensões de associação. Ao desenvolver funções no portal do Azure, esse registro é feito para você.
Ao exportar uma função assíncrona, você também pode configurar uma ligação de saída para obter o valor return
. Isso é recomendado se você tiver apenas uma associação de saída.
Para atribuir uma saída usando return , altere o name propriedade a ser $return em function.json .
{
"type": "http",
"direction": "out",
"name": "$return"
}
Associações
Em JavaScript, ligações são configuradas e definidas na função function.json. As funções interagem com as ligações
de várias maneiras.
Entradas
As entradas são divididas em duas categorias no Azure Functions: uma é a entrada de gatilho e a outra é a entrada
adicional. Trigger e outras ligações de entrada (ligações de direction === "in" ) podem ser lidas por uma função de
três maneiras:
[Recomendado] Como parâmetros passados para sua função. Eles são passados para a função na
mesma ordem em que são definidos function.json. A propriedade name definida em Function. JSON não
precisa corresponder ao nome do parâmetro, embora deva ser.
Como entradas usando o arguments objeto JavaScript. Isso é essencialmente o mesmo que passar
entradas como parâmetros, mas permite que você manipule dinamicamente entradas.
outputs
As saídas (ligações de direction === "out" ) podem ser gravadas por uma função de várias maneiras. Em todos os
casos, a propriedade name da ligação, conforme definido em function.json, corresponde ao nome do membro do
objeto gravado na sua função.
Você pode atribuir dados a associações de saída de uma das seguintes maneiras (não Combine esses métodos):
[Recomendado para várias saídas] Retornando um objeto. Se você estiver usando uma função de
retorno de Async/Promise, poderá retornar um objeto com os dados de saída atribuídos. No exemplo
abaixo, as ligações de saída são nomeadas "httpResponse" e "queueOutput" em function.json.
Se você estiver usando uma função síncrona, você pode retornar este objeto usando context.done (veja o
exemplo).
[Recomendado para saída única] Retornando um valor diretamente e usando o nome de ligação $
return. Isso funciona apenas para as funções de retorno assíncrono / Promessa. Veja o exemplo em
exportando uma função assíncrona.
Atribuindo valores a serem context.bindings você pode atribuir valores diretamente para Context.
Bindings.
module.exports = async function(context) {
let retMsg = 'Hello, world!';
context.bindings.httpResponse = {
body: retMsg
};
context.bindings.queueOutput = retMsg;
return;
};
{
"type": "httpTrigger",
"name": "req",
"direction": "in",
"dataType": "binary"
}
objeto de contexto
O tempo de execução usa um objeto context para passar dados de/para sua função e permitir que você se
comunique com o tempo de execução. O objeto de contexto pode ser usado para ler e definir os dados de
associações, gravar logs e usando o context.done retorno de chamada quando a função exportada é síncrona.
O context objeto é sempre o primeiro parâmetro para uma função. Deve ser incluído porque tem métodos
importantes, como context.done e context.log . Você pode nomear o objeto de acordo com a sua preferência (por
exemplo, ctx ou c ).
Propriedade context.bindings
context.bindings
Retorna um objeto nomeado que é usado para ler ou atribuir dados de associação. Dados de associação de entrada
e gatilho podem ser acessados pela leitura de propriedades em context.bindings . Os dados de associação de saída
podem ser atribuídos adicionando dados a context.bindings
Por exemplo, as seguintes definições de ligação em sua função.json permitem acessar o conteúdo de uma fila de
context.bindings.myInput e atribuir saídas a uma fila usando context.bindings.myOutput .
{
"type":"queue",
"direction":"in",
"name":"myInput"
...
},
{
"type":"queue",
"direction":"out",
"name":"myOutput"
...
}
// myInput contains the input data, which may have properties such as "name"
var author = context.bindings.myInput.name;
// Similarly, you can set your output data
context.bindings.myOutput = {
some_text: 'hello world',
a_number: 1 };
Você pode optar por definir os dados de ligação de saída usando o método context.done em vez do objeto
context.binding (veja abaixo).
Propriedade context.bindingData
context.bindingData
Retorna um objeto nomeado que contém dados de invocação de função e os metadados do gatilho ( invocationId ,
sys.methodName , sys.utcNow , sys.randGuid ). Para obter um exemplo de metadados de gatilho, confira este
exemplo de hubs de eventos.
Método context.done
context.done([err],[propertyBag])
Permite que o runtime saiba que seu código foi concluído. Quando sua função usa a declaração async function ,
você não precisa usar context.done() . O context.done retorno de chamada é chamado implicitamente. As funções
assíncronas estão disponíveis no Nó 8 ou em uma versão posterior, que requer a versão 2.x do runtime de Funções.
Se a função não é uma função assíncrona, você precisa chamar context.done para informar ao tempo de
execução que a função está concluída. Os tempos de execução se está ausente.
O método context.done permite que você retorne um erro definido pelo usuário ao tempo de execução e um
objeto JSON que contém dados de associação de saída. As propriedades transmitidas para context.done
sobrescrevem qualquer coisa definida no objeto context.bindings .
Método context.log
context.log(message)
Permite que você grave em logs de função de streaming no nível de rastreamento padrão. No context.log , há
métodos de registro adicionais disponíveis para permitir que você grave logs de função em outros níveis de
rastreamento:
MÉTODO DESCRIÇÃO
Você pode configurar o limite do nível de rastreamento para registro em log no arquivo host.json. Para obter mais
informações sobre como gravar logs, confira Gravando saídas de rastreamento abaixo.
Leia Monitorado o Azure Functions para saber mais sobre como exibir e consultar logs de função.
Quando você chama context.log() , sua mensagem é gravada no console no nível de rastreamento padrão, que é
o nível de rastreamento de informações. O código a seguir grava no console no nível de rastreamento de
informações:
context.log({hello: 'world'});
context.log.info({hello: 'world'});
Como erro é o nível de rastreamento mais alto, esse rastreamento é gravado na saída em todos os níveis de
rastreamento enquanto o registro em log estiver habilitado.
Todos os métodos context.log dão suporte ao mesmo formato de parâmetro que o método util.format de
Node.js. Considere o código a seguir, que grava logs de função usando o nível de rastreamento padrão:
{
"tracing": {
"consoleLevel": "verbose"
}
}
Os valores de consoleLevel correspondem aos nomes dos métodos context.log . Para desabilitar todo o registro
em log do rastreamento no console, defina consoleLevel como off. Para obter mais informações, consulte a
referência para host.json.
PROPRIEDADE DESCRIÇÃO
Objeto de resposta
O objeto context.res (resposta) tem as seguintes propriedades:
PROPRIEDADE DESCRIÇÃO
// You can access your http request off the context ...
if(context.req.body.emoji === ':pizza:') context.log('Yay!');
// and also set your http response
context.res = { status: 202, body: 'You successfully ordered more coffee!' };
{
"type": "http",
"direction": "out",
"name": "response"
}
[Somente Resposta] Chamando context.res.send(body?: any) . Uma resposta HTTP é criada com a
entrada body como o corpo da resposta. context.done() é chamado implicitamente.
[Somente Resposta] Chamando context.done() . Um tipo especial de associação HTTP retorna a resposta
que é passada para o método context.done() . A seguinte associação de saída HTTP define um parâmetro
de saída $return :
{
"type": "http",
"direction": "out",
"name": "$return"
}
Versão do nó
A tabela a seguir mostra a versão do Node.js usada por cada versão principal do runtime do Functions:
Veja versão atual que o tempo de execução está usando verificando a configuração de aplicativo acima ou
imprimindo process.version de qualquer função.
Gerenciamento de dependências
Para usar as bibliotecas da comunidade no código JavaScript, como é mostrado no exemplo abaixo, você precisa
garantir que todas as dependências sejam instaladas no aplicativo de funções no Azure.
module.exports = function(context) {
// Using our imported underscore.js library
var matched_names = _
.where(context.bindings.myInput.names, {first: 'Carla'});
NOTE
Você deve definir um arquivo package.json na raiz do seu aplicativo de função. A definição de arquivo permite que todas as
funções no aplicativo compartilhem os mesmos pacotes armazenados em cache, o que oferece o melhor desempenho. Se
houver conflitos de versão, você poderá resolver o conflito adicionando um arquivo package.json na pasta de uma função
específica.
Ao implantar os aplicativos de função do controle de origem, qualquer arquivo package.json presente em seu
repositório acionará um npm install em sua pasta durante a implantação. Mas ao implantar via Portal ou CLI,
você terá que instalar manualmente os pacotes.
Há duas maneiras de instalar pacotes no aplicativo de funções:
Implantando com dependências
1. Instale todos os pacotes necessários localmente executando npm install .
2. Implante o código e verifique se a pasta node_modules está incluída na implantação.
Usando o Kudu
1. Vá para https://<function_app_name>.scm.azurewebsites.net .
2. Clique em Console de Depuração > CMD.
3. Acesse D:\home\site\wwwroot e arraste o arquivo package.json para a pasta wwwroot na metade superior da
página.
Também há outras maneiras de carregar arquivos em seu aplicativo de função. Para saber mais, confira
Como atualizar os arquivos do aplicativo de função.
4. Depois que o arquivo package.json é carregado, execute o comando npm install no console de execução
remota do Kudu.
Essa ação baixa os pacotes indicados no arquivo package.json e reinicia o aplicativo de função.
Variáveis de ambiente
Em funções, configurações do aplicativo, como conexão de serviço cadeias de caracteres, são expostas como
variáveis de ambiente durante a execução. Você pode acessar essas configurações usando process.env , conforme
mostrado aqui na segunda e terceira chamadas para context.log() em que registramos as variáveis de ambiente
AzureWebJobsStorage e WEBSITE_SITE_NAME :
Por padrão, uma função JavaScript é executada do index.js , um arquivo que compartilha o mesmo diretório pai
que seu function.json correspondente.
scriptFile pode ser usado para obter uma estrutura de pastas semelhante ao exemplo a seguir:
FunctionApp
| - host.json
| - myNodeFunction
| | - function.json
| - lib
| | - sayHello.js
| - node_modules
| | - ... packages ...
| - package.json
O function.json da myNodeFunction deve incluir uma propriedade scriptFile que aponte para o arquivo com a
função exportada a ser executada.
{
"scriptFile": "../lib/sayHello.js",
"bindings": [
...
]
}
Usando o entryPoint
No scriptFile (ou index.js ), uma função precisa ser exportada usando module.exports para ser localizada e
executada. Por padrão, a função que é executada quando disparada é a única exportação desse arquivo, a
exportação denominada run ou a exportação denominada index .
Isso pode ser configurado usando entryPoint em function.json , como no exemplo a seguir:
{
"entryPoint": "logFoo",
"bindings": [
...
]
}
No Functions v2.x, que suporta o parâmetro this nas funções do usuário, o código da função poderia ser como
no seguinte exemplo:
class MyObj {
constructor() {
this.foo = 1;
};
logFoo(context) {
context.log("Foo is " + this.foo);
context.done();
}
}
Neste exemplo, é importante observar que, embora um objeto esteja sendo exportado, não há nenhuma garantia
para preservar o estado entre as execuções.
Depuração local
Quando iniciado com o parâmetro --inspect , um processo node. js escuta um cliente de depuração na porta
especificada. No Azure Functions 2. x, você pode especificar argumentos para passar para o processo node. js que
executa seu código adicionando a variável de ambiente ou configuração de aplicativo
languageWorkers:node:arguments = <args> .
TypeScript
Quando você visa a versão 2. x do tempo de execução do functions, ambos Azure Functions para Visual Studio
Code e o Azure Functions Core Tools permitem criar aplicativos de funções usando um modelo que ofereça
suporte a projetos de aplicativo de função TypeScript. O modelo gera package.json e tsconfig.json arquivos de
projeto que facilitam a transcompile, a execução e a publicação de funções JavaScript a partir do código TypeScript
com essas ferramentas.
Um arquivo de .funcignore gerado é usado para indicar quais arquivos são excluídos quando um projeto é
publicado no Azure.
Os arquivos TypeScript (. TS ) são transcompilados em arquivos JavaScript (. js) no diretório de saída dist . Os
modelos do TypeScript usam o parâmetro scriptFile no function.json para indicar o local do arquivo. js
correspondente na pasta dist . O local de saída é definido pelo modelo usando outDir parâmetro no arquivo de
tsconfig.json . Se você alterar essa configuração ou o nome da pasta, o tempo de execução não será capaz de
localizar o código a ser executado.
NOTE
O suporte experimental para TypeScript existe na versão 1. x do tempo de execução do functions. A versão experimental
compila os arquivos TypeScript em arquivos JavaScript quando a função é invocada. Na versão 2. x, esse suporte experimental
foi substituído pelo método controlado por ferramentas que faz transpilação antes do host ser inicializado e durante o
processo de implantação.
A maneira como você desenvolve e implanta localmente a partir de um projeto TypeScript depende de sua
ferramenta de desenvolvimento.
Código do Visual Studio
O Azure Functions para Visual Studio Code extensão permite desenvolver suas funções usando o TypeScript. As
ferramentas principais são um requisito da extensão de Azure Functions.
Para criar um aplicativo de função TypeScript no Visual Studio Code, escolha TypeScript como seu idioma ao criar
um aplicativo de funções.
Quando você pressiona F5 para executar o aplicativo localmente, o transpilação é feito antes que o host (Func. exe)
seja inicializado.
Quando você implanta seu aplicativo de funções no Azure usando o botão implantar no aplicativo de funções...
, a extensão Azure Functions primeiro gera uma compilação pronta para produção de arquivos JavaScript dos
arquivos de origem do TypeScript.
Azure Functions Core Tools
Há várias maneiras pelas quais um projeto TypeScript difere de um projeto JavaScript ao usar as ferramentas
principais.
Criar projeto
Para criar um projeto de aplicativo de função TypeScript usando ferramentas básicas, você deve especificar a opção
de linguagem TypeScript ao criar seu aplicativo de funções. Você pode fazer isso de uma das seguintes maneiras:
Execute o comando func init , selecione node como sua pilha de idiomas e, em seguida, selecione
typescript .
npm install
npm start
Publicar no Azure
Antes de usar o comando func azure functionapp publish para implantar no Azure, você cria uma compilação de
arquivos JavaScript pronta para produção a partir dos arquivos de origem do TypeScript.
Os comandos a seguir preparam e publicam seu projeto TypeScript usando ferramentas básicas:
Ao escrever Azure Functions em JavaScript, você deve escrever código usando as palavras-chave async e await .
Escrever código usando async e await em vez de retornos de chamada ou .then e .catch com promessas
ajuda a evitar dois problemas comuns:
Lançar exceções não capturadas que falham no processo node. js, potencialmente afetando a execução de outras
funções.
Comportamento inesperado, como logs ausentes de Context. log, causados por chamadas assíncronas que não
estão aguardando corretamente.
No exemplo a seguir, o método assíncrono fs.readFile é invocado com uma função de retorno de chamada de
erro-primeiro como seu segundo parâmetro. Esse código causa os dois problemas mencionados acima. Uma
exceção que não é detectada explicitamente no escopo correto falha em todo o processo (problema #1). Chamar
context.done() fora do escopo da função de retorno de chamada significa que a invocação de função pode
terminar antes da leitura do arquivo (problema #2). Neste exemplo, a chamada a context.done() muito mais cedo
resulta em entradas de log ausentes começando com Data from file: .
Usar as palavras-chave async e await ajuda a evitar esses dois erros. Você deve usar a função utilitário node. js
util.promisify para ativar as funções de estilo de retorno de chamada de erro primeiro em funções awaitable.
No exemplo a seguir, todas as exceções não tratadas lançadas durante a execução da função falham apenas na
invocação individual que gerou uma exceção. A palavra-chave await significa que as etapas a seguir
readFileAsync executadas somente após a readFile ser concluída. Com async e await , você também não
precisa chamar o retorno de chamada do context.done() .
// Recommended pattern
const fs = require('fs');
const util = require('util');
const readFileAsync = util.promisify(fs.readFile);
Próximos passos
Para saber mais, consulte os recursos a seguir:
Práticas recomendadas para o Azure Functions
Referência do desenvolvedor do Azure Functions
Gatilhos e associações de Azure Functions
Guia do desenvolvedor de Java do Azure
Functions
01/11/2019 • 18 minutes to read • Edit Online
O tempo de execução do Azure Functions dá suporte a Java se 8 LTS (Zulu 8.31.0.2-JRE 8.0.181-
win_x64). Este guia contém informações sobre as complexidades de escrever Azure Functions com Java.
Como acontece com outras linguagens, um Aplicativo de funções pode ter uma ou mais funções. Uma
função Java é um método public , decorado com a @FunctionName de anotação. Esse método define a
entrada para uma função Java e deve ser exclusivo em um pacote específico. Uma Aplicativo de funções
escrita em Java pode ter várias classes com vários métodos públicos anotados com @FunctionName .
Este artigo pressupõe que você já tenha lido a Referência do desenvolvedor do Azure Functions. Você
também deve concluir o guia de início rápido do Functions para criar sua primeira função, usando Visual
Studio Code ou Maven.
Modelo de programação
Os conceitos de gatilhos e ligações são fundamentais para as Funções do Azure. Os gatilhos iniciam a
execução do seu código. As ligações fornecem uma maneira de transmitir dados e retornar dados de uma
função, sem precisar escrever código de acesso a dados personalizado.
mvn archetype:generate \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype
mvn archetype:generate \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-kotlin-archetype
O código-fonte desses arquétipos pode ser encontrado no repositório GitHub de arquétipos do Azure
Maven.
Estrutura de pastas
Aqui está a estrutura de pastas de um projeto Azure Functions Java:
FunctionsProject
| - src
| | - main
| | | - java
| | | | - FunctionApp
| | | | | - MyFirstFunction.java
| | | | | - MySecondFunction.java
| - target
| | - azure-functions
| | | - FunctionApp
| | | | - FunctionApp.jar
| | | | - host.json
| | | | - MyFirstFunction
| | | | | - function.json
| | | | - MySecondFunction
| | | | | - function.json
| | | | - bin
| | | | - lib
| - pom.xml
Gatilhos e anotações
As funções são invocadas por um gatilho, como uma solicitação HTTP, um temporizador ou uma
atualização para os dados. Sua função precisa processar esse gatilho e quaisquer outras entradas para
produzir uma ou mais saídas.
Use as anotações Java incluídas no pacote com.microsoft.azure.functions.annotation. * para ligar entradas
e saídas a seus métodos. Para obter mais informações, consulte os documentos de referência do Java.
IMPORTANT
Você deve configurar uma conta de armazenamento do Azure no seu local. Settings. JSON para executar o
armazenamento de BLOBs do Azure, o armazenamento de filas do Azure ou os gatilhos de armazenamento de
tabelas do Azure localmente.
Exemplo:
{
"scriptFile": "azure-functions-example.jar",
"entryPoint": "com.example.Function.echo",
"bindings": [
{
"type": "httpTrigger",
"name": "req",
"direction": "in",
"authLevel": "anonymous",
"methods": [ "post" ]
},
{
"type": "http",
"name": "$return",
"direction": "out"
}
]
}
Personalizar JVM
O Functions permite que você personalize a JVM (máquina virtual Java) usada para executar suas
funções Java. As seguintes opções de JVM são usadas por padrão:
-XX:+TieredCompilation
-XX:TieredStopAtLevel=1
-noverify
-Djava.net.preferIPv4Stack=true
-jar
Você pode fornecer argumentos adicionais em uma configuração de aplicativo chamada JAVA_OPTS . Você
pode adicionar configurações de aplicativo ao seu aplicativo de funções implantado no Azure no portal do
Azure ou no CLI do Azure.
Portal do Azure
No portal do Azure, use a guia Configurações do aplicativo para adicionar a configuração de JAVA_OPTS .
Azure CLI
Você pode usar o comando AZ functionapp config appSettings Set para definir JAVA_OPTS , como no
exemplo a seguir:
Este exemplo habilita o modo sem periféricos. Substitua <APP_NAME> pelo nome do seu aplicativo de
funções e <RESOURCE_GROUP> com o grupo de recursos.
WARNING
No plano de consumo, você deve adicionar a configuração de WEBSITE_USE_PLACEHOLDER com um valor de 0 .
Essa configuração aumenta as horas de início frio para funções Java.
Bibliotecas de terceiros
O Azure Functions oferece suporte ao uso de bibliotecas de terceiros. Por padrão, todas as dependências
especificadas em seu projeto pom.xml arquivo são automaticamente agrupadas durante a meta
mvn package . Para bibliotecas não especificadas como dependências no pom.xml arquivo, coloque-as em
um diretório lib no diretório-raiz da função. As dependências colocadas no diretório lib são
adicionadas ao carregador de classe do sistema em tempo de execução.
A dependência de com.microsoft.azure.functions:azure-functions-java-library é fornecida no classpath
por padrão e não precisa ser incluída no diretório lib . Além disso, o Azure-Functions-Java-Worker
adiciona dependências listadas aqui ao classpath.
@FunctionName("BlobTrigger")
@StorageAccount("AzureWebJobsStorage")
public void blobTrigger(
@BlobTrigger(name = "content", path = "myblob/{fileName}", dataType = "binary") byte[]
content,
@BindingName("fileName") String fileName,
final ExecutionContext context
) {
context.getLogger().info("Java Blob trigger function processed a blob.\n Name: " + fileName +
"\n Size: " + content.length + " Bytes");
}
Se você espera valores nulos, use Optional<T> .
Associações
As ligações de entrada e saída fornecem uma maneira declarativa de se conectar aos dados de dentro do
seu código. Uma função pode ter várias ligações de entrada e saída.
Exemplo de associação de entrada
package com.example;
import com.microsoft.azure.functions.annotation.*;
Para receber um lote de entradas, você pode associar a String[] , POJO[] , List<String> ou List<POJO> .
@FunctionName("ProcessIotMessages")
public void processIotMessages(
@EventHubTrigger(name = "message", eventHubName = "%AzureWebJobsEventHubPath%", connection =
"AzureWebJobsEventHubSender", cardinality = Cardinality.MANY) List<TestEventData> messages,
final ExecutionContext context)
{
context.getLogger().info("Java Event Hub trigger received messages. Batch size: " +
messages.size());
}
Essa função é acionada sempre que houver novos dados no hub de eventos configurado. Como o
cardinality é definido como MANY , a função recebe um lote de mensagens do hub de eventos.
EventData do hub de eventos é convertido em TestEventData para a execução da função.
package com.example;
import com.microsoft.azure.functions.annotation.*;
itemsOut.getValue().add(testData1);
itemsOut.getValue().add(testData2);
Você invoca essa função em um HttpRequest. Ele grava vários valores no armazenamento de fila.
HttpRequestMessage e HttpResponseMessage
Eles são definidos em azure-functions-java-library . Eles são tipos auxiliares para trabalhar com as
funções HttpTrigger.
Metadados
Poucos gatilhos enviam gatilhos de metadados juntamente com dados de entrada. Você pode usar a
anotação @BindingName para associar aos metadados do gatilho.
package com.example;
import java.util.Optional;
import com.microsoft.azure.functions.annotation.*;
@FunctionName("QueueTriggerMetadata")
public void QueueTriggerMetadata(
@QueueTrigger(name = "message", queueName = "test-input-java-metadata", connection =
"AzureWebJobsStorage") String message,@BindingName("Id") String metadataId,
@QueueOutput(name = "output", queueName = "test-output-java-metadata", connection =
"AzureWebJobsStorage") OutputBinding<TestData> output,
final ExecutionContext context
) {
context.getLogger().info("Java Queue trigger function processed a message: " + message + "
with metadaId:" + metadataId );
TestData testData = new TestData();
testData.id = metadataId;
output.setValue(testData);
}
NOTE
O nome fornecido na anotação precisa corresponder à propriedade de metadados.
Contexto de execução
ExecutionContext, definido na azure-functions-java-library , contém métodos auxiliares para se
comunicar com o tempo de execução do functions.
Agente
Use getLogger , definido em ExecutionContext , para gravar logs do código de função.
Exemplo:
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
Para transmitir a saída de log para seu aplicativo de funções usando o CLI do Azure, abra um novo
prompt de comando, bash ou sessão de terminal e digite o seguinte comando:
O comando AZ webapp log tail tem opções para filtrar a saída usando a opção --provider .
Para baixar os arquivos de log como um único arquivo ZIP usando o CLI do Azure, abra um novo prompt
de comando, bash ou sessão de terminal e digite o seguinte comando:
Você deve ter habilitado o log do sistema de arquivos na portal do Azure ou na CLI do Azure antes de
executar esse comando.
Variáveis de ambiente
Em funções, configurações do aplicativo, como conexão de serviço cadeias de caracteres, são expostas
como variáveis de ambiente durante a execução. Você pode acessar essas configurações usando,
System.getenv("AzureWebJobsStorage") .
Próximos passos
Para obter mais informações sobre o desenvolvimento em Java Azure Functions, consulte os seguintes
recursos:
Práticas recomendadas para o Azure Functions
Referência do desenvolvedor do Azure Functions
Gatilhos e associações de Azure Functions
Desenvolvimento local e depuração com Visual Studio Code, IntelliJe Eclipse
Azure Functions de Java de Depuração Remota com Visual Studio Code
Plug-in do Maven para Azure Functions
Simplifique a criação da função por meio do objetivo de azure-functions:add e prepare um diretório
de preparo para a implantação de arquivo zip.
Guia do desenvolvedor do Azure Functions
PowerShell
24/10/2019 • 37 minutes to read • Edit Online
Este artigo fornece detalhes sobre como você escreve Azure Functions usando o PowerShell.
NOTE
O PowerShell para o Azure Functions está atualmente em versão prévia. Para receber atualizações importantes, assine o
repositório Anúncios do Serviço de Aplicativo do Azure no GitHub.
Uma função do PowerShell do Azure (função) é representada como um script do PowerShell que é executado
quando disparado. Cada script de função tem um arquivo de function.json relacionado que define como a
função se comporta, como a forma como ela é disparada e seus parâmetros de entrada e saída. Para saber mais,
confira o artigo gatilhos e Associação.
Assim como outros tipos de funções, as funções de script do PowerShell assumem parâmetros que
correspondem aos nomes de todas as associações de entrada definidas no arquivo function.json . Um
parâmetro TriggerMetadata também é passado que contém informações adicionais sobre o gatilho que iniciou a
função.
Este artigo pressupõe que você já tenha lido o Azure Functions referência do desenvolvedor. Você também deve
ter concluído o guia de início rápido do Functions para o PowerShell para criar sua primeira função do
PowerShell.
Estrutura de pastas
A estrutura de pastas necessária para um projeto do PowerShell é semelhante ao seguinte. Esse padrão pode ser
alterado. Para obter mais informações, consulte a seção scriptfile abaixo.
PSFunctionApp
| - MyFirstFunction
| | - run.ps1
| | - function.json
| - MySecondFunction
| | - run.ps1
| | - function.json
| - Modules
| | - myFirstHelperModule
| | | - myFirstHelperModule.psd1
| | | - myFirstHelperModule.psm1
| | - mySecondHelperModule
| | | - mySecondHelperModule.psd1
| | | - mySecondHelperModule.psm1
| - local.settings.json
| - host.json
| - requirements.psd1
| - profile.ps1
| - extensions.csproj
| - bin
Na raiz do projeto, há um arquivo de host.json compartilhado que pode ser usado para configurar o aplicativo
de funções. Cada função tem uma pasta com seu próprio arquivo de código (. ps1) e arquivo de configuração de
associação ( function.json ). O nome do diretório pai do arquivo function. JSON é sempre o nome da sua
função.
Determinadas associações exigem a presença de um arquivo de extensions.csproj . As extensões de associação,
necessárias na versão 2. x do tempo de execução do functions, são definidas no arquivo extensions.csproj , com
os arquivos de biblioteca reais na pasta bin . Ao desenvolver localmente, você deve registrar extensões de
associação. Ao desenvolver funções no portal do Azure, esse registro é feito para você.
Em aplicativos de funções do PowerShell, você pode, opcionalmente, ter um profile.ps1 que é executado
quando um aplicativo de funções começa a ser executado (caso contrário, é conhecido como um início frio . Para
obter mais informações, consulte perfil do PowerShell.
# $TriggerMetadata is optional here. If you don't need it, you can safely remove it from the param block
param($MyFirstInputBinding, $MySecondInputBinding, $TriggerMetadata)
Parâmetro TriggerMetadata
O parâmetro TriggerMetadata é usado para fornecer informações adicionais sobre o gatilho. Os metadados
adicionais variam de associação à associação, mas todos contêm uma propriedade sys que contém os
seguintes dados:
$TriggerMetadata.sys
Cada tipo de gatilho tem um conjunto diferente de metadados. Por exemplo, o $TriggerMetadata para
QueueTrigger contém a InsertionTime , Id , DequeueCount , entre outras coisas. Para obter mais informações
sobre os metadados do gatilho de fila, acesse a documentação oficial para gatilhos de fila. Verifique a
documentação nos gatilhos com os quais você está trabalhando para ver o que acontece nos metadados do
gatilho.
Associações
No PowerShell, as associações são configuradas e definidas no function. JSON de uma função. As funções
interagem com associações de várias maneiras.
Lendo dados de gatilho e de entrada
As associações de entrada e gatilho são lidas como parâmetros passados para sua função. As associações de
entrada têm um direction definido como in em function. JSON. A propriedade name definida em
function.json é o nome do parâmetro, no bloco de param . Como o PowerShell usa parâmetros nomeados para
associação, a ordem dos parâmetros não importa. No entanto, é uma prática recomendada seguir a ordem das
associações definidas no function.json .
param($MyFirstInputBinding, $MySecondInputBinding)
param($MyFirstInputBinding, $MySecondInputBinding)
Você também pode passar um valor para uma ligação específica por meio do pipeline.
param($MyFirstInputBinding, $MySecondInputBinding)
Push-OutputBinding se comporta de maneira diferente com base no valor especificado para -Name :
Quando o nome especificado não puder ser resolvido para uma associação de saída válida, um erro será
gerado.
Quando a associação de saída aceita uma coleção de valores, você pode chamar Push-OutputBinding
repetidamente para enviar vários valores por push.
Quando a associação de saída aceita apenas um valor singleton, chamar Push-OutputBinding uma
segunda vez gera um erro.
sintaxe de Push-OutputBinding
Como a saída é para HTTP, que aceita apenas um valor singleton, um erro é gerado quando Push-OutputBinding
é chamado uma segunda vez.
Para saídas que aceitam apenas valores singleton, você pode usar o parâmetro -Clobber para substituir o valor
antigo em vez de tentar adicionar a uma coleção. O exemplo a seguir pressupõe que você já adicionou um valor.
Usando -Clobber , a resposta do exemplo a seguir substitui o valor existente para retornar um valor de "saída
#3":
A associação de saída para uma fila de armazenamento aceita vários valores de saída. Nesse caso, chamar o
exemplo a seguir após a primeira gravação na fila em uma lista com dois itens: "output #1" e "output #2".
Quando gravado na fila, a mensagem contém estes quatro valores: "saída #1", "saída #2", "saída #3" e "#4 de
saída".
Get-OutputBinding cmdlet
Você pode usar o cmdlet Get-OutputBinding para recuperar os valores definidos atualmente para suas
associações de saída. Esse cmdlet recupera uma tabela de hash que contém os nomes das associações de saída
com seus respectivos valores.
Veja a seguir um exemplo de como usar Get-OutputBinding para retornar os valores de associação atuais:
Get-OutputBinding
Name Value
---- -----
MyQueue myData
MyOtherQueue myData
Get-OutputBinding também contém um parâmetro chamado -Name , que pode ser usado para filtrar a
associação retornada, como no exemplo a seguir:
Name Value
---- -----
MyQueue myData
Registro em log
O registro em log nas funções do PowerShell funciona como log normal do PowerShell. Você pode usar os
cmdlets de log para gravar em cada fluxo de saída. Cada cmdlet é mapeado para um nível de log usado pelas
funções.
Erro Write-Error
Aviso Write-Warning
Depuração Write-Debug
NÍVEL DE LOG DE FUNÇÕES CMDLET DE REGISTRO EM LOG
Rastreamento Write-Progress
Write-Verbose
Além desses cmdlets, qualquer coisa gravada no pipeline é redirecionada para o nível de log Information e
exibido com a formatação padrão do PowerShell.
IMPORTANT
O uso dos cmdlets Write-Verbose ou Write-Debug não é suficiente para ver o log detalhado e de nível de depuração.
Você também deve configurar o limite de nível de log, que declara o nível de logs que você realmente importa. Para saber
mais, confira Configurar o nível de log do aplicativo de funções.
{
"logging": {
"logLevel": {
"Function.MyFunction": "Debug",
"default": "Trace"
}
}
}
{
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"authLevel": "anonymous"
},
{
"type": "http",
"direction": "out"
}
]
}
run.ps1
param($req, $TriggerMetadata)
$name = $req.Query.Name
param([string] $myBlob)
Perfil do PowerShell
No PowerShell, há o conceito de um perfil do PowerShell. Se você não estiver familiarizado com os perfis do
PowerShell, consulte about Profiles.
Em funções do PowerShell, o script de perfil é executado quando o aplicativo de funções é iniciado. Os
aplicativos de funções começam quando são implantados pela primeira vez e depois ficam ociosos (inicialização
a frio).
Quando você cria um aplicativo de funções usando ferramentas, como Visual Studio Code e Azure Functions
Core Tools, um profile.ps1 padrão é criado para você. O perfil padrão é mantido no repositório GitHub das
ferramentas principais e contém:
Autenticação automática de MSI para o Azure.
A capacidade de ativar o Azure PowerShell AzureRM aliases do PowerShell, se desejar.
Versão do PowerShell
A tabela a seguir mostra a versão do PowerShell usada por cada versão principal do tempo de execução do
Functions:
2. x PowerShell Core 6
Gerenciamento de dependência
O Functions permite aproveitar a Galeria do PowerShell para gerenciar dependências. Com o gerenciamento de
dependência habilitado, o arquivo Requirements. psd1 é usado para baixar automaticamente os módulos
necessários. Você habilita esse comportamento definindo a propriedade managedDependency como true na raiz
do arquivo host. JSON, como no exemplo a seguir:
{
"managedDependency": {
"enabled": true
}
}
Quando você cria um novo projeto de funções do PowerShell, o gerenciamento de dependência é habilitado por
padrão, com o módulo de Az do Azure incluído. O número máximo de módulos com suporte no momento é
10. A sintaxe com suporte é MajorNumber .* ou versão exata do módulo, conforme mostrado nos seguintes
requisitos. psd1 exemplo:
@{
Az = '1.*'
SqlServer = '21.1.18147'
}
Quando você atualiza o arquivo Requirements. psd1, os módulos atualizados são instalados após uma
reinicialização.
NOTE
As dependências gerenciadas exigem acesso ao www.powershellgallery.com para baixar módulos. Ao executar localmente,
verifique se o tempo de execução pode acessar essa URL adicionando as regras de firewall necessárias.
As configurações de aplicativo a seguir podem ser usadas para alterar a forma como as dependências
gerenciadas são baixadas e instaladas. A atualização do aplicativo é iniciada no MDMaxBackgroundUpgradePeriod e o
processo de atualização é concluído em aproximadamente o MDNewSnapshotCheckPeriod .
Aproveitar seus próprios módulos personalizados é um pouco diferente de como você faria normalmente.
No computador local, o módulo é instalado em uma das pastas disponíveis globalmente em seu
$env:PSModulePath . Ao executar no Azure, você não tem acesso aos módulos instalados em seu computador. Isso
significa que o $env:PSModulePath para um aplicativo de funções do PowerShell difere de $env:PSModulePath em
um script do PowerShell regular.
No functions, PSModulePath contém dois caminhos:
Uma pasta Modules que existe na raiz do seu aplicativo de funções.
Um caminho para uma pasta de Modules que é controlada pelo operador de linguagem do PowerShell.
Pasta de Modules no nível do aplicativo de funções
Para usar módulos personalizados, você pode posicionar os módulos nos quais suas funções dependem de uma
pasta Modules . Nessa pasta, os módulos ficam automaticamente disponíveis para o tempo de execução do
functions. Qualquer função no aplicativo de funções pode usar esses módulos.
NOTE
Os módulos especificados no arquivo Requirements. psd1 são baixados e incluídos automaticamente no caminho para que
você não precise incluí-los na pasta modules. Eles são armazenados localmente na pasta
$env:LOCALAPPDATA/AzureFunctions e na pasta /data/ManagedDependencies quando executados na nuvem.
Para aproveitar o recurso de módulo personalizado, crie uma pasta Modules na raiz do seu aplicativo de funções.
Copie os módulos que você deseja usar em suas funções para esse local.
mkdir ./Modules
Copy-Item -Path /mymodules/mycustommodule -Destination ./Modules -Recurse
Com uma pasta Modules , seu aplicativo de funções deve ter a seguinte estrutura de pastas:
PSFunctionApp
| - MyFunction
| | - run.ps1
| | - function.json
| - Modules
| | - MyCustomModule
| | - MyOtherCustomModule
| | - MySpecialModule.psm1
| - local.settings.json
| - host.json
| - requirements.psd1
Quando você inicia seu aplicativo de funções, o operador de linguagem do PowerShell adiciona essa pasta
Modules ao $env:PSModulePath para que você possa contar com o carregamento automático de módulo,
exatamente como faria em um script do PowerShell regular.
Pasta Modules nível de trabalho de idioma
Vários módulos são geralmente usados pelo operador de linguagem do PowerShell. Esses módulos são
definidos na última posição de PSModulePath .
A lista atual de módulos é a seguinte:
Microsoft. PowerShell. Archive: módulo usado para trabalhar com arquivos mortos, como .zip , .nupkg e
outros.
ThreadJob: uma implementação baseada em thread das APIs de trabalho do PowerShell.
Por padrão, o Functions usa a versão mais recente desses módulos. Para usar uma versão de módulo específica,
coloque essa versão específica na pasta Modules do seu aplicativo de funções.
Variáveis de ambiente
Em funções, as configurações de aplicativo, como cadeias de conexão de serviço, são expostas como variáveis de
ambiente durante a execução. Você pode acessar essas configurações usando $env:NAME_OF_ENV_VAR , conforme
mostrado no exemplo a seguir:
param($myTimer)
Simultaneidade
Por padrão, o tempo de execução do PowerShell do Functions só pode processar uma invocação de uma função
por vez. No entanto, esse nível de simultaneidade pode não ser suficiente nas seguintes situações:
Quando você está tentando lidar com um grande número de invocações ao mesmo tempo.
Quando você tem funções que invocam outras funções dentro do mesmo aplicativo de funções.
Você pode alterar esse comportamento definindo a seguinte variável de ambiente como um valor inteiro:
PSWorkerInProcConcurrencyUpperBound
Você define essa variável de ambiente nas configurações de aplicativo de seu aplicativo de funções.
Considerações sobre o uso de simultaneidade
O PowerShell é uma linguagem de script de thread único por padrão. No entanto, a simultaneidade pode ser
adicionada usando vários espaços de uso do PowerShell no mesmo processo. A quantidade de Runspaces
criados corresponderá à configuração do aplicativo PSWorkerInProcConcurrencyUpperBound. A taxa de
transferência será afetada pela quantidade de CPU e memória disponíveis no plano selecionado.
Azure PowerShell usa alguns contextos de nível de processo e um estado para ajudá-lo a evitar a digitação de
excesso de tipos. No entanto, se você ativar a simultaneidade em seu aplicativo de funções e invocar ações que
alteram o estado, poderá acabar com condições de corrida. Essas condições de corrida são difíceis de depurar
porque uma invocação depende de um determinado Estado e a outra invocação alterou o estado.
Há um grande valor em simultaneidade com Azure PowerShell, já que algumas operações podem levar um
tempo considerável. No entanto, você deve continuar com cautela. Se você suspeitar de que está enfrentando
uma condição de corrida, defina a configuração de aplicativo PSWorkerInProcConcurrencyUpperBound como
1 e, em vez disso, use o isolamento de nível de processo de trabalho de linguagem para simultaneidade.
FunctionApp
| - host.json
| - myFunction
| | - function.json
| - lib
| | - PSFunction.ps1
Nesse caso, o function.json para myFunction inclui uma propriedade scriptFile referenciando o arquivo com
a função exportada a ser executada.
{
"scriptFile": "../lib/PSFunction.ps1",
"bindings": [
// ...
]
}
FunctionApp
| - host.json
| - myFunction
| | - function.json
| - lib
| | - PSFunction.psm1
function Invoke-PSTestFunc {
param($InputBinding, $TriggerMetadata)
Neste exemplo, a configuração de myFunction inclui uma propriedade scriptFile que faz referência a
PSFunction.psm1 , que é um módulo do PowerShell em outra pasta. A propriedade entryPoint faz referência à
função Invoke-PSTestFunc , que é o ponto de entrada no módulo.
{
"scriptFile": "../lib/PSFunction.psm1",
"entryPoint": "Invoke-PSTestFunc",
"bindings": [
// ...
]
}
O script é executado em cada invocação. Evite usar Install-Module em seu script. Em vez disso, use
Save-Module antes da publicação para que sua função não precise perder tempo baixando o módulo. Se a frio
for iniciada, afetando suas funções, considere implantar seu aplicativo de funções em um plano do serviço de
aplicativo definido como Always on ou em um plano Premium.
Próximos passos
Para obter mais informações, consulte os seguintes recursos:
Práticas recomendadas para o Azure Functions
Referência do desenvolvedor do Azure Functions
Gatilhos e associações de Azure Functions
Guia do desenvolvedor de Python para o Azure
Functions
08/11/2019 • 21 minutes to read • Edit Online
Este artigo é uma introdução ao desenvolvimento do Azure Functions usando Python. O conteúdo
abaixo pressupõe que você já tenha lido o Guia de desenvolvedores do Azure Functions.
Para projetos de exemplo de função autônoma no Python, consulte os exemplos de funções do Python.
Modelo de programação
Azure Functions espera que uma função seja um método sem estado em seu script Python que
processa a entrada e produz a saída. Por padrão, o tempo de execução espera que o método seja
implementado como um método global chamado main() no arquivo __init__.py . Você também pode
especificar um ponto de entrada alternativo.
Os dados de gatilhos e associações são associados à função por meio de atributos de método usando a
propriedade name definida no arquivo Function. JSON . Por exemplo, a Function. JSON abaixo
descreve uma função simples disparada por uma solicitação HTTP chamada req :
{
"bindings": [
{
"name": "req",
"direction": "in",
"type": "httpTrigger",
"authLevel": "anonymous"
},
{
"name": "$return",
"direction": "out",
"type": "http"
}
]
}
def main(req):
user = req.params.get('user')
return f'Hello, {user}!'
Você também pode declarar explicitamente os tipos de atributo e o tipo de retorno na função usando
anotações do tipo Python. Isso ajuda você a usar o IntelliSense e os recursos de preenchimento
automático fornecidos por muitos editores de código Python.
import azure.functions
{
"scriptFile": "main.py",
"entryPoint": "customentry",
"bindings": [
...
]
}
Estrutura de pastas
A estrutura de pastas para um projeto de funções do Python é semelhante ao exemplo a seguir:
FunctionApp
| - MyFirstFunction
| | - __init__.py
| | - function.json
| | - example.py
| - MySecondFunction
| | - __init__.py
| | - function.json
| - SharedCode
| | - myFirstHelperFunction.py
| | - mySecondHelperFunction.py
| - host.json
| - requirements.txt
Há um arquivo host.json compartilhado que pode ser usado para configurar o aplicativo de funções.
Cada função possui seu próprio arquivo de código e arquivo de configuração de associação
(function.json).
O código compartilhado deve ser mantido em uma pasta separada. Para fazer referência a módulos na
pasta SharedCode, você pode usar a seguinte sintaxe:
Para fazer referência a módulos locais para uma função, você pode usar a sintaxe de importação
relativa da seguinte maneira:
Ao implantar um projeto de função em seu aplicativo de funções no Azure, todo o conteúdo da pasta
FunctionApp deve ser incluído no pacote, mas não na própria pasta.
Gatilhos e entradas
As entradas são divididas em duas categorias no Azure Functions: entrada do gatilho e entrada
adicional. Embora sejam diferentes no arquivo function.json , o uso é idêntico no código Python.
Cadeias de conexão ou segredos para fontes de entrada e gatilho são mapeados para valores no
arquivo local.settings.json ao serem executados localmente e as configurações do aplicativo durante
a execução no Azure.
Por exemplo, o código a seguir demonstra a diferença entre os dois:
// function.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "req",
"direction": "in",
"type": "httpTrigger",
"authLevel": "anonymous",
"route": "items/{id}"
},
{
"name": "obj",
"direction": "in",
"type": "blob",
"path": "samples/{id}",
"connection": "AzureWebJobsStorage"
}
]
}
// local.settings.json
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "python",
"AzureWebJobsStorage": "<azure-storage-connection-string>"
}
}
# __init__.py
import azure.functions as func
import logging
Quando a função é invocada, a solicitação HTTP é transmitida para a função como req . Uma entrada
será recuperada do armazenamento de BLOBs do Azure com base na ID na URL de rota e
disponibilizada como obj no corpo da função. Aqui, a conta de armazenamento especificada é a cadeia
de conexão encontrada em, que é a mesma conta de armazenamento usada pelo aplicativo de funções.
outputs
A saída pode ser expressa em parâmetros de saída e em valores retornados. Se houver apenas uma
saída, recomendamos usar o valor retornado. Para múltiplas saídas, você precisará usar parâmetros de
saída.
Para usar o valor retornado de uma função como o valor de uma associação de saída, a propriedade
name da associação deve ser definida como $return em function.json .
Para produzir várias saídas, use o método set() fornecido pela interface azure.functions.Out para
atribuir um valor à associação. Por exemplo, a função a seguir pode enviar uma mensagem para uma
fila e também retornar uma resposta HTTP.
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "req",
"direction": "in",
"type": "httpTrigger",
"authLevel": "anonymous"
},
{
"name": "msg",
"direction": "out",
"type": "queue",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
},
{
"name": "$return",
"direction": "out",
"type": "http"
}
]
}
message = req.params.get('body')
msg.set(message)
return message
Registro em log
O acesso ao agente de tempo de execução do Azure Functions está disponível por meio de um
manipulador logging raiz no seu aplicativo de funções. Esse agente é vinculado ao Application Insights
e permite sinalizar avisos e erros encontrados durante a execução da função.
O exemplo a seguir registra uma mensagem de informações quando a função é invocada por meio de
um gatilho HTTP.
import logging
def main(req):
logging.info('Python HTTP trigger function processed a request.')
Há outros métodos de registro em log disponíveis que permitem a gravação no console em níveis de
rastreamento diferentes:
MÉTODO DESCRIÇÃO
Para saber mais sobre registro em log, consulte monitorar Azure Functions.
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')
if name:
return func.HttpResponse(f"Hello {name}!", headers=headers)
else:
return func.HttpResponse(
"Please pass a name on the query string or in the request body",
headers=headers, status_code=400
)
Nessa função, o valor do parâmetro de consulta name é obtido do parâmetro params do objeto
HttpRequest . O corpo da mensagem codificada em JSON é lido usando o método get_json .
Da mesma forma, você pode definir o status_code e headers para a mensagem de resposta no objeto
HttpResponse retornado.
Simultaneidade
Por padrão, as funções de tempo de execução do Python só podem processar uma invocação de uma
função por vez. Esse nível de simultaneidade pode não ser suficiente em uma ou mais das seguintes
condições:
Você está tentando lidar com várias invocações sendo feitas ao mesmo tempo.
Você está processando um grande número de eventos de e/s.
Seu aplicativo está associado à e/s.
Nessas situações, você pode melhorar o desempenho executando de forma assíncrona e usando vários
processos de trabalho de linguagem.
Assíncrono
Recomendamos que você use a instrução async def para fazer com que sua função seja executada
como uma corrotina assíncrona.
def main():
some_blocking_socket_io()
Contexto
Para obter o contexto de invocação de uma função durante a execução, inclua o argumento context
em sua assinatura.
Por exemplo:
import azure.functions
Variáveis globais
Não há garantia de que o estado do seu aplicativo será preservado para execuções futuras. No entanto,
o tempo de execução de Azure Functions geralmente reutiliza o mesmo processo para várias execuções
do mesmo aplicativo. Para armazenar em cache os resultados de uma computação cara, declare-o
como uma variável global.
CACHED_DATA = None
def main(req):
global CACHED_DATA
if CACHED_DATA is None:
CACHED_DATA = load_json()
Variáveis de ambiente
Em funções, as configurações de aplicativo, como cadeias de conexão de serviço, são expostas como
variáveis de ambiente durante a execução. Você pode acessar essas configurações declarando
import os e, em seguida, usando, setting = os.environ["setting-name"] .
import logging
import os
import azure.functions as func
Para o desenvolvimento local, as configurações do aplicativo são mantidas no arquivo local. Settings.
JSON.
Por exemplo, o arquivo de requisitos e comando pip a seguir podem ser usados para instalar o pacote
requests do PyPI.
requests==2.19.1
Se você quiser criar seu aplicativo localmente, em vez de no Azure, Instale o Docker no computador
local e execute o comando a seguir para publicar usando o Azure Functions Core Tools (Func). Lembre-
se de substituir <app name> pelo nome do aplicativo de funções no Azure.
Nos bastidores, o Core Tools usará Docker para executar a imagem mcr.microsoft.com/azure-
functions/python como um contêiner em seu computador local. Usando esse ambiente, ele criará e
instalará os módulos necessários da distribuição de origem, antes de compactá-los para implantação
final no Azure.
Para criar suas dependências e publicar usando um sistema de entrega contínua (CD ), use Azure
pipelines.
Testes de unidade
As funções escritas em Python podem ser testadas como outros códigos Python usando estruturas de
teste padrão. Para a maioria das associações, é possível criar um objeto de entrada fictício criando uma
instância de uma classe apropriada do pacote azure.functions . Como o pacote de azure.functions
não está disponível imediatamente, certifique-se de instalá-lo por meio do arquivo requirements.txt ,
conforme descrito na seção versão e gerenciamento de pacotes do Python acima.
Por exemplo, a seguir está um teste fictício de uma função disparada por HTTP:
{
"scriptFile": "httpfunc.py",
"entryPoint": "my_function",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
# myapp/httpfunc.py
import azure.functions as func
import logging
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')
if name:
return func.HttpResponse(f"Hello {name}")
else:
return func.HttpResponse(
"Please pass a name on the query string or in the request body",
status_code=400
)
# myapp/test_httpfunc.py
import unittest
class TestFunction(unittest.TestCase):
def test_my_function(self):
# Construct a mock HTTP request.
req = func.HttpRequest(
method='GET',
body=None,
url='/api/HttpTrigger',
params={'name': 'Test'})
Aqui está outro exemplo, com uma função disparada por fila:
# myapp/__init__.py
import azure.functions as func
# myapp/test_func.py
import unittest
class TestFunction(unittest.TestCase):
def test_my_function(self):
# Construct a mock Queue message.
req = func.QueueMessage(
body=b'test')
Arquivos temporários
O método tempfile.gettempdir() retorna uma pasta temporária, que no Linux é /tmp . Seu aplicativo
pode usar esse diretório para armazenar arquivos temporários gerados e usados por suas funções
durante a execução.
IMPORTANT
Os arquivos gravados no diretório temporário não têm garantia de persistir entre invocações. Durante o scale
out, os arquivos temporários não são compartilhados entre instâncias.
import logging
import azure.functions as func
import tempfile
from os import listdir
#---
tempFilePath = tempfile.gettempdir()
fp = tempfile.NamedTemporaryFile()
fp.write(b'Hello world!')
filesDirListInTemp = listdir(tempFilePath)
Certifique-se de também atualizar seu function. JSON para dar suporte ao método HTTP OPTIONS:
...
"methods": [
"get",
"post",
"options"
]
...
Esse método é usado pelo navegador Chrome para negociar a lista de origens permitidas.
Próximas etapas
Para saber mais, consulte os recursos a seguir:
Documentação da API do pacote Azure Functions
Práticas recomendadas para o Azure Functions
Gatilhos e de associações do Azure Functions
Associações do armazenamento de blobs
Associações HTTP e webhook
Associações de Armazenamento de Filas
Gatilho de temporizador
Guia do desenvolvedor de JavaScript do
Azure Functions
25/05/2018 • 40 minutes to read • Edit Online
Este guia contém informações sobre as complexidades de escrever Azure Functions com
JavaScript.
Uma função JavaScript é um function exportado que é executado quando acionado ( acionadores
são configurados em function.json). O primeiro argumento passado para cada função é um objeto
context , que é usado para receber e enviar dados de associação, registro em log e comunicação
com o tempo de execução.
Este artigo pressupõe que você já tenha lido a Referência do desenvolvedor do Azure Functions.
Conclua o início rápido do Functions para criar sua primeira função, usando Visual Studio Code ou
no portal.
Este artigo também dá suporte ao desenvolvimento de aplicativos TypeScript.
Estrutura de pastas
A estrutura de pastas necessárias para um projeto JavaScript é semelhante à seguinte. Este padrão
pode ser alterado. Para mais informações, consulte a seção scriptArquivo abaixo.
FunctionsProject
| - MyFirstFunction
| | - index.js
| | - function.json
| - MySecondFunction
| | - index.js
| | - function.json
| - SharedCode
| | - myFirstHelperFunction.js
| | - mySecondHelperFunction.js
| - node_modules
| - host.json
| - package.json
| - extensions.csproj
Na raiz do projeto, há um arquivo host.json compartilhado que pode ser usado para configurar o
aplicativo de funções. Cada função tem uma pasta com seu próprio arquivo de código (.js) e o
arquivo de configuração de associação (function.json). O nome do diretório pai de function.json é
sempre o nome da sua função.
As extensões de associação necessárias na versão 2.x do tempo de execução do Functions são
definidas no arquivo extensions.csproj , com os arquivos de biblioteca reais na pasta bin . Ao
desenvolver localmente, você precisa registrar as extensões de associação. Ao desenvolver funções
no portal do Azure, esse registro é feito para você.
Ao exportar uma função assíncrona, você também pode configurar uma ligação de saída para
obter o valor return . Isso é recomendado se você tiver apenas uma associação de saída.
Para atribuir uma saída usando return , altere o name propriedade a ser $return em
function.json .
{
"type": "http",
"direction": "out",
"name": "$return"
}
Associações
Em JavaScript, ligações são configuradas e definidas na função function.json. As funções interagem
com as ligações de várias maneiras.
Entradas
As entradas são divididas em duas categorias no Azure Functions: uma é a entrada de gatilho e a
outra é a entrada adicional. Trigger e outras ligações de entrada (ligações de direction === "in" )
podem ser lidas por uma função de três maneiras:
[Recomendado] Como parâmetros passados para sua função. Eles são passados para a
função na mesma ordem em que são definidos function.json. A propriedade name definida
em Function. JSON não precisa corresponder ao nome do parâmetro, embora deva ser.
outputs
As saídas (ligações de direction === "out" ) podem ser gravadas por uma função de várias
maneiras. Em todos os casos, a propriedade name da ligação, conforme definido em function.json,
corresponde ao nome do membro do objeto gravado na sua função.
Você pode atribuir dados a associações de saída de uma das seguintes maneiras (não Combine
esses métodos):
[Recomendado para várias saídas] Retornando um objeto. Se você estiver usando uma
função de retorno de Async/Promise, poderá retornar um objeto com os dados de saída
atribuídos. No exemplo abaixo, as ligações de saída são nomeadas "httpResponse" e
"queueOutput" em function.json.
module.exports = async function(context) {
let retMsg = 'Hello, world!';
return {
httpResponse: {
body: retMsg
},
queueOutput: retMsg
};
};
Se você estiver usando uma função síncrona, você pode retornar este objeto usando
context.done (veja o exemplo).
{
"type": "httpTrigger",
"name": "req",
"direction": "in",
"dataType": "binary"
}
objeto de contexto
O tempo de execução usa um objeto context para passar dados de/para sua função e permitir
que você se comunique com o tempo de execução. O objeto de contexto pode ser usado para ler e
definir os dados de associações, gravar logs e usando o context.done retorno de chamada quando
a função exportada é síncrona.
O context objeto é sempre o primeiro parâmetro para uma função. Deve ser incluído porque tem
métodos importantes, como context.done e context.log . Você pode nomear o objeto de acordo
com a sua preferência (por exemplo, ctx ou c ).
// You must include a context, but other arguments are optional
module.exports = function(ctx) {
// function logic goes here :)
ctx.done();
};
Propriedade context.bindings
context.bindings
Retorna um objeto nomeado que é usado para ler ou atribuir dados de associação. Dados de
associação de entrada e gatilho podem ser acessados pela leitura de propriedades em
context.bindings . Os dados de associação de saída podem ser atribuídos adicionando dados a
context.bindings
Por exemplo, as seguintes definições de ligação em sua função.json permitem acessar o conteúdo
de uma fila de context.bindings.myInput e atribuir saídas a uma fila usando
context.bindings.myOutput .
{
"type":"queue",
"direction":"in",
"name":"myInput"
...
},
{
"type":"queue",
"direction":"out",
"name":"myOutput"
...
}
// myInput contains the input data, which may have properties such as "name"
var author = context.bindings.myInput.name;
// Similarly, you can set your output data
context.bindings.myOutput = {
some_text: 'hello world',
a_number: 1 };
Você pode optar por definir os dados de ligação de saída usando o método context.done em vez
do objeto context.binding (veja abaixo).
Propriedade context.bindingData
context.bindingData
Retorna um objeto nomeado que contém dados de invocação de função e os metadados do gatilho
( invocationId , sys.methodName , sys.utcNow , sys.randGuid ). Para obter um exemplo de metadados
de gatilho, confira este exemplo de hubs de eventos.
Método context.done
context.done([err],[propertyBag])
Permite que o runtime saiba que seu código foi concluído. Quando sua função usa a declaração
async function , você não precisa usar context.done() . O context.done retorno de chamada é
chamado implicitamente. As funções assíncronas estão disponíveis no Nó 8 ou em uma versão
posterior, que requer a versão 2.x do runtime de Funções.
Se a função não é uma função assíncrona, você precisa chamar context.done para informar ao
tempo de execução que a função está concluída. Os tempos de execução se está ausente.
O método context.done permite que você retorne um erro definido pelo usuário ao tempo de
execução e um objeto JSON que contém dados de associação de saída. As propriedades
transmitidas para context.done sobrescrevem qualquer coisa definida no objeto context.bindings .
Método context.log
context.log(message)
Permite que você grave em logs de função de streaming no nível de rastreamento padrão. No
context.log , há métodos de registro adicionais disponíveis para permitir que você grave logs de
função em outros níveis de rastreamento:
MÉTODO DESCRIÇÃO
Você pode configurar o limite do nível de rastreamento para registro em log no arquivo host.json.
Para obter mais informações sobre como gravar logs, confira Gravando saídas de rastreamento
abaixo.
Leia Monitorado o Azure Functions para saber mais sobre como exibir e consultar logs de função.
context.log({hello: 'world'});
context.log.info({hello: 'world'});
Como erro é o nível de rastreamento mais alto, esse rastreamento é gravado na saída em todos os
níveis de rastreamento enquanto o registro em log estiver habilitado.
Todos os métodos context.log dão suporte ao mesmo formato de parâmetro que o método
util.format de Node.js. Considere o código a seguir, que grava logs de função usando o nível de
rastreamento padrão:
{
"tracing": {
"consoleLevel": "verbose"
}
}
Os valores de consoleLevel correspondem aos nomes dos métodos context.log . Para desabilitar
todo o registro em log do rastreamento no console, defina consoleLevel como off. Para obter
mais informações, consulte a referência para host.json.
PROPRIEDADE DESCRIÇÃO
Objeto de resposta
O objeto context.res (resposta) tem as seguintes propriedades:
PROPRIEDADE DESCRIÇÃO
{
"type": "http",
"direction": "out",
"name": "response"
}
{
"type": "http",
"direction": "out",
"name": "$return"
}
Versão do nó
A tabela a seguir mostra a versão do Node.js usada por cada versão principal do runtime do
Functions:
Veja versão atual que o tempo de execução está usando verificando a configuração de aplicativo
acima ou imprimindo process.version de qualquer função.
Gerenciamento de dependências
Para usar as bibliotecas da comunidade no código JavaScript, como é mostrado no exemplo
abaixo, você precisa garantir que todas as dependências sejam instaladas no aplicativo de funções
no Azure.
module.exports = function(context) {
// Using our imported underscore.js library
var matched_names = _
.where(context.bindings.myInput.names, {first: 'Carla'});
NOTE
Você deve definir um arquivo package.json na raiz do seu aplicativo de função. A definição de arquivo
permite que todas as funções no aplicativo compartilhem os mesmos pacotes armazenados em cache, o
que oferece o melhor desempenho. Se houver conflitos de versão, você poderá resolver o conflito
adicionando um arquivo package.json na pasta de uma função específica.
Variáveis de ambiente
Em funções, configurações do aplicativo, como conexão de serviço cadeias de caracteres, são
expostas como variáveis de ambiente durante a execução. Você pode acessar essas configurações
usando process.env , conforme mostrado aqui na segunda e terceira chamadas para
context.log() em que registramos as variáveis de ambiente AzureWebJobsStorage e
WEBSITE_SITE_NAME :
module.exports = async function (context, myTimer) {
var timeStamp = new Date().toISOString();
Por padrão, uma função JavaScript é executada do index.js , um arquivo que compartilha o
mesmo diretório pai que seu function.json correspondente.
scriptFile pode ser usado para obter uma estrutura de pastas semelhante ao exemplo a seguir:
FunctionApp
| - host.json
| - myNodeFunction
| | - function.json
| - lib
| | - sayHello.js
| - node_modules
| | - ... packages ...
| - package.json
O function.json da myNodeFunction deve incluir uma propriedade scriptFile que aponte para o
arquivo com a função exportada a ser executada.
{
"scriptFile": "../lib/sayHello.js",
"bindings": [
...
]
}
Usando o entryPoint
No scriptFile (ou index.js ), uma função precisa ser exportada usando module.exports para ser
localizada e executada. Por padrão, a função que é executada quando disparada é a única
exportação desse arquivo, a exportação denominada run ou a exportação denominada index .
Isso pode ser configurado usando entryPoint em function.json , como no exemplo a seguir:
{
"entryPoint": "logFoo",
"bindings": [
...
]
}
No Functions v2.x, que suporta o parâmetro this nas funções do usuário, o código da função
poderia ser como no seguinte exemplo:
class MyObj {
constructor() {
this.foo = 1;
};
logFoo(context) {
context.log("Foo is " + this.foo);
context.done();
}
}
Neste exemplo, é importante observar que, embora um objeto esteja sendo exportado, não há
nenhuma garantia para preservar o estado entre as execuções.
Depuração local
Quando iniciado com o parâmetro --inspect , um processo node. js escuta um cliente de
depuração na porta especificada. No Azure Functions 2. x, você pode especificar argumentos para
passar para o processo node. js que executa seu código adicionando a variável de ambiente ou
configuração de aplicativo languageWorkers:node:arguments = <args> .
Para depurar localmente, adicione "languageWorkers:node:arguments": "--inspect=5858" em Values
no arquivo local. Settings. JSON e anexe um depurador à porta 5858.
Ao depurar usando VS Code, o parâmetro --inspect é adicionado automaticamente usando o
valor port no arquivo launch. JSON do projeto.
Na versão 1. x, a configuração languageWorkers:node:arguments não funcionará. A porta de
depuração pode ser selecionada com o parâmetro --nodeDebugPort no Azure Functions Core
Tools.
TypeScript
Quando você visa a versão 2. x do tempo de execução do functions, ambos Azure Functions para
Visual Studio Code e o Azure Functions Core Tools permitem criar aplicativos de funções usando
um modelo que ofereça suporte a projetos de aplicativo de função TypeScript. O modelo gera
package.json e tsconfig.json arquivos de projeto que facilitam a transcompile, a execução e a
publicação de funções JavaScript a partir do código TypeScript com essas ferramentas.
Um arquivo de .funcignore gerado é usado para indicar quais arquivos são excluídos quando um
projeto é publicado no Azure.
Os arquivos TypeScript (. TS ) são transcompilados em arquivos JavaScript (. js) no diretório de
saída dist . Os modelos do TypeScript usam o parâmetro scriptFile no function.json para
indicar o local do arquivo. js correspondente na pasta dist . O local de saída é definido pelo
modelo usando outDir parâmetro no arquivo de tsconfig.json . Se você alterar essa
configuração ou o nome da pasta, o tempo de execução não será capaz de localizar o código a ser
executado.
NOTE
O suporte experimental para TypeScript existe na versão 1. x do tempo de execução do functions. A versão
experimental compila os arquivos TypeScript em arquivos JavaScript quando a função é invocada. Na
versão 2. x, esse suporte experimental foi substituído pelo método controlado por ferramentas que faz
transpilação antes do host ser inicializado e durante o processo de implantação.
npm install
npm start
Publicar no Azure
Antes de usar o comando func azure functionapp publish para implantar no Azure, você cria uma
compilação de arquivos JavaScript pronta para produção a partir dos arquivos de origem do
TypeScript.
Os comandos a seguir preparam e publicam seu projeto TypeScript usando ferramentas básicas:
Ao escrever Azure Functions em JavaScript, você deve escrever código usando as palavras-chave
async e await . Escrever código usando async e await em vez de retornos de chamada ou
.then e .catch com promessas ajuda a evitar dois problemas comuns:
Lançar exceções não capturadas que falham no processo node. js, potencialmente afetando a
execução de outras funções.
Comportamento inesperado, como logs ausentes de Context. log, causados por chamadas
assíncronas que não estão aguardando corretamente.
No exemplo a seguir, o método assíncrono fs.readFile é invocado com uma função de retorno de
chamada de erro-primeiro como seu segundo parâmetro. Esse código causa os dois problemas
mencionados acima. Uma exceção que não é detectada explicitamente no escopo correto falha em
todo o processo (problema #1). Chamar context.done() fora do escopo da função de retorno de
chamada significa que a invocação de função pode terminar antes da leitura do arquivo (problema
#2). Neste exemplo, a chamada a context.done() muito mais cedo resulta em entradas de log
ausentes começando com Data from file: .
Usar as palavras-chave async e await ajuda a evitar esses dois erros. Você deve usar a função
utilitário node. js util.promisify para ativar as funções de estilo de retorno de chamada de erro
primeiro em funções awaitable.
No exemplo a seguir, todas as exceções não tratadas lançadas durante a execução da função falham
apenas na invocação individual que gerou uma exceção. A palavra-chave await significa que as
etapas a seguir readFileAsync executadas somente após a readFile ser concluída. Com async e
await , você também não precisa chamar o retorno de chamada do context.done() .
// Recommended pattern
const fs = require('fs');
const util = require('util');
const readFileAsync = util.promisify(fs.readFile);
Próximos passos
Para saber mais, consulte os recursos a seguir:
Práticas recomendadas para o Azure Functions
Referência do desenvolvedor do Azure Functions
Gatilhos e associações de Azure Functions
Visão geral do diagnóstico de Azure Functions
07/11/2019 • 5 minutes to read • Edit Online
Quando você estiver executando um aplicativo de funções, você deseja estar preparado para quaisquer problemas
que possam surgir, de erros de 4xx para disparar falhas. O diagnóstico de Azure Functions é uma experiência
inteligente e interativa para ajudá-lo a solucionar problemas do seu aplicativo de funções sem nenhuma
configuração ou custo adicional. Quando você tiver problemas com seu aplicativo de funções, o diagnóstico de
Azure Functions indicará o que há de errado para orientá-lo sobre as informações corretas para solucionar
problemas e resolver o problema com mais facilidade e rapidez. Este artigo mostra as noções básicas de como usar
o diagnóstico de Azure Functions para diagnosticar e resolver mais rapidamente problemas comuns do aplicativo
de funções.
Depois de selecionar um bloco, você poderá ver uma lista de tópicos relacionados ao problema descrito no bloco.
Esses tópicos fornecem trechos de informações notáveis do relatório completo. Você pode selecionar qualquer um
desses tópicos para investigar ainda mais os problemas. Além disso, você pode selecionar Exibir relatório
completo para explorar todos os tópicos em uma única página.
Próximas etapas
Você pode fazer perguntas ou fornecer comentários sobre o diagnóstico de Azure Functions no UserVoice. Inclua
[Diag] no título de seus comentários.
Atualmente, há três tipos de planos de hospedagem para um aplicativo executado no Azure Functions, com cada
plano com seu próprio modelo de preços:
PLANO DESCRIÇÃO
Você escolheu o plano que melhor dá suporte aos requisitos de desempenho e custo de sua função. Para saber
mais, confira Escala e hospedagem do Azure Functions.
Este artigo lida apenas com o plano de consumo, pois esse plano resulta em custos variáveis.
Durable Functions também pode ser executado em um plano de consumo. Para saber mais sobre as
considerações de custo ao usar Durable Functions, consulte Durable Functions cobrança.
Largura de banda da rede Você não paga pela transferência de dados entre os serviços
do Azure na mesma região. No entanto, você pode incorrer
em custos para transferências de dados de saída para outra
região ou fora do Azure. Para saber mais, consulte detalhes de
preços de largura de banda.
2. À esquerda, selecione métricas > Selecione um recursoe, em seguida, use as configurações abaixo da
imagem para escolher seu aplicativo de funções.
Grupo de recursos Seu grupo de recursos O grupo de recursos que contém seu
aplicativo de funções.
3. Selecione aplicar para escolher o aplicativo de funções como o recurso a ser monitorado.
4. Em métrica, escolha contagem de execução de função e soma para agregação. Isso adiciona a soma
das contagens de execução durante o período escolhido ao gráfico.
5. Selecione Adicionar métrica e repita as etapas 2-4 para adicionar unidades de execução de função ao
gráfico.
O gráfico resultante contém os totais para ambas as métricas de execução no intervalo de tempo escolhido, que
nesse caso é de duas horas.
Como o número de unidades de execução é muito maior do que a contagem de execução, o gráfico apenas
mostra as unidades de execução.
Este gráfico mostra um total de 1.110.000.000 Function Execution Units consumidos em um período de duas
horas, medido em MB -milissegundos. Para converter em GB -segundos, divida por 1024000. Neste exemplo, o
aplicativo de funções consumiu 1110000000 / 1024000 = 1083.98 GB -segundos. Você pode usar esse valor e
multiplicar pelo preço atual do tempo de execução napágina de preçosda [página de preços do Functions], que
oferece o custo dessas duas horas, supondo que você já tenha usado qualquer concessão gratuita de tempo de
execução.
CLI do Azure
O CLI do Azure tem comandos para recuperar métricas. Você pode usar a CLI de um ambiente de comando local
ou diretamente do portal usando Azure cloud Shell. Por exemplo, o seguinte comando AZ monitor de lista de
métricas retorna dados por hora no mesmo período de tempo usado antes.
Certifique-se de substituir <AZURE_SUBSCRIPTON_ID> pela sua ID de assinatura do Azure que executa o comando.
{
"cost": 0.0,
"interval": "1:00:00",
"namespace": "Microsoft.Web/sites",
"resourceregion": "centralus",
"timespan": "2019-09-11T21:46:00Z/2019-09-11T23:18:00Z",
"value": [
{
"id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX/resourceGroups/metrics-testing-
consumption/providers/Microsoft.Web/sites/metrics-testing-
consumption/providers/Microsoft.Insights/metrics/FunctionExecutionUnits",
"name": {
"localizedValue": "Function Execution Units",
"value": "FunctionExecutionUnits"
},
"resourceGroup": "metrics-testing-consumption",
"timeseries": [
{
"data": [
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T21:46:00+00:00",
"total": 793294592.0
},
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T22:46:00+00:00",
"total": 316576256.0
}
],
"metadatavalues": []
}
],
],
"type": "Microsoft.Insights/metrics",
"unit": "Count"
},
{
"id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX/resourceGroups/metrics-testing-
consumption/providers/Microsoft.Web/sites/metrics-testing-
consumption/providers/Microsoft.Insights/metrics/FunctionExecutionCount",
"name": {
"localizedValue": "Function Execution Count",
"value": "FunctionExecutionCount"
},
"resourceGroup": "metrics-testing-consumption",
"timeseries": [
{
"data": [
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T21:46:00+00:00",
"total": 33538.0
},
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T22:46:00+00:00",
"total": 13040.0
}
],
"metadatavalues": []
}
],
"type": "Microsoft.Insights/metrics",
"unit": "Count"
}
]
}
Essa resposta específica mostra que de 2019-09-11T21:46 a 2019-09-11T23:18 , durante o qual o aplicativo
consumiu 1110000000 MB -milissegundos (1083,98 GB -segundos).
performanceCounters
| where name == "Private Bytes"
| project timestamp, name, value
customMetrics
| where name contains "Duration"
| extend averageDuration = valueSum / valueCount
| summarize averageDurationMilliseconds=avg(averageDuration) by name
NAME AVERAGEDURATIONMILLISECONDS
Próximas etapas
Saiba mais sobre como monitorar aplicativos de funções
Melhore o desempenho e a confiabilidade do Azure
Functions
07/11/2019 • 12 minutes to read • Edit Online
Este artigo fornece orientações para melhorar o desempenho e confiabilidade de seus aplicativos de funções
sem servidor.
Próximas etapas
Para saber mais, consulte os recursos a seguir:
Como gerenciar conexões no Azure Functions
Práticas recomendadas do Serviço de Aplicativo do Azure
Trabalhe com Proxies do Azure Functions
08/11/2019 • 19 minutes to read • Edit Online
Este artigo explica como configurar e trabalhar com proxies do Azure Functions. Com esse recurso, você pode
especificar os pontos de extremidade em seu aplicativo de funções que são implementados por outro recurso.
Você pode usar esses proxies para dividir uma API grande em vários aplicativos de função (como uma arquitetura
de microsserviços), enquanto ainda apresenta uma única superfície de API para clientes.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
NOTE
A cobrança do Standard Functions se aplica para execuções de proxy. Para saber mais, confira Preços do Azure Functions.
Criar um proxy
Esta seção mostra como criar um proxy no portal do Functions.
1. Abra o Portal do Azure e navegue até seu aplicativo de funções.
2. No painel esquerdo, selecione Novo proxy.
3. Forneça um nome para seu proxy.
4. Configurar o ponto de extremidade exposto no aplicativo de função especificando o modelo de rota e
Métodos HTTP. Esses parâmetros se comportam de acordo com as regras de gatilhos HTTP.
5. Defina a URL de back-end para outro ponto de extremidade. Esse ponto de extremidade pode ser uma função
em outro aplicativo de funções, ou pode ser qualquer outra API. O valor não precisa ser estático e pode fazer
referência as configurações do aplicativo e os parâmetros da solicitação original do cliente.
6. Clique em Criar.
Seu proxy agora existe como um novo ponto de extremidade em seu aplicativo de funções. Da perspectiva do
cliente, é equivalente a um HttpTrigger no Azure Functions. Você pode testar seu novo proxy copiando a URL do
Proxy e testá-lo com seu cliente HTTP favorito.
Usar variáveis
A configuração de um proxy não precisa ser estática. Você pode condicioná-la para usar variáveis da solicitação do
cliente original, da resposta de back-end ou das configurações do aplicativo.
Funções de local de referência
Você pode usar localhost para fazer referência a uma função diretamente dentro do mesmo aplicativo de função,
sem uma solicitação de proxy de ida e volta.
"backendurl": "https://localhost/api/httptriggerC#1" fará referência a uma função disparada do HTTP local na
rota /api/httptriggerC#1
NOTE
Se sua função usar os níveis de autorização função, administrador ou sys, você precisará fornecer o código e o clientId, de
acordo com a URL da função original. Nesse caso, a referência ficaria assim:
"backendurl": "https://localhost/api/httptriggerC#1?code=<keyvalue>&clientId=<keyname>" É recomendável
armazenar essas chaves nas configurações do aplicativo e fazer referência a elas em seus proxies. Isso evita o
armazenamento de segredos em seu código-fonte.
TIP
Usar configurações do aplicativo para hosts de back-end quando você tem várias implantações ou ambientes de teste.
Dessa forma, você pode garantir que está sempre se comunicando com o back-end correto para aquele ambiente.
Configuração avançada
Os proxies que você configura são armazenados em um arquivo proxies.json, que está localizado na raiz de um
diretório de aplicativo de função. Você pode editar esse arquivo manualmente e implantá-lo como parte do seu
aplicativo ao usar qualquer um dos métodos de implantação que ofereça suporte a funções.
TIP
Se você não configurou um dos métodos de implantação, também poderá trabalhar com o arquivo proxies.json no portal.
Vá até o aplicativo de funções e selecione Recursos da plataforma e,depois, selecione Editor do Serviço de Aplicativo.
Isso permitirá que você veja toda a estrutura de arquivo do aplicativo de funções e faça alterações.
Proxies.json é definido por um objeto de proxies, composto de proxies nomeados e suas definições.
Opcionalmente, você pode referenciar um esquema JSON para o preenchimento do código, caso seu editor dê
suporte a isso. Um arquivo de exemplo pode parecer com o seguinte:
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"proxy1": {
"matchCondition": {
"methods": [ "GET" ],
"route": "/api/{test}"
},
"backendUri": "https://<AnotherApp>.azurewebsites.net/api/<FunctionName>"
}
}
}
Cada proxy tem um nome amigável, como proxy1, no exemplo acima. O objeto de definição de proxy
correspondente é definido pelas seguintes propriedades:
matchCondition: Obrigatório – um objeto que define as solicitações que disparam a execução desse proxy.
Ele contém duas propriedades compartilhadas com Gatilhos HTTP:
methods: Uma matriz dos métodos HTTP aos quais o proxy responde. Se não for especificado, o proxy
responderá a todos os métodos HTTP na rota.
route: Obrigatório – define o modelo da rota, controlando para quais URLs de solicitação seu proxy
responde. Ao contrário de disparadores HTTP, não há nenhum valor padrão.
backendUri: A URL do recurso de back-end ao qual a solicitação deve ser transmitida por proxy. Esse valor
pode referenciar as configurações do aplicativo e os parâmetros da solicitação original do cliente. Se esta
propriedade não for incluída, o Azure Functions responderá com um HTTP 200 OK.
requestOverrides: Um objeto que define as transformações para a solicitação de back-end. Confira Definir
um objeto requestOverrides.
responseOverrides: Um objeto que define as transformações para a resposta do cliente. Confira Definir um
objeto responseOverrides.
NOTE
A propriedade de rota dos proxies de funções do Azure não honra a propriedade routePrefix da configuração de host do
Aplicativo de funções. Se você quiser incluir um prefixo, como /api , ele deve ser incluído na propriedade de rota.
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"Root": {
"disabled":true,
"matchCondition": {
"route": "/example"
},
"backendUri": "https://<AnotherApp>.azurewebsites.net/api/<FunctionName>"
}
}
}
Configurações de aplicativo
O comportamento do proxy pode ser controlado por várias configurações de aplicativo. Todas elas são descritas
na referência de Configurações do Aplicativo de Funções
AZURE_FUNCTION_PROXY_DISABLE_LOCAL_CALL
AZURE_FUNCTION_PROXY_BACKEND_URL_DECODE_SLASHES
Caracteres reservados (formatação de cadeia de caracteres)
Os proxies leem todas as cadeias de caracteres de um arquivo JSON, usando \ como símbolo de escape. Os
proxies também interpretam chaves. Veja a seguir um conjunto completo de exemplos.
\ \\ example.com\\text.html -->
example.com\text.html
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"proxy1": {
"matchCondition": {
"methods": [ "GET" ],
"route": "/api/{test}"
},
"backendUri": "https://<AnotherApp>.azurewebsites.net/api/<FunctionName>",
"requestOverrides": {
"backend.request.headers.Accept": "application/xml",
"backend.request.headers.x-functions-key": "%ANOTHERAPP_API_KEY%"
}
}
}
}
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"proxy1": {
"matchCondition": {
"methods": [ "GET" ],
"route": "/api/{test}"
},
"responseOverrides": {
"response.body": "Hello, {test}",
"response.headers.Content-Type": "text/plain"
}
}
}
}
NOTE
Neste exemplo, o corpo da resposta é definido diretamente e, portanto, nenhuma propriedade backendUri é necessária. O
exemplo mostra como você pode usar os Proxies do Azure Functions para simular APIs.
Opções de rede Azure Functions
07/11/2019 • 17 minutes to read • Edit Online
Este artigo descreve os recursos de rede disponíveis nas opções de hospedagem para Azure Functions. Todas as
seguintes opções de rede oferecem a você uma capacidade de acessar recursos sem usar endereços roteáveis pela
Internet ou para restringir o acesso à Internet a um aplicativo de funções.
Os modelos de hospedagem têm níveis diferentes de isolamento de rede disponíveis. Escolher a correta ajudará
você a atender aos seus requisitos de isolamento de rede.
Você pode hospedar aplicativos de funções de duas maneiras:
Há um conjunto de opções de plano que são executadas em uma infraestrutura multilocatário, com vários
níveis de conectividade de rede virtual e opções de dimensionamento:
O plano de consumo, que é dimensionado dinamicamente em resposta à carga e oferece opções de
isolamento de rede mínimas.
O plano Premium, que também é dimensionado dinamicamente, ao mesmo tempo que oferece
isolamento de rede mais abrangente.
O plano do serviço de aplicativodo Azure, que opera em uma escala fixa e oferece isolamento de rede
semelhante ao plano Premium.
Você pode executar funções em um ambiente do serviço de aplicativo. Esse método implanta sua função em
sua rede virtual e oferece controle e isolamento de rede total.
Restrições de IP de entrada
Você pode usar restrições de IP para definir uma lista ordenada de prioridade de endereços IP que têm acesso
permitido ou negado ao seu aplicativo. A lista pode incluir endereços IPv4 e IPv6. Quando há uma ou mais
entradas, um "negar tudo" implícito existe no final da lista. As restrições de IP funcionam com todas as opções de
Hospedagem de função.
NOTE
Com as restrições de rede em vigor, você pode usar o editor do portal somente de dentro de sua rede virtual ou quando
você colocou o endereço IP do computador que está usando para acessar o portal do Azure na lista de destinatários
seguros. No entanto, você ainda pode acessar quaisquer recursos na guia recursos da plataforma de qualquer
computador.
Para saber mais, consulte Azure app restrições de acesso estático do serviço.
Deseja alcançar um endereço RFC 1918 (10.0.0.0/8, Integração de rede virtual regional
172.16.0.0/12, 192.168.0.0/16) na mesma região
Deseja acessar recursos em uma rede virtual clássica ou em Integração de rede virtual do gateway necessária
uma rede virtual em outra região
Deseja alcançar os pontos de extremidade RFC 1918 no Azure Integração de rede virtual regional
ExpressRoute
Deseja acessar recursos entre pontos de extremidade de Integração de rede virtual regional
serviço
Nenhum recurso permite que você alcance endereços não RFC 1918 no ExpressRoute. Para fazer isso, no
momento, você precisa usar um Ambiente do Serviço de Aplicativo.
O uso da integração de rede virtual regional não conecta sua rede virtual a pontos de extremidade locais ou
configura pontos de extremidade de serviço. Essa é uma configuração de rede separada. A integração de rede
virtual regional apenas permite que seu aplicativo faça chamadas entre esses tipos de conexão.
Independentemente da versão usada, a integração de rede virtual dá ao seu aplicativo de funções acesso aos
recursos em sua rede virtual, mas não concede acesso de site privado ao seu aplicativo de funções da rede virtual.
Acesso ao site privado significa tornar seu aplicativo acessível somente de uma rede privada como uma rede
virtual do Azure. a integração de rede virtual é apenas para fazer chamadas de saída de seu aplicativo para sua
rede virtual.
O recurso de integração de rede virtual:
Requer um plano do serviço de aplicativo Standard, Premium ou PremiumV2
dá suporte a TCP e UDP
Funciona com aplicativos do serviço de aplicativo e aplicativos de funções
Há algumas coisas para as quais a integração de rede virtual não dá suporte, incluindo:
A montagem de uma unidade
Integração do Active Directory
Output
A integração de rede virtual no Azure Functions usa a infraestrutura compartilhada com aplicativos Web do
serviço de aplicativo. Para saber mais sobre os dois tipos de integração de rede virtual, consulte:
Integração de rede virtual regional
Integração de rede virtual do gateway necessária
Para saber mais sobre como usar a integração de rede virtual, consulte integrar um aplicativo de funções a uma
rede virtual do Azure.
Conexões Híbridas
Conexões híbridas é um recurso da retransmissão do Azure que você pode usar para acessar recursos do
aplicativo em outras redes. Ele fornece acesso de seu aplicativo para um ponto de extremidade do aplicativo. Você
não pode usá-lo para acessar seu aplicativo. Conexões Híbridas está disponível para funções em execução em
todos, exceto no plano de consumo.
Conforme usado em Azure Functions, cada conexão híbrida se correlaciona com uma única combinação de host e
porta de TCP. Isso significa que o ponto de extremidade da conexão híbrida pode estar em qualquer sistema
operacional e qualquer aplicativo, desde que você esteja acessando uma porta de escuta TCP. O recurso Conexões
Híbridas não conhece ou se preocupa com o que é o protocolo de aplicativo ou o que você está acessando. Ele
apenas fornece acesso à rede.
Para saber mais, confira a documentação do serviço de aplicativo para conexões híbridas. Essas mesmas etapas de
configuração oferecem suporte a Azure Functions.
Restrições de IP de saída
As restrições de IP de saída estão disponíveis somente para funções implantadas em um Ambiente do Serviço de
Aplicativo. Você pode configurar as restrições de saída para a rede virtual em que sua Ambiente do Serviço de
Aplicativo está implantada.
Quando você integra um aplicativo de funções em um plano Premium ou um plano do serviço de aplicativo com
uma rede virtual, o aplicativo ainda pode fazer chamadas de saída para a Internet.
Próximas etapas
Para saber mais sobre rede e Azure Functions:
Siga o tutorial sobre como começar com a integração de rede virtual
Leia as perguntas frequentes sobre rede de funções
Saiba mais sobre a integração de rede virtual com o serviço de aplicativo/funções
Saiba mais sobre as redes virtuais no Azure
Habilitar mais recursos de rede e controle com ambientes de serviço de aplicativo
Conectar-se a recursos locais individuais sem alterações de firewall usando Conexões Híbridas
Endereços IP no Azure
05/11/2019 • 9 minutes to read • Edit Online
az webapp show --resource-group <group_name> --name <app_name> --query outboundIpAddresses --output tsv
az webapp show --resource-group <group_name> --name <app_name> --query possibleOutboundIpAddresses --output tsv
NOTE
Quando um aplicativo de função que é executado no Plano de consumo é dimensionado, um novo intervalo de endereços IP
de saída pode ser atribuído. Quando executado no plano de consumo, talvez seja necessário colocar na lista de permissões
todo o data center.
{
"name": "AzureCloud.westeurope",
"id": "AzureCloud.westeurope",
"properties": {
"changeNumber": 9,
"region": "westeurope",
"platform": "Azure",
"systemService": "",
"addressPrefixes": [
"13.69.0.0/17",
"13.73.128.0/18",
... Some IP addresses not shown here
"213.199.180.192/27",
"213.199.183.0/24"
]
}
}
Para obter informações sobre quando este arquivo é atualizado e quando os endereços IP são alterados, expanda a
seção Detalhes da página do Centro de Download.
Restrições de endereço IP
Você pode configurar uma lista de endereços IP que você deseja permitir ou negar acesso a um aplicativo de
função. Para obter mais informações, consulte Restrições de IP estático do Serviço de Aplicativo do Azure.
Endereços IP dedicados
Se você precisar de endereços IP dedicados e estáticos, recomendamos Ambientes do Serviço de Aplicativo (o
Nível isolado dos planos do Serviço de Aplicativo). Para obter mais informações, consulte Endereços IP do
Ambiente de Serviço de Aplicativo e Como controlar o tráfego de entrada para um Ambiente de Serviço de
Aplicativo.
Para descobrir se seu aplicativo de função é executado em um Ambiente de Serviço de Aplicativo:
1. Entre no Portal do Azure.
2. Navegue até o aplicativo de função.
3. Selecione o guia Visão geral.
4. A camada do plano de Serviço de Aplicativo aparece em Plano de serviço de aplicativo / camada de preço.
A camada de preços do Ambiente de Serviço de Aplicativo é Isolado.
Como alternativa, você pode usar o Cloud Shell:
az webapp show --resource-group <group_name> --name <app_name> --query sku --output tsv
Próximas etapas
Uma causa comum de alterações de IP é a função de escala de aplicativos. Saiba mais sobre o dimensionamento
do aplicativo de função.
Azure Functions em kubernetes com KEDA
26/10/2019 • 6 minutes to read • Edit Online
O tempo de execução de Azure Functions fornece flexibilidade na Hospedagem de onde e como você deseja. Os
pares de Keda (dimensionamento automático controlado por eventos baseados em kubernetes) diretamente com
o tempo de execução Azure Functions e ferramentas para fornecer escala controlada por evento em kubernetes.
Para criar uma imagem e implantar suas funções no kubernetes, execute o seguinte comando:
NOTE
As ferramentas principais aproveitarão a CLI do Docker para criar e publicar a imagem. Certifique-se de que o Docker já
esteja instalado e conectado à sua conta com docker login .
Isso cria um recurso de Deployment kubernetes, um recurso de ScaledObject e Secrets , que inclui as variáveis de
ambiente importadas de seu arquivo de local.settings.json .
Implantando um aplicativo de funções de um registro particular
O fluxo acima funciona para registros privados também. Se você estiver extraindo a imagem de contêiner de um
registro privado, inclua o sinalizador --pull-secret que faz referência ao segredo kubernetes que contém as
credenciais de registro particular ao executar func kubernetes deploy .
Próximas etapas
Para saber mais, consulte os recursos a seguir:
Criar uma função usando uma imagem personalizada
Codificar e testar o Azure Functions localmente
Como funciona o plano de consumo da função do Azure
Guia do desenvolvedor do Azure Functions
25/05/2018 • 12 minutes to read • Edit Online
Código de função
Uma função é o principal conceito no Azure Functions. Uma função contém duas partes importantes:
seu código, que pode estar escrito em várias linguagens e ter alguma configuração, e o arquivo
function.json. Para linguagens compiladas, o arquivo de configuração é gerado automaticamente com
base nas anotações no código. Para linguagens de script, você deve fornecer seu próprio arquivo de
configuração.
O arquivo function.json define o gatilho, as associações e outras definições de configuração da função.
Cada função tem apenas um gatilho. O tempo de execução usa o arquivo de configuração para
determinar os eventos a serem monitorados, bem como para passar e retornar dados de uma execução
da função. Veja a seguir um arquivo function.json de exemplo.
{
"disabled":false,
"bindings":[
// ... bindings here
{
"type": "bindingType",
"direction": "in",
"name": "myParamName",
// ... more depending on binding
}
]
}
Para obter mais informações, consulte Gatilhos e conceitos de associações do Azure Functions.
A propriedade bindings é onde você configura gatilhos e associações. Cada binding compartilha
algumas configurações comuns e outras que são específicas para um determinado tipo de binding.
Todas as associações exigem as seguintes configurações:
Aplicativo de função
O aplicativo de funções fornece um contexto de execução no Azure no qual suas funções são
executadas. Como tal, é a unidade de implantação e gerenciamento para suas funções. Um aplicativo de
funções é composto por uma ou mais funções individuais que são gerenciadas, implantadas e
dimensionadas em conjunto. Todas as funções em um aplicativo de funções compartilham o mesmo
plano de preços, método de implantação e versão de tempo de execução. Pense em um aplicativo de
funções como uma forma de organizar e gerenciar coletivamente suas funções. Para saber mais,
consulte como gerenciar um aplicativo de funções.
NOTE
Todas as funções em um aplicativo de funções devem ser criadas na mesma linguagem. Em versões anteriores do
Azure Functions Runtime, isso não era obrigatório.
Estrutura de pastas
O código para todas as funções em um aplicativo de funções específico está localizado em uma pasta do
projeto raiz que contém um arquivo de configuração do host e uma ou mais subpastas. Cada subpasta
contém o código para uma função distinta. A estrutura de pastas é mostrada no seguinte representação:
FunctionApp
| - host.json
| - Myfirstfunction
| | - function.json
| | - ...
| - mysecondfunction
| | - function.json
| | - ...
| - SharedCode
| - bin
Na versão 2.x do tempo de execução de funções, todas as funções no aplicativo de funções devem
compartilhar a mesma pilha de linguagem.
O host. JSON arquivo contém configurações específicas de tempo de execução e está na pasta raiz do
aplicativo de funções. Um bin pasta contém pacotes e outros arquivos de biblioteca que requer que o
aplicativo de funções. Consulte os requisitos específicos a um idioma para um projeto de aplicativo de
função:
Biblioteca de classes C# (.csproj)
Script do C# (.csx)
Script em F#
Java
JavaScript
A estrutura de pastas acima é a estrutura padrão (e recomendada) de um aplicativo de funções. Se você
quiser alterar o local do arquivo do código de uma função, modifique a seção scriptFile do arquivo
function.json. Também recomendamos usar a implantação de pacote para implantar seu projeto em seu
aplicativo de funções no Azure. Você também pode usar ferramentas existentes, como integração
contínua e implantação e Azure DevOps.
NOTE
Ao implantar um pacote manualmente, implante seu arquivo host.json e pastas da função diretamente na pasta
wwwroot . Não inclua a pasta wwwroot nas implantações. Caso contrário, você acabará com pastas
wwwroot\wwwroot .
Execução paralela
Quando vários eventos de gatilho ocorrem mais rápido do que um tempo de execução single-threaded
de função pode processar, o tempo de execução pode invocar a função várias vezes em paralelo. Se um
aplicativo de funções estiver usando o Plano de hospedagem de consumo, ele poderá escalar
horizontalmente de maneira automática. Cada instância do aplicativo de funções, quer seja executada no
Plano de hospedagem de consumo, quer em um Plano de hospedagem do Serviço de Aplicativo
comum, pode processar invocações de função simultâneas em paralelo usando vários threads. O
número máximo de invocações de função simultâneas em cada instância do aplicativo de funções varia
com base no tipo de gatilho que está sendo usado, bem como nos recursos usados por outras funções
no aplicativo de funções.
Repositórios
O código para o Azure Functions é software livre e é armazenado em repositórios do GitHub:
Funções do Azure
Host do Azure Functions
Portal do Azure Functions
Modelos do Azure Functions
SDK WebJobs do Azure
Extensões do SDK WebJobs do Azure
Associações
Veja uma tabela de todas as associações com suporte.
Esta tabela mostra as associações com suporte nas duas versões principais do tempo de execução de
Azure Functions:
Armazenament ✔ ✔ ✔ ✔ ✔
o de Blobs
BD Cosmos ✔ ✔ ✔ ✔ ✔
Grade de ✔ ✔ ✔
eventos
Hubs de ✔ ✔ ✔ ✔
Eventos
WebHooks de ✔ ✔ ✔ ✔
& de HTTP
Hub IoT ✔ ✔ ✔ ✔
Microsoft ✔ ✔ ✔
Graph
Excel tabelas
Arquivos de ✔ ✔ ✔
OneDrive
Microsoft
Graph
Microsoft ✔ ✔
Graph
Outlook email
Microsoft ✔ ✔ ✔ ✔
Graph
events
Tokens de ✔ ✔
Auth Microsoft
Graph
Aplicativos ✔ ✔ ✔
Móveis
Hubs de ✔ ✔
Notificação
Armazenament ✔ ✔ ✔ ✔
o de filas
SendGrid ✔ ✔ ✔
TIPO 1.X 2. X OF ENTRADA SAÍDA
Barramento de ✔ ✔ ✔ ✔
Serviço
SignalR ✔ ✔ ✔
Armazenament ✔ ✔ ✔ ✔
o de tabelas
Timer ✔ ✔ ✔
Twilio ✔ ✔ ✔
1 no tempo de execução da versão 2. x, todas as associações, exceto http e Timer, devemser registradas.
Consulte registrar extensões de associação. Todas as associações 2. x com suporte também têm suporte
na versão 3. x, salvo indicação em contrário.
Está tendo problemas com erros provenientes de associações? Examine a documentação de códigos de
erro de associação do Azure Functions.
Problemas de relatórios
ITEM DESCRIÇÃO LINK
Próximas etapas
Para obter mais informações, consulte os seguintes recursos:
Gatilhos e associações de Azure Functions
Codificar e testar o Azure Functions localmente
Práticas recomendadas para o Azure Functions
Referência do desenvolvedor de C# do Azure Functions
Referência do desenvolvedor de NodeJS do Azure Functions
Codificar e testar o Azure Functions localmente
24/10/2019 • 5 minutes to read • Edit Online
Enquanto você é capaz de desenvolver e testar o Azure Functions no Portal do Azure, muitos
desenvolvedores preferem uma experiência de desenvolvimento local. O Functions facilita a utilização do seu
editor de códigos favorito e das ferramentas de desenvolvimento para criar e testar as funções em seu
computador local. Suas funções locais podem se conectar a serviços do Azure em tempo real e você pode
depurá-las em seu computador local usando o tempo de execução total do Functions.
Visual Studio Code C# (biblioteca de classes), script (. A extensão do Azure Functions para
CSX), JavaScript C#, PowerShell, VS Code adiciona suporte ao
Python Functions para o VS Code. Requer as
Ferramentas Essenciais. Oferece
suporte ao desenvolvimento em
Linux, MacOS e Windows ao usar a
versão 2.x das Ferramentas Essenciais.
Para saber mais, confira Criar sua
primeira função usando o Visual
Studio Code.
IMPORTANT
Não combine o desenvolvimento local com o desenvolvimento do portal no mesmo aplicativo de funções. Ao criar e
publicar funções de um projeto local, não tente manter ou modificar o código do projeto no portal.
Cada um desses ambientes de desenvolvimento local permite criar projetos de aplicativo de funções e usar
modelos predefinidos do Functions para criar novas funções. Cada um usa as Ferramentas Essenciais para
que você possa testar e depurar suas funções com relação ao tempo de execução do Functions em seu
próprio computador, assim como faria com qualquer outro aplicativo. Você também pode publicar seu projeto
de aplicativo de funções de qualquer um desses ambientes para o Azure.
Próximas etapas
Para saber mais sobre o desenvolvimento local de C# funções compiladas usando o visual Studio 2019,
consulte desenvolver Azure Functions usando o Visual Studio.
Para saber mais sobre o desenvolvimento local de funções usando o VS Code em um computador Mac,
Linux ou Windows, consulte implantar Azure Functions de vs Code.
Para saber mais sobre como desenvolver funções do prompt de comando ou do terminal, consulte
Trabalhar com as Ferramentas Essenciais do Azure Functions.
Desenvolva Azure Functions usando Visual Studio
Code
07/11/2019 • 53 minutes to read • Edit Online
A extensão Azure Functions para Visual Studio Code permite que você desenvolva localmente funções e as
implante no Azure. Se esta for sua primeira experiência com o Azure Functions, você pode aprender mais em
Uma introdução ao Azure Functions.
A extensão Azure Functions fornece estes benefícios:
Editar, criar e executar funções em seu computador de desenvolvimento local.
Publicar seu projeto do Azure Functions diretamente no Azure.
Escreva suas funções em várias linguagens, aproveitando os benefícios de Visual Studio Code.
A extensão pode ser usada com os seguintes idiomas, que têm suporte do tempo de execução do Azure Functions
versão 2. x:
C#Compile
C#prescritiva*
JavaScript
Java
PowerShell
Python
* Requer que você defina C# script como seu idioma de projeto padrão.
Neste artigo, os exemplos estão disponíveis atualmente apenas para as funções JavaScript (Node. js C# ) e
biblioteca de classes.
Este artigo fornece detalhes sobre como usar a extensão Azure Functions para desenvolver funções e publicá-las
no Azure. Antes de ler este artigo, você deve criar sua primeira função usando Visual Studio Code.
IMPORTANT
Não combine desenvolvimento local e desenvolvimento de portal para um único aplicativo de funções. Ao publicar a partir
de um projeto local para um aplicativo de funções, o processo de implantação substitui quaisquer funções que você
desenvolveu o portal.
Pré-requisitos
Antes de instalar e executar a extensão de Azure Functions de extensão de Azure Functions, você deve atender a
esses requisitos:
Visual Studio Code instalado em uma das plataformas com suporte.
Uma assinatura ativa do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Outros recursos de que você precisa, como uma conta de armazenamento do Azure, são criados em sua
assinatura quando você publica usando Visual Studio Code.
IMPORTANT
Você pode desenvolver funções localmente e publicá-las no Azure sem precisar iniciá-las e executá-las localmente. Para
executar suas funções localmente, você precisará atender a alguns requisitos adicionais, incluindo um download automático
de Azure Functions Core Tools. Para saber mais, confira requisitos adicionais para executar um projeto localmente.
3. Reinicie o Visual Studio Code e selecione o ícone do Azure na barra Atividade. Você deve ver uma área do
Azure Functions na barra lateral.
Criar um projeto do Azure Functions
A extensão Functions permite criar um projeto de aplicativo de funções, juntamente com sua primeira função. As
etapas a seguir mostram como criar uma função disparada por HTTP em um novo projeto do functions. O gatilho
http é o modelo de gatilho de função mais simples para demonstrar.
1. Do Azure: Funções, selecione o ícone criar função :
2. Selecione a pasta para seu projeto de aplicativo de funções e, em seguida, Selecione um idioma para seu
projeto de função.
3. Selecione o modelo de função de gatilho http ou selecione ignorar agora para criar um projeto sem uma
função. Você sempre pode Adicionar uma função ao seu projeto posteriormente.
4. Digite HTTPTrigger para o nome da função e selecione Enter e, em seguida, selecione autorização de
função . Esse nível de autorização exige que você forneça uma chave de função ao chamar o ponto de
extremidade da função.
Uma função é criada no idioma escolhido e no modelo para uma função disparada por HTTP.
O modelo de projeto cria um projeto no idioma escolhido e instala as dependências necessárias. Para qualquer
idioma, o novo projeto tem estes arquivos:
host.json: Permite configurar o host do Functions. Essas configurações se aplicam quando você estiver
executando o Functions localmente e quando estiver executando-os no Azure. Para obter mais
informações, consulte a referência para host.json.
local.settings.json: Mantém as configurações usadas quando você está executando funções localmente.
Essas configurações são usadas somente quando você está executando funções localmente. Para obter
mais informações, consulte Local Settings File.
IMPORTANT
Como o arquivo local. Settings. JSON pode conter segredos, você precisa excluí-lo do seu controle de origem do
projeto.
Neste ponto, você pode adicionar associações de entrada e saída à sua função modificando o arquivo function.
JSON ou adicionando um parâmetro a uma C# função de biblioteca de classes.
Você também pode Adicionar uma nova função ao seu projeto.
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Veja a seguir exemplos de prompts para definir uma nova associação de saída de armazenamento:
Selecionar associação com direção Azure Queue Storage A associação é uma associação de fila
do Armazenamento do Azure.
PROMPT VALOR DESCRIÇÃO
O nome usado para identificar essa msg Nome que identifica o parâmetro de
associação em seu código associação referenciado em seu código.
Neste exemplo, a seguinte associação é adicionada à bindings matriz em seu arquivo function. JSON:
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "MyStorageConnection"
}
Você também pode adicionar a mesma definição de ligação diretamente ao seu function. JSON.
No seu código de função, msg a associação é acessada context do, como neste exemplo:
Armazenamento ✔ ✔ ✔ ✔ ✔
de Blobs
BD Cosmos ✔ ✔ ✔ ✔ ✔
Grade de ✔ ✔ ✔
eventos
TIPO 1.X 2. X OF ENTRADA SAÍDA
Hubs de Eventos ✔ ✔ ✔ ✔
WebHooks de & ✔ ✔ ✔ ✔
de HTTP
Hub IoT ✔ ✔ ✔ ✔
Microsoft Graph ✔ ✔ ✔
Excel tabelas
Arquivos de ✔ ✔ ✔
OneDrive
Microsoft Graph
Microsoft Graph ✔ ✔
Outlook email
Microsoft Graph ✔ ✔ ✔ ✔
events
Tokens de ✔ ✔
Auth Microsoft
Graph
Aplicativos ✔ ✔ ✔
Móveis
Hubs de ✔ ✔
Notificação
Armazenamento ✔ ✔ ✔ ✔
de filas
SendGrid ✔ ✔ ✔
Barramento de ✔ ✔ ✔ ✔
Serviço
SignalR ✔ ✔ ✔
Armazenamento ✔ ✔ ✔ ✔
de tabelas
Timer ✔ ✔ ✔
Twilio ✔ ✔ ✔
Publicar no Azure
Visual Studio Code permite publicar seu projeto do Functions diretamente no Azure. No processo, você criará um
aplicativo de funções e recursos relacionados em sua assinatura do Azure. O aplicativo de funções fornece um
contexto de execução para suas funções. O projeto é empacotado e implantado para o novo aplicativo de função
em sua assinatura do Azure.
Quando você publica de Visual Studio Code em um novo aplicativo de funções no Azure, é oferecido um caminho
de criação de aplicativo de função rápida e um caminho avançado.
Ao publicar do Visual Studio Code, você tira proveito da tecnologia de implantação de zip .
Criação rápida de aplicativos de funções
Quando você escolhe + criar novo aplicativo de funções no Azure... , a extensão gera automaticamente
valores para os recursos do Azure necessários para seu aplicativo de funções. Esses valores se baseiam no nome
do aplicativo de funções que você escolher. Para obter um exemplo de como usar os padrões para publicar seu
projeto em um novo aplicativo de funções no Azure, consulte o artigo Visual Studio Code início rápido.
Se você quiser fornecer nomes explícitos para os recursos criados, deverá escolher o caminho avançado de
criação.
Publicar um projeto em um novo aplicativo de funções no Azure usando opções avançadas
As etapas a seguir publicam seu projeto em um novo aplicativo de funções criado com opções de criação
avançadas:
1. Na área Azure: Na área de funções, selecione o ícone implantar em aplicativo de funções .
2. Se você não estiver conectado, você será solicitado a entrar no Azure. Você também pode Criar uma
conta gratuita do Azure. Depois de entrar no navegador, volte para Visual Studio Code.
3. Se você tiver várias assinaturas, Selecione uma assinatura para o aplicativo de funções e, em seguida,
selecione + criar novo aplicativo de funções no Azure... Avançado . Essa opção avançada oferece
mais controle sobre os recursos que você cria no Azure.
4. Seguindo os prompts, forneça estas informações:
Selecionar aplicativo de funções no Criar novos Aplicativo de funções no No prompt seguinte, digite um nome
Azure Azure globalmente exclusivo que
identifique o novo aplicativo de
funções e selecione Enter. Caracteres
válidos para um nome de aplicativo
de funções são a-z , 0-9 e - .
Selecionar um grupo de recursos Criar novo grupo de recursos No prompt seguinte, digite um nome
para novos recursos de grupo de recursos,
myResourceGroup como e, em
seguida, selecione Enter. Você
também pode selecionar um grupo
de recursos existente.
Selecione uma conta de Criar nova conta de armazenamento No prompt seguinte, digite um nome
armazenamento. globalmente exclusivo para a nova
conta de armazenamento usada pelo
seu aplicativo de funções e selecione
Enter. Os nomes de conta de
armazenamento devem ter entre 3 e
24 caracteres e podem conter
apenas números e letras minúsculas.
Você também pode selecionar uma
conta existente.
Uma notificação é exibida depois que seu aplicativo de funções é criado e o pacote de implantação é
aplicado. Escolha Exibir Saída nessa notificação para exibir a criação e os resultados da implantação,
incluindo os recursos do Azure que você criou.
IMPORTANT
Publicar em um aplicativo de funções existente substitui o conteúdo desse aplicativo no Azure.
1. Em Visual Studio Code, selecione F1 para abrir a paleta de comandos. Na paleta de comandos, procure e
selecione Azure Functions: Implante no aplicativode funções.
2. Se você não estiver conectado, você será solicitado a entrar no Azure. Depois de entrar no navegador, volte
para Visual Studio Code. Se você tiver várias assinaturas, Selecione uma assinatura que contenha seu
aplicativo de funções.
3. Selecione seu aplicativo de funções existente no Azure. Quando você for avisado sobre a substituição de
todos os arquivos no aplicativo de funções, selecione implantar para confirmar o aviso e continuar.
O projeto é recriado, reempacotado e carregado no Azure. O projeto existente é substituído pelo novo pacote e o
aplicativo de funções é reiniciado.
IDIOMA REQUISITO
C# Extensão C#
Ferramentas de CLI do .NET Core
JavaScript Node.js*
CONFIGURAÇÃO DESCRIÇÃO
Por padrão, essas configurações não são migradas automaticamente quando o projeto é publicado no Azure.
Depois que a publicação for concluída, você terá a opção de publicar configurações de local. Settings. JSON em
seu aplicativo de funções no Azure. Para saber mais, consulte Publicar configurações do aplicativo.
Os valores em ConnectionStrings nunca são publicados.
Os valores das configurações do aplicativo de funções também podem ser lidos em seu código como variáveis de
ambiente. Para obter mais informações, consulte as seções de variáveis de ambiente desses artigos de referência
específicos a um idioma:
C# pré-compilado
Script do C# (.csx)
Java
JavaScript
TIP
Certifique-se de salvar seu arquivo local. Settings. JSON antes de publicá-lo.
Se o arquivo local for criptografado, ele será descriptografado, publicado e criptografado novamente. Se houver
configurações com valores conflitantes nos dois locais, você será solicitado a escolher como proceder.
Exibir configurações de aplicativo existentes no Azure: Área de funções expandindo sua assinatura, seu aplicativo
de funções e as configurações do aplicativo.
Funções de monitoramento
Quando você executa funções localmente, os dados de log são transmitidos para o console do terminal. Você
também pode obter dados de log quando seu projeto do Functions está em execução em um aplicativo de
funções no Azure. Você pode se conectar aos logs de streaming no Azure para ver os dados de log quase em
tempo real, ou pode habilitar Application Insights para um entendimento mais completo de como seu aplicativo
de funções está se comportando.
Logs de streaming
Quando você está desenvolvendo um aplicativo, muitas vezes é útil ver informações de log em tempo quase real.
Você pode exibir um fluxo de arquivos de log que estão sendo gerados por suas funções. Essa saída é um exemplo
de logs de streaming para uma solicitação para uma função disparada por HTTP:
Application Insights
Recomendamos que você monitore a execução de suas funções integrando seu aplicativo de funções com
Application Insights. Quando você cria um aplicativo de funções no portal do Azure, essa integração ocorre por
padrão. Ao criar seu aplicativo de funções durante a publicação do Visual Studio, você precisa integrar Application
Insights você mesmo.
As funções facilitam a adição da integração do Application Insights a um aplicativo de funções do portal do Azure.
1. No portal, selecione Todos os serviços > Aplicativos de Funções, selecione o aplicativo de funções e,
em seguida, selecione a faixa do Application Insights na parte superior da janela
Nome Nome de aplicativo exclusivo É mais fácil usar o mesmo nome que
seu aplicativo de funções, que deve
ser exclusivo em sua assinatura.
3. Selecione OK. O recurso do Application Insights é criado no mesmo grupo de recursos e assinatura que
seu aplicativo de funções. Depois que o recurso for criado, feche a janela do Application Insights.
4. No aplicativo de funções, selecione Configurações do aplicativo e role para baixo até Configurações
do aplicativo. Se você vir uma configuração chamada APPINSIGHTS_INSTRUMENTATIONKEY , isso significa que a
integração do Application Insights está habilitada para seu aplicativo de funções em execução no Azure.
Para saber mais, consulte Monitorar Azure Functions.
Projetos# de script C
Por padrão, todos C# os projetos são criados como C# projetos de biblioteca de classes compilados. Se você
preferir trabalhar com C# projetos de script em vez disso, deverá C# selecionar script como o idioma padrão nas
configurações de extensão de Azure Functions:
1. Selecione arquivo > preferênciasconfigurações > .
2. Vá para configurações > de usuárioextensões > Azure Functions.
3. Selecione o script C # do Azure Function: Linguagemdo projeto.
Depois de concluir essas etapas, as chamadas feitas às ferramentas básicas subjacentes incluem --csx a opção,
que gera e publica C# arquivos de projeto de script (. CSX). Quando você tem esse idioma padrão especificado,
todos os projetos que você cria são C# padrão para criar scripts de projetos. Não será solicitado que você escolha
uma linguagem de projeto quando um padrão for definido. Para criar projetos em outros idiomas, você deve
alterar essa configuração ou removê-la do arquivo Settings. JSON do usuário. Depois de remover essa
configuração, você será solicitado a escolher o idioma novamente quando criar um projeto.
Referência da paleta de comandos
A extensão Azure Functions fornece uma interface gráfica útil na área para interagir com seus aplicativos de
funções no Azure. A mesma funcionalidade também está disponível como comandos na paleta de comandos (F1).
Estes Azure Functions comandos estão disponíveis:
Adicionar novas configurações Cria uma nova configuração de aplicativo no Azure. Para
saber mais, consulte Publicar configurações do aplicativo.
Talvez você também precise baixar essa configuração para
suas configurações locais.
Copiar URL da função Obtém a URL remota de uma função disparada por HTTP que
está sendo executada no Azure. Para saber mais, veja obter a
URL da função implantada.
Criar aplicativo de funções no Azure Cria um novo aplicativo de funções em sua assinatura no
Azure. Para saber mais, consulte a seção sobre como publicar
em um novo aplicativo de funções no Azure.
Executar função agora Inicia manualmente uma função disparada por temporizador
no Azure. Esse comando é usado para teste. Para saber mais
sobre como disparar funções não HTTP no Azure, consulte
executar manualmente uma função não disparada por http.
Inicializar o projeto para uso com VS Code Adiciona os arquivos de projeto de Visual Studio Code
necessários a um projeto de funções existente. Use esse
comando para trabalhar com um projeto que você criou
usando as ferramentas básicas.
Instalar ou atualizar Azure Functions Core Tools Instala ou atualiza Ferramentas básicas do Azure Functions,
que é usado para executar funções localmente.
Alternar como configuração de slot Quando habilitado, o garante que uma configuração de
aplicativo persista para um determinado slot de implantação.
Desinstalar o Azure Functions Core Tools Remove Azure Functions Core Tools, que é exigido pela
extensão.
Próximas etapas
Para saber mais sobre Azure Functions Core Tools, confira trabalhar com Azure Functions Core Tools.
Para saber mais sobre como desenvolver funções como bibliotecas de classes do .NET, consulte Referência do
desenvolvedor de C# do Azure Functions. Este artigo também fornece links para exemplos de como usar
atributos para declarar os vários tipos de associações com suporte pelo Azure Functions.
Desenvolver o Azure Functions usando o Visual
Studio
07/11/2019 • 35 minutes to read • Edit Online
O Visual Studio permite que você desenvolva, teste C# e implante funções de biblioteca de classes no Azure. Se
esta for sua primeira experiência com o Azure Functions, você pode aprender mais em Uma introdução ao
Azure Functions.
O Visual Studio oferece os seguintes benefícios ao desenvolver suas funções:
Editar, criar e executar funções em seu computador de desenvolvimento local.
Publique seu projeto de Azure Functions diretamente no Azure e crie recursos do Azure conforme
necessário.
Use C# atributos para declarar associações de função diretamente no C# código.
Desenvolver e implantar funções de pré-compiladas C#. Funções pré-compiladas fornecem um
desempenho de inicialização a frio melhor que funções baseadas em script C#.
Codificar suas funções em C# tendo todos os benefícios de desenvolvimento do Visual Studio.
Este artigo fornece detalhes sobre como usar o Visual Studio para desenvolver C# funções de biblioteca de
classes e publicá-las no Azure. Antes de ler este artigo, você deve concluir o início rápido das Funções para o
Visual Studio.
Salvo indicação em contrário, os procedimentos e exemplos mostrados são para o Visual Studio 2019.
Pré-requisitos
Azure Functions ferramentas estão incluídas na carga de trabalho de desenvolvimento do Azure do Visual
Studio, começando com o Visual Studio 2017. Certifique-se de incluir a carga de trabalho de
desenvolvimento do Azure em sua instalação do Visual Studio.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Outros recursos necessários, como uma conta de armazenamento do Azure, são criados em sua assinatura
durante o processo de publicação.
NOTE
No Visual Studio 2017, a carga de trabalho de desenvolvimento do Azure instala as ferramentas de Azure Functions
como uma extensão separada. Ao atualizar o Visual Studio 2017, verifique também se você está usando a versão mais
recente das ferramentas de Azure functions. As seções a seguir mostram como verificar e (se necessário) atualizar sua
extensão de ferramentas de Azure Functions no Visual Studio 2017.
Ignore esta seção ao usar o Visual Studio 2019.
2. Depois de fazer o download da atualização das ferramentas, feche o Visual Studio para disparar a
atualização das ferramentas usando o instalador VSIX.
3. No instalador, escolha OK para iniciar e depois Modificar para atualizar as ferramentas.
4. Depois que a atualização for concluída, escolha Fechar e reinicie o Visual Studio.
NOTE
No Visual Studio 2019 e posterior, a extensão de ferramentas de Azure Functions é atualizada como parte do
Visual Studio.
Tempo de execução do Functions Azure Functions 2.x Essa configuração cria um projeto
(.NET Core) de função que usa o tempo de
execução versão 2.x do Azure
Functions, o qual dá suporte a .NET
Core. O Azure Functions 1.x dá
suporte ao .NET Framework. Para
obter mais informações, consulte
Direcionar o tempo de execução do
Azure Functions.
5. Selecione Criar para criar o projeto de função e a função disparada por HTTP.
O modelo de projeto cria um projeto C#, instala o pacote NuGet Microsoft.NET.Sdk.Functions e define a
estrutura de destino. O novo projeto contém os seguintes arquivos:
host.json: Permite configurar o host do Functions. Essas configurações se aplicam para execução local e
no Azure. Para obter mais informações, consulte a referência para host.json.
local.settings.json: Mantém as configurações usadas ao executar as funções localmente. Essas
configurações não são usadas durante a execução no Azure. Para obter mais informações, consulte Local
Settings File.
IMPORTANT
Como o arquivo Settings pode conter segredos, ele devem ser excluídos do seu controle de origem do projeto. A
configuração Cópia para o diretório de saída desse arquivo deve ser sempre Copiar se for mais recente.
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "<language worker>",
"AzureWebJobsStorage": "<connection-string>",
"AzureWebJobsDashboard": "<connection-string>",
"MyBindingConnection": "<binding-connection-string>"
},
"Host": {
"LocalHttpPort": 7071,
"CORS": "*",
"CORSCredentials": false
},
"ConnectionStrings": {
"SQLConnectionString": "<sqlclient-connection-string>"
}
}
CONFIGURAÇÃO DESCRIÇÃO
CONFIGURAÇÃO DESCRIÇÃO
As configurações em local. Settings. JSON não são carregadas automaticamente quando você publica o
projeto. Para certificar-se de que essas configurações também existam em seu aplicativo de funções no Azure,
você deve carregá-las depois de publicar o projeto. Para saber mais, confira configurações do aplicativo de
funções.
Os valores em ConnectionStrings nunca são publicados.
Os valores de configuração do aplicativo de funções também podem ser lidos em seu código como variáveis de
ambiente. Para obter mais informações, consulte variáveis de ambiente.
Este exemplo de gatilho usa uma cadeia de conexão com uma chave chamada QueueStorage. Essa
configuração de cadeia de conexão deve ser definida no arquivo local.settings.json.
3. Examine a classe recém-adicionada. Você verá um método estático Run, que é atribuído ao atributo
FunctionName. Esse atributo indica que o método é o ponto de entrada para a função.
Por exemplo, a classe C# a seguir representa uma função básica disparada pelo armazenamento de filas:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace FunctionApp1
{
public static class Function1
{
[FunctionName("QueueTriggerCSharp")]
public static void Run([QueueTrigger("myqueue-items",
Connection = "QueueStorage")]string myQueueItem, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
}
}
}
Adicionar associações
Assim como acontece com gatilhos, as associações de entrada e saída são adicionadas à sua função como
atributos de associação. Adicione associações a uma função da seguinte maneira:
1. Verifique se você configurou o projeto para o desenvolvimento local.
2. Adicione o pacote de extensão do NuGet pertinente para a associação. Para saber mais, confira
Desenvolvimento Local em C# usando o Visual Studio no artigo Gatilhos e associações. Os requisitos de
pacote NuGet específicos da associação estão no artigo de referência da associação. Por exemplo,
encontre os requisitos do pacote para o gatilho dos Hubs de Eventos no artigo de referência da
associação dos Hubs de Eventos.
3. Se houver configurações de aplicativo exigidas pela associação, adicione-as à coleção Valores no
arquivo de configuração local. Esses valores são usados quando a função é executada localmente.
Quando a função é executada no aplicativo de funções no Azure, as configurações do aplicativo de
funções são usadas.
4. Adicione o atributo de associação apropriado para a assinatura do método. No exemplo a seguir, uma
mensagem da fila dispara a função e a associação de saída cria uma nova mensagem de fila com o
mesmo texto em uma fila diferente.
Armazenamento ✔ ✔ ✔ ✔ ✔
de Blobs
BD Cosmos ✔ ✔ ✔ ✔ ✔
Grade de ✔ ✔ ✔
eventos
Hubs de Eventos ✔ ✔ ✔ ✔
TIPO 1.X 2. X OF ENTRADA SAÍDA
WebHooks de & ✔ ✔ ✔ ✔
de HTTP
Hub IoT ✔ ✔ ✔ ✔
Microsoft Graph ✔ ✔ ✔
Excel tabelas
Arquivos de ✔ ✔ ✔
OneDrive
Microsoft Graph
Microsoft Graph ✔ ✔
Outlook email
Microsoft Graph ✔ ✔ ✔ ✔
events
Tokens de ✔ ✔
Auth Microsoft
Graph
Aplicativos ✔ ✔ ✔
Móveis
Hubs de ✔ ✔
Notificação
Armazenamento ✔ ✔ ✔ ✔
de filas
SendGrid ✔ ✔ ✔
Barramento de ✔ ✔ ✔ ✔
Serviço
SignalR ✔ ✔ ✔
Armazenamento ✔ ✔ ✔ ✔
de tabelas
Timer ✔ ✔ ✔
Twilio ✔ ✔ ✔
1 no tempo de execução da versão 2. x, todas as associações, exceto http e Timer, devemser registradas.
Consulte registrar extensões de associação. Todas as associações 2. x com suporte também têm suporte na
versão 3. x, salvo indicação em contrário.
Funções de teste
As Ferramentas Principais do Azure Functions permitem executar o projeto do Azure Functions no seu
computador de desenvolvimento local. Você precisa instalar essas ferramentas na primeira vez em que inicia
uma função no Visual Studio.
Para testar sua função, pressione F5. Se solicitado, aceite a solicitação do Visual Studio para baixar e instalar as
ferramentas principais (CLI) do Azure Functions. Você também precisará habilitar a exceção de firewall de
forma que as ferramentas possam lidar com solicitações HTTP.
Com o projeto em execução, você pode testar seu código da mesma forma que você testaria a função
implantada. Para saber mais informações, consulte Estratégias para testar seu código no Azure Functions.
Quando em execução no modo de depuração, os pontos de interrupção são atingidos no Visual Studio,
conforme o esperado.
Para saber mais sobre o uso das Ferramentas Básicas do Azure Functions, consulte Codificar e testar o Azure
Functions localmente.
Publicar no Azure
Ao publicar do Visual Studio, um dos dois métodos de implantação é usado:
Implantação da Web: empacota e implanta aplicativos do Windows em qualquer servidor IIS.
Implantação de zip com execução do pacote habilitada: recomendado para implantações de Azure functions.
Use as etapas a seguir para publicar seu projeto em um aplicativo de funções no Azure.
1. No Gerenciador de Soluções, clique com o botão direito do mouse no nome do projeto e selecione
Publicar.
2. Na caixa de diálogo Selecione um destino de publicação, use as opções publicar, conforme
especificado na tabela embaixo da imagem:
OPÇÃO DESCRIÇÃO
Plano de consumo do Azure Functions Quando você publica seu projeto em um aplicativo de
funções executado em um Plano de consumo, você paga
apenas pelas execuções do seu aplicativo de funções.
Outros planos de hospedagem incorrem em custos mais
altos. Para saber mais, confira Escala e hospedagem do
Azure Functions.
OPÇÃO DESCRIÇÃO
Executar com base no arquivo de pacote Seu aplicativo de funções é implantado usando a
Implantação de Zip com o modo Run-From-Package
habilitado. Essa é a maneira recomendada de executar
suas funções, que resulta em um melhor desempenho.
Quando não estiver usando essa opção, verifique se
você interrompeu a execução local do projeto de
aplicativo de funções antes de publicar no Azure.
3. Selecione Publicar. Se você ainda não entrou em sua conta do Azure do Visual Studio, selecione Entrar.
Também é possível criar uma conta gratuita do Azure.
4. No Serviço de Aplicativo: Criar, use as configurações de Hospedagem conforme especificadas na
tabela embaixo da imagem:
5. Selecione Criar para criar um aplicativo de funções e recursos relacionados no Azure com essas
configurações e implantar seu código de projeto de função.
6. Após a conclusão da implantação, anote o valor da URL do Site, que é o endereço do seu aplicativo de
funções no Azure.
NOTE
Por padrão, o arquivo local. Settings. JSON não é verificado no controle do código-fonte. Isso significa que, quando você
clona um projeto de funções locais do controle do código-fonte, o projeto não tem um arquivo local. Settings. JSON.
Nesse caso, você precisa criar manualmente o arquivo local. Settings. JSON na raiz do projeto para que a caixa de diálogo
configurações do aplicativo funcione conforme o esperado.
Funções de monitoramento
A maneira recomendada de monitorar a execução de suas funções é a integração do aplicativo de funções com
o Azure Application Insights. Ao criar um aplicativo de funções no portal do Azure, essa integração é realizada
por padrão. No entanto, ao criar o aplicativo de funções durante a publicação do Visual Studio, a integração no
aplicativo de funções no Azure não é realizada.
Para habilitar o Application Insights no aplicativo de funções:
As funções facilitam a adição da integração do Application Insights a um aplicativo de funções do portal do
Azure.
1. No portal, selecione Todos os serviços > Aplicativos de Funções, selecione o aplicativo de funções e,
em seguida, selecione a faixa do Application Insights na parte superior da janela
Nome Nome de aplicativo exclusivo É mais fácil usar o mesmo nome que
seu aplicativo de funções, que deve
ser exclusivo em sua assinatura.
3. Selecione OK. O recurso do Application Insights é criado no mesmo grupo de recursos e assinatura que
seu aplicativo de funções. Depois que o recurso for criado, feche a janela do Application Insights.
4. No aplicativo de funções, selecione Configurações do aplicativo e role para baixo até Configurações
do aplicativo. Se você vir uma configuração chamada APPINSIGHTS_INSTRUMENTATIONKEY , isso significa
que a integração do Application Insights está habilitada para seu aplicativo de funções em execução no
Azure.
Para saber mais, consulte Monitorar Azure Functions.
Próximas etapas
Para saber mais sobre as Ferramentas Básicas do Azure Functions, consulte Codificar e testar o Azure
Functions localmente.
Para saber mais sobre como desenvolver funções como bibliotecas de classes do .NET, consulte Referência do
desenvolvedor de C# do Azure Functions. Este tópico também fornece links para exemplos de como usar
atributos para declarar os vários tipos de associações com suporte pelo Azure Functions.
Trabalhar com o Azure Functions Core Tools
25/05/2018 • 45 minutes to read • Edit Online
Azure Functions Core Tools permite desenvolver e testar as funções em seu computador local a partir
do prompt de comando ou terminal. Suas funções locais podem se conectar a serviços do Azure em
tempo real e você pode depurar as suas funções em seu computador local usando o tempo de execução
total do Functions. Você ainda pode implantar um aplicativo de funções para sua assinatura do Azure.
IMPORTANT
Não combine o desenvolvimento local com o desenvolvimento do portal no mesmo aplicativo de funções. Ao
criar e publicar funções de um projeto local, não tente manter ou modificar o código do projeto no portal.
Desenvolver funções em seu computador local e publicá-las no Azure usando ferramentas básicas
segue estas etapas básicas:
Instale as principais ferramentas e dependências.
Crie um projeto de aplicativo de funções de um modelo específico de idioma.
Registrar extensões de gatilho e de associação.
Defina o armazenamento e outras conexões.
Crie uma função de um gatilho e de um modelo específico ao idioma.
Executar a função localmente
Publicar o projeto no Azure
Windows
As etapas a seguir usam npm para instalar ferramentas principais no Windows. Você também pode usar
Chocolatey. Para obter mais informações, confira o arquivo Leiame das Ferramentas Principais.
1. Instale o Node.js, que inclui npm. Para a versão 2.x das ferramentas, somente Node.js 8.5 e
versões posteriores têm suporte.
2. Instale o pacote de ferramentas principais:
Pode levar alguns minutos para que o NPM Baixe e instale o pacote de ferramentas principais.
3. Se você não planeja usar pacotes de extensão, instale o SDK do .NET Core 2. x para Windows.
MacOS com o Homebrew
As etapas a seguir usam o Homebrew para instalar as ferramentas principais em macOS.
1. Instale o Homebrew, se ele ainda não estiver instalado.
2. Instale o pacote de ferramentas principais:
3. Se você não planeja usar pacotes de extensão, instale o SDK do .NET Core 2. x para MacOS.
Linux (Ubuntu/Debian ) com APT
As etapas a seguir usma APT para instalar as ferramentas principais em sua distribuição
Ubuntu/Debian Linux. Para outras distribuições do Linux, confira o arquivo Leiame das ferramentas
principais.
1. Instale a chave GPG do repositório de pacotes da Microsoft para validar a integridade do pacote:
2. Configure a lista de origem de desenvolvimento do .NET antes de fazer uma atualização de APT.
Para configurar a lista de origem APT para o Ubuntu, execute este comando:
Para configurar a lista de origem APT para Debian, execute este comando:
Debian 10 buster
Debian 9 stretch
Debian 8 jessie
6. Se você não planeja usar pacotes de extensão, instale o SDK do .NET Core 2. x para Linux.
Quando você fornece um nome de projeto, uma nova pasta com esse nome é criada e inicializada. Caso
contrário, a pasta atual é inicializada.
Na versão 2.x, quando você executar o comando você deve escolher um tempo de execução para o seu
projeto.
Select a worker runtime:
dotnet
node
python
powershell
Use cima/para baixo de teclas de direção para escolher um idioma, em seguida, pressione Enter. Se você
planeja desenvolver funções JavaScript ou TypeScript, escolha nóe, em seguida, selecione o idioma. O
TypeScript tem alguns requisitos adicionais.
A saída se parece com o seguinte exemplo para um projeto JavaScript:
func init dá suporte às seguintes opções, que são somente da versão 2.x, a menos que haja outro tipo
de orientação:
OPÇÃO DESCRIÇÃO
Extensões de registro
Com exceção dos gatilhos HTTP e o timer, associações de funções na versão de tempo de execução 2.x
são implementados como pacotes de extensão. Na versão 2.x do tempo de execução do Azure
Functions, você deve registrar explicitamente as extensões para os tipos de associação usados em suas
funções. As exceções a isso são as associações HTTP e gatilhos de temporizador, que não exigem
extensões.
Você pode optar por instalar as extensões de associação individualmente, ou você pode adicionar uma
referência de pacote de extensão para o arquivo de projeto do host. JSON. Pacotes de extensão remove
a possibilidade de ter problemas de compatibilidade de pacote ao usar vários tipos de associação. É a
abordagem recomendada para registrar as extensões de associação. Pacotes de extensão também
elimina a necessidade de instalar o .NET Core 2.x do SDK.
pacotes de extensão
A maneira mais fácil de instalar as extensões de associação é habilitar pacotes de extensão. Quando
você habilita os pacotes, um conjunto predefinido de pacotes de extensão é instalado automaticamente.
Para habilitar pacotes de extensão, abra o arquivo host.json e atualize seu conteúdo de acordo com o
código a seguir:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Para obter mais informações, consulte as extensões de associação de funções do Azure registrar. Você
deve adicionar pacotes de extensão para o host. JSON antes de adicionar associações para o arquivo do
Functions.
Registrar extensões individuais
Se você precisar instalar extensões que não estão em um pacote, você poderá registrar manualmente os
pacotes de extensão individuais para associações específicas.
NOTE
Para registrar manualmente extensões usando func extensions install , você deve ter o .NET Core 2.x SDK
instalado.
Depois de atualizar o arquivo function.json para incluir todas as associações que a função precisa,
execute o comando a seguir na pasta do projeto.
func extensions install
O comando lê o arquivo function.json para saber quais são os pacotes necessários, instala-os e recria o
projeto de extensão. Ele adiciona as novas associações na versão atual, mas não atualiza as associações
existentes. Use a opção --force para atualizar as associações existentes para a versão mais recente nas
novas instalações.
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "<language worker>",
"AzureWebJobsStorage": "<connection-string>",
"AzureWebJobsDashboard": "<connection-string>",
"MyBindingConnection": "<binding-connection-string>"
},
"Host": {
"LocalHttpPort": 7071,
"CORS": "*",
"CORSCredentials": false
},
"ConnectionStrings": {
"SQLConnectionString": "<sqlclient-connection-string>"
}
}
CONFIGURAÇÃO DESCRIÇÃO
Por padrão, essas configurações não são migradas automaticamente quando o projeto é publicado no
Azure. Use a opção --publish-local-settings quando publicar para se certificar de que essas
configurações serão adicionadas ao aplicativo de funções no Azure. Observe que os valores em
ConnectionStrings nunca são publicados.
Os valores de configuração do aplicativo de funções também podem ser lidos em seu código como
variáveis de ambiente. Para obter mais informações, confira a seção de variáveis de Ambiente desses
tópicos de referência específicos de linguagem:
C# pré-compilado
Script do C# (. CSx)
Java
JavaScript
Quando nenhuma cadeia de conexão de armazenamento válida é definida para AzureWebJobsStorage eo
emulador não está sendo usado, a seguinte mensagem de erro é mostrada:
Enquanto ainda não tiver se conectado ao Azure, será solicitado que você faça isso.
func new
Na versão 2.x, quando você executa func new você é solicitado a escolher um modelo no idioma padrão
do seu aplicativo de funções, em seguida, você também precisará escolher um nome para sua função.
Na versão 1.x, você também precisará escolher o idioma.
Select a language: Select a template:
Blob trigger
Cosmos DB trigger
Event Grid trigger
HTTP trigger
Queue trigger
SendGrid
Service Bus Queue trigger
Service Bus Topic trigger
Timer trigger
Código de função é gerado em uma subpasta com o nome da função fornecido, como você pode ver na
seguinte saída do gatilho de fila:
Você também pode especificar essas opções no comando usando os seguintes argumentos:
ARGUMENTO DESCRIÇÃO
Por exemplo, para criar um gatilho de HTTP de JavaScript em um único comando, execute:
Para criar uma função ativada por fila em um único comando, execute:
JavaScript
func start
TypeScript
npm install
npm start
Versão 1.x
A versão 1. x do tempo de execução do Functions requer o comando host , como no exemplo a seguir:
OPÇÃO DESCRIÇÃO
Quando o host de funções é iniciado, ele gera as funções acionadas por URL de HTTP:
IMPORTANT
Ao executar localmente, a autenticação não é imposta para pontos de extremidade HTTP. Isso significa que todas
as solicitações HTTP locais são tratadas como authLevel = "anonymous" . Para obter mais informações, confira
o artigo de associação HTTP.
NOTE
Os exemplos neste tópico usam a ferramenta cURL para enviar solicitações HTTP do terminal ou de um prompt
de comando. Você pode usar uma ferramenta de sua escolha para enviar solicitações HTTP para o servidor local.
A ferramenta de rotação está disponível por padrão em sistemas baseados em Linux e no Windows 10 Build
17063 e posterior. No Windows mais antigo, você deve primeiro baixar e instalar a ferramenta de rotação.
Para ter informações mais gerais sobre o teste de funções, confira Estratégias para testar seu código no
Azure Functions.
Funções disparadas por HTTP e webhook
Chame o seguinte ponto de extremidade para executar localmente funções disparadas por HTTP e
webhook:
http://localhost:{port}/api/{function_name}
Use o mesmo nome de servidor e porta no qual o host do Functions está escutando. Veja isso na saída
gerada ao iniciar o host do Function. Chame essa URL usando qualquer método HTTP com suporte do
disparador.
O seguinte comando cURL dispara a função de início rápido MyHttpTrigger de uma solicitação GET
com o parâmetro name transmitido na cadeia de consulta.
O exemplo a seguir é a mesma função chamada a partir de uma solicitação POST passando name no
corpo da solicitação:
Você pode fazer solicitações GET de um navegador passando dados na cadeia de consulta. Para todos
os outros métodos HTTP, você deve usar cURL, Fiddler, Postman ou uma ferramenta de teste HTTP
semelhante.
Funções disparadas por algo diferente de HTTP
Para todos os tipos de funções que não sejam gatilhos HTTP e webhooks, você pode testar suas funções
localmente chamando um ponto de extremidade de administração. Chamar esse ponto de extremidade
com uma solicitação HTTP POST no servidor local dispara a função. Como alternativa, é possível passar
dados de teste para a execução no corpo da solicitação POST. Essa funcionalidade é semelhante á guia
Teste no Portal do Azure.
Chame o seguinte ponto de extremidade de administrador para disparar funções que não são HTTP:
http://localhost:{port}/admin/functions/{function_name}
Para passar dados de teste para o ponto de extremidade administrador de uma função, é necessário
fornecer os dados no corpo de uma mensagem de solicitação POST. O corpo da mensagem deve ter o
seguinte formato JSON:
{
"input": "<trigger_input>"
}
O valor <trigger_input> contém dados em um formato esperado pela função. O exemplo de cURL a
seguir é um POST para uma função QueueTriggerJS . Nesse caso, a entrada é uma cadeia de caracteres
equivalente à mensagem esperada na fila.
Você também pode invocar uma função diretamente usando func run <FunctionName> e fornecer dados
de entrada para a função. Esse comando é semelhante à execução de uma função usando a guia Testar
no Portal do Azure.
func run dá suporte para as seguintes opções:
OPÇÃO DESCRIÇÃO
Por exemplo, para chamar uma função ativada por HTTP e passar o corpo do conteúdo, execute o
seguinte comando:
Publicar no Azure
O Azure Functions Core Tools dá suporte a dois tipos de implantação: Implantando arquivos de projeto
de função diretamente em seu aplicativo de funções por meio da implantação de zip e implantando um
contêiner do Docker personalizado. Você já deve ter criado um aplicativo de funções em sua assinatura
do Azure, no qual você implantará seu código. Os projetos que exigem build devem ser compilados
para que os binários possam ser implantados.
Uma pasta de projeto pode conter arquivos e diretórios específicos do idioma que não devem ser
publicados. Itens excluídos são listados em um arquivo. funcignore na pasta raiz do projeto.
Implantação (arquivos de projeto )
Para publicar seu código local em um aplicativo de funções no Azure, use o comando publish :
Esse comando publica a um aplicativo de funções existente no Azure. Você receberá um erro se tentar
publicar em um <FunctionAppName> que não existe em sua assinatura. Para saber como criar um
aplicativo de funções pelo prompt de comando ou pela janela do terminal usando a CLI do Azure,
consulte Criar um aplicativo de funções para execução sem servidor. Por padrão, esse comando usa a
compilação remota e implanta seu aplicativo para ser executado a partir do pacote de implantação. Para
desabilitar esse modo de implantação recomendado, use a opção --nozip .
IMPORTANT
Quando você cria um aplicativo de funções no portal do Azure, ele usa a versão 2.x do tempo de execução do
Core Tools por padrão. Para que o aplicativo de funções use a versão 1.x do tempo de execução, siga as
instruções em Executar na versão 1.x. Você não pode alterar a versão do tempo de execução de um aplicativo de
funções que tenha funções existentes.
OPÇÃO DESCRIÇÃO
OPÇÃO DESCRIÇÃO
func deploy
OPÇÃO DESCRIÇÃO
Funções de monitoramento
A maneira recomendada para monitorar a execução de suas funções é integrar-se com o Aplicativo
Azure insights. Você também pode transmitir logs de execução para o computador local. Para saber
mais, consulte Monitorar Azure Functions.
Habilitar a integração do Application Insights
Quando você cria um aplicativo de funções no portal do Azure, a integração Application Insights é feita
para você por padrão. No entanto, quando você cria seu aplicativo de funções usando a CLI do Azure,
não é feita a integração em seu aplicativo de funções no Azure.
As funções facilitam a adição da integração do Application Insights a um aplicativo de funções do portal
do Azure.
1. No portal, selecione Todos os serviços > Aplicativos de Funções, selecione o aplicativo de
funções e, em seguida, selecione a faixa do Application Insights na parte superior da janela
2. Crie um recurso do Application Insights usando as configurações especificadas na tabela abaixo
da imagem.
Esse tipo de logs de streaming requer que você habilite a integração de Application insights para seu
aplicativo de funções.
Próximas etapas
As principais ferramentas do Azure Functions são Código-fonte aberto e hospedado no GitHub.
Para arquivar uma solicitação de bug ou recurso, abra um problema do GitHub.
Criar sua primeira função no portal do
Azure
25/05/2018 • 10 minutes to read • Edit Online
O Azure Functions lhe permite executar seu código em um ambiente sem servidor sem que seja
preciso primeiro criar uma VM ou publicar um aplicativo Web. Neste artigo, aprenda a usar o
Functions para criar a função "Olá, Mundo" no portal do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
NOTE
Os desenvolvedores de C# devem considerar criar sua primeira função no Visual Studio 2019 em vez de
usar o portal.
Nome do aplicativo de Nome globalmente exclusivo Nome que identifica seu novo
funções aplicativo de funções. Os
caracteres válidos são a-z
(não diferencia maiúsculas de
minúsculas), 0-9 e - .
8. Selecione Ir para recursos para exibir o novo aplicativo de funções. Você também pode
selecionar Fixar no painel. A fixação torna mais fácil retornar a esse recurso de aplicativo
de função no seu painel.
Em seguida, crie uma nova função no novo aplicativo de funções.
Testar a função
1. Em sua nova função, clique em </> Obter URL da função na parte superior direita,
selecione padrão (Tecla de função) e depois clique em Copiar.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com
inícios rápidos subsequentes, tutoriais ou com qualquer serviço criado por você nesse início
rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e
assim por diante. Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao
excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses
recursos, dependendo do status de conta e preços do serviço. Caso não precise mais dos
recursos, é possível excluí-los desta maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão
geral e depois selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione
o grupo de recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são
aqueles que deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por
alguns segundos. Também é possível selecionar o ícone de sino na parte superior da
página para exibir a notificação.
Próximas etapas
Você criou um aplicativo de funções com uma função simples disparada por HTTP.
Agora que você criou sua primeira função, vamos adicionar uma associação de saída à função
que grava uma mensagem na fila Armazenamento.
Adicionar mensagens a uma fila do Armazenamento do Azure usando o Functions
Para obter mais informações, veja Associações HTTP do Azure Functions.
Início Rápido: Criar sua primeira função por meio da
linha de comando usando a CLI do Azure
07/11/2019 • 12 minutes to read • Edit Online
Este tópico de início rápido explica como criar sua primeira função na linha de comando ou no terminal. É possível
usar a CLI do Azure para criar um aplicativo de funções, que é a infraestrutura sem servidor que hospeda sua
função. O projeto de código de função é gerado de um modelo usando o Azure Functions Core Tools, que também
é usado para implantar o projeto de aplicativo de funções no Azure.
Você pode seguir as etapas abaixo usando um computador Mac, Windows ou Linux.
Pré-requisitos
Antes de executar este exemplo, você deve ter o seguinte:
Instale o Azure Functions Core Tools versão 2.6.666 ou posterior.
Instale a CLI do Azure. Este artigo exige a CLI do Azure versão 2.0 ou posterior. Execute az --version
descobrir a versão que você tem. Você também pode usar o Azure Cloud Shell.
Uma assinatura ativa do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Quando solicitado, selecione um tempo de execução de trabalho entre as seguintes opções de linguagem:
dotnet : cria um projeto de biblioteca de classes do .NET (.csproj).
node : cria um projeto baseado em Node.js. Escolha javascript ou typescript .
python : para um projeto Python, conclua Criar uma função disparada por HTTP n Azure.
powershell : para um projeto PowerShell, conclua Criar sua primeira função do PowerShell no Azure.
Depois que o projeto é criado, use o seguinte comando para navegar até a nova pasta do projeto MyFunctionProj .
cd MyFunctionProj
Quando o comando for executado, você verá algo parecido com a seguinte saída:
The function "MyHttpTrigger" was created successfully from the "HttpTrigger" template.
JavaScript
func start
TypeScript
npm install
npm start
Quando o host do Functions é iniciado, ele escreve algo parecido com a seguinte saída, que foi truncada para
facilitar a leitura:
%%%%%%
%%%%%%
@ %%%%%% @
@@ %%%%%% @@
@@@ %%%%%%%%%%% @@@
@@ %%%%%%%%%% @@
@@ %%%% @@
@@ %%% @@
@@ %% @@
%%
%
...
...
Http Functions:
HttpTrigger: http://localhost:7071/api/MyHttpTrigger
Copie a URL da função HttpTrigger da saída do tempo de execução de função e cole-a na barra de endereços do
navegador. Acrescente o valor de cadeia de consulta ?name=<yourname> a essa URL e execute a solicitação. O
exemplo a seguir mostra a resposta no navegador à solicitação GET retornada pela função local:
Agora que você executou a função localmente, poderá criar o aplicativo de funções e outros recursos necessários
no Azure.
az storage account create --name <storage_name> --location westeurope --resource-group myResourceGroup --sku
Standard_LRS
Definir o parâmetro local do plano de consumo significa que o aplicativo da função é hospedado em um plano de
hospedagem de consumo. Nesse plano sem servidor, os recursos são adicionados dinamicamente conforme
exigido pelas funções, e você paga apenas quando as funções estão em execução. Para obter mais informações,
consulte Escolher o plano de hospedagem correto.
Depois que o aplicativo de funções for criado, a CLI do Azure mostrará informações semelhantes ao exemplo a
seguir:
{
"availabilityState": "Normal",
"clientAffinityEnabled": true,
"clientCertEnabled": false,
"containerSize": 1536,
"dailyMemoryTimeQuota": 0,
"defaultHostName": "quickstart.azurewebsites.net",
"enabled": true,
"enabledHostNames": [
"quickstart.azurewebsites.net",
"quickstart.scm.azurewebsites.net"
],
....
// Remaining output has been truncated for readability.
}
Implantar o projeto de aplicativo de funções no Azure
Depois que o aplicativo de funções for criado no Azure, você poderá usar o comando do Core Tools
func azure functionapp publish para implantar o código do projeto no Azure. Nestes exemplos, substitua
<APP_NAME> pelo nome do seu aplicativo da etapa anterior.
C# / JavaScript
Python
TypeScript
Você verá a saída semelhante à seguinte, que foi truncada para facilitar a leitura:
Preparing archive...
Uploading content...
Upload completed successfully.
Deployment completed successfully.
Syncing triggers...
Functions in myfunctionapp:
HttpTrigger - [httpTrigger]
Invoke url: https://myfunctionapp.azurewebsites.net/api/httptrigger?code=cCr8sAxfBiow548FBDLS1....
Copie o valor Invoke url para seu HttpTrigger , que você agora poderá usar para testar sua função no Azure. A
URL contém um valor da cadeia de caracteres de consulta code que é sua chave de função. Essa chave dificulta
para outras pessoas chamarem seu ponto de extremidade de gatilho HTTP no Azure.
Cole também a URL copiada, incluindo a chave de função, na barra de endereços do navegador da Web.
Acrescente novamente o valor de cadeia de consulta &name=<yourname> à URL e execute a solicitação.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja continuar com Inícios Rápidos
ou tutoriais subsequentes, não limpe os recursos criados neste Início Rápido. Se você não planeja continuar, use o
comando a seguir para excluir todos os recursos criados neste Início Rápido:
Próximas etapas
Saiba mais sobre como desenvolver localmente Azure Functions usando as Ferramentas Básicas do Azure
Functions.
Codificar e testar o Azure Functions localmente
2 minutes to read
2 minutes to read
Criar sua primeira função com Java e Eclipse
01/11/2019 • 6 minutes to read • Edit Online
Este artigo mostra como criar um projeto de função sem servidor com o Eclipse IDE e o Apache Maven, testá-lo
e depurá-lo e implantá-lo nas Funções do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
IMPORTANT
A variável de ambiente JAVA_HOME deve ser definida como o local de instalação do JDK para concluir este guia de início
rápido.
É altamente recomendável também instalar as Ferramentas Principais do Azure Functions, versão 2, que
fornecem um ambiente local para executar e depurar as Funções do Azure.
O Maven cria os arquivos de projeto em uma nova pasta com um nome de artifactId. O código gerado no
projeto é uma função disparada por HTTP simples que ecoa o corpo da solicitação HTTP disparando.
1. Clique com botão direito no projeto gerado e, em seguida, escolha executar como e build do Maven.
2. Em Editar configuração caixa de diálogo, insira package no metas e nome campos, em seguida, selecione
executar. Isso irá compilar e empacotar o código de função.
3. Quando a construção estiver concluída, crie outra configuração de execução, como acima, usando
azure-functions:run como meta e nome. Selecione Executar para executar a função no IDE.
Encerrar o runtime na janela do console, quando você terminar de testar sua função. Apenas um host de função
pode estar ativo e em execução localmente de cada vez.
Depurar a função no Eclipse
Em sua configuração Executar como configurada na etapa anterior, altere azure-functions:run para
azure-functions:run -DenableDebug e execute a configuração atualizada para iniciar o aplicativo de função no
modo de depuração.
Selecione o executados menu e open configurações de depuração. Escolher aplicativo Java remoto e crie
um novo. Dê um nome à sua configuração e preencha as configurações. A porta deve ser consistente com a
porta de depuração aberta pelo host de função, que por padrão é 5005 . Após a instalação, clique em Debug para
iniciar a depuração.
Defina pontos de interrupção e inspecione objetos em sua função usando o IDE. Quando terminar, pare o
depurador e o host da função de execução. Apenas um host de função pode estar ativo e em execução localmente
de cada vez.
Implantar a função no Azure
O processo de implantação no Azure Functions usa credenciais de conta da CLI do Azure. Faça logon com a CLI
do Azure antes de continuar usando o prompt de comando do computador.
az login
Implante seu código em um novo aplicativo de funções usando o azure-functions:deploy meta Maven em uma
nova executar como configuração.
Quando a implantação for concluída, você verá a URL que pode usar para acessar seu aplicativo de funções do
Azure:
Próximos passos
Examine o Guia do desenvolvedor de funções Java para saber mais sobre o desenvolvimento de funções Java.
Adicione outras funções com gatilhos diferentes ao seu projeto usando o destino Maven azure-functions:add
.
Criar sua primeira função do Azure com Java e
IntelliJ
24/10/2019 • 6 minutes to read • Edit Online
IMPORTANT
A variável de ambiente JAVA_HOME deve ser definida como o local de instalação do JDK para concluir as etapas neste
artigo.
É recomendável que você instale o Azure Functions Core Tools, versão 2. Ele fornece um ambiente de
desenvolvimento local para escrever, executar e depurar o Azure Functions.
Esse comando faz com que o host de função abra uma porta de depuração em 5005.
2. No menu Executar, selecione Editar Configurações.
3. Selecione (+) para adicionar um Remoto.
4. Preencha os campos Nome e Configurações e, em seguida, selecione OK para salvar a configuração.
5. Após a instalação, selecione Depurar < Nome da Configuração Remota > ou pressione Shift+F9 em
seu teclado para iniciar a depuração.
6. Ao terminar, pare o depurador e o processo em execução. Apenas um host de função pode estar ativo e
em execução localmente de cada vez.
az login
2. Implante seu código em uma nova função usando o destino do Maven azure-functions:deploy . Você
também pode selecionar a opção azure-functions:deploy na janela de projetos do Maven.
mvn azure-functions:deploy
3. Encontre a URL para sua função na saída da CLI do Azure depois que a função tiver sido implantada com
êxito.
Próximas etapas
Examine o Guia do desenvolvedor de funções Java para saber mais sobre o desenvolvimento de funções Java.
Adicione outras funções com gatilhos diferentes ao seu projeto usando o destino do Maven
azure-functions:add .
Criar um aplicativo de funções em um Plano do
Serviço de Aplicativo do Azure
08/11/2019 • 11 minutes to read • Edit Online
Azure Functions permite hospedar funções no Linux em um contêiner de Serviço de Aplicativo do Azure padrão.
Este artigo explica como usar a CLI do Azure para criar o portal do Azure para criar um aplicativo de funções
hospedado em Linux que é executado em um Plano do Serviço de Aplicativo. Você também pode usar seu próprio
contêiner.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Entrar no Azure
Entre no portal do Azure em https://portal.azure.com com sua conta do Azure.
Nome do aplicativo Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z , 0-9 e - .
NOTE
A experiência de desenvolvimento do portal pode ser útil para experimentar o Azure Functions. Na maioria dos cenários,
considere desenvolver suas funções localmente e publicar o projeto de seu aplicativo de funções usando um Visual Studio
Code ou Azure Functions Core Tools.
1. Em seu novo aplicativo de função, escolha a guia Visão geral e, em seguida, depois que ele carregar
completamente, escolha + Nova função.
Testar a função
1. Em sua nova função, clique em </> Obter URL da função na parte superior direita, selecione padrão
(Tecla de função) e depois clique em Copiar.
2. Cole a URL de função na barra de endereços do navegador. Adicione o valor da cadeia de caracteres de
consulta &name=<yourname> ao final desta URL e pressione Enter em seu teclado para executar a solicitação.
Você deverá ver a resposta retornada pela função exibida no navegador.
O exemplo a seguir mostra a resposta no navegador:
A URL da solicitação inclui uma chave que é necessária, por padrão, para acessar sua função via HTTP.
3. Quando a função é executada, informações de rastreamento são gravadas nos logs. Para ver a saída do
rastreamento da execução anterior, volte para sua função no portal e clique na seta na parte inferior da tela
para expandir os Logs.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você criou um aplicativo de funções com uma função simples disparada por HTTP.
Agora que você criou sua primeira função, vamos adicionar uma associação de saída à função que grava uma
mensagem na fila Armazenamento.
Adicionar mensagens a uma fila do Armazenamento do Azure usando o Functions
Para obter mais informações, veja Associações HTTP do Azure Functions.
Início Rápido: Criar sua primeira função hospedada
no Linux usando ferramentas de linha de comando
07/11/2019 • 12 minutes to read • Edit Online
O Azure Functions permite executar seu código em um ambiente Linux sem servidor sem que seja preciso
primeiro criar uma VM ou publicar um aplicativo Web. A hospedagem no Linux exige o Functions 2.x Runtime. As
funções sem servidor são executadas no plano de Consumo.
Este artigo de início rápido explica como usar a CLI do Azure para criar seu primeiro aplicativo de funções em
execução no Linux. O código da função é criado localmente e implantado no Azure usando o Azure Functions
Core Tools.
As etapas a seguir têm suporte em um computador Mac, Windows ou Linux. Este artigo mostra como criar
funções em JavaScript ou C#. Para saber como criar funções do Python, confira Criar sua primeira função do
Python usando o Core Tools e a CLI do Azure.
Pré-requisitos
Antes de executar este exemplo, você deve ter o seguinte:
Instale o Azure Functions Core Tools versão 2.6.666 ou posterior.
Instale a CLI do Azure. Este artigo requer a CLI do Azure versão 2.0 ou posterior. Execute az --version
descobrir a versão que você tem. Você também pode usar o Azure Cloud Shell.
Uma assinatura ativa do Azure.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Quando solicitado, selecione um tempo de execução de trabalho entre as seguintes opções de linguagem:
dotnet : cria um projeto de biblioteca de classes do .NET (.csproj).
node : cria um projeto baseado em Node.js. Escolha javascript ou typescript .
python : para um projeto Python, conclua Criar uma função disparada por HTTP n Azure.
powershell : para um projeto PowerShell, conclua Criar sua primeira função do PowerShell no Azure.
Depois que o projeto é criado, use o seguinte comando para navegar até a nova pasta do projeto MyFunctionProj .
cd MyFunctionProj
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Quando o comando for executado, você verá algo parecido com a seguinte saída:
The function "MyHttpTrigger" was created successfully from the "HttpTrigger" template.
JavaScript
func start
TypeScript
npm install
npm start
Quando o host do Functions é iniciado, ele escreve algo parecido com a seguinte saída, que foi truncada para
facilitar a leitura:
%%%%%%
%%%%%%
@ %%%%%% @
@@ %%%%%% @@
@@@ %%%%%%%%%%% @@@
@@ %%%%%%%%%% @@
@@ %%%% @@
@@ %%% @@
@@ %% @@
%%
%
...
...
Http Functions:
HttpTrigger: http://localhost:7071/api/MyHttpTrigger
Copie a URL da função HttpTrigger da saída do tempo de execução de função e cole-a na barra de endereços do
navegador. Acrescente o valor de cadeia de consulta ?name=<yourname> a essa URL e execute a solicitação. O
exemplo a seguir mostra a resposta no navegador à solicitação GET retornada pela função local:
Agora que você executou a função localmente, poderá criar o aplicativo de funções e outros recursos necessários
no Azure.
az storage account create --name <storage_name> --location westeurope --resource-group myResourceGroup --sku
Standard_LRS
Depois que o aplicativo de função for criado, você verá a seguinte mensagem:
Your serverless Linux function app 'myfunctionapp' has been successfully created.
To active this function app, publish your app content using Azure Functions Core Tools or the Azure portal.
C# / JavaScript
Python
Você verá a saída semelhante à seguinte, que foi truncada para facilitar a leitura:
Preparing archive...
Uploading content...
Upload completed successfully.
Deployment completed successfully.
Syncing triggers...
Functions in myfunctionapp:
HttpTrigger - [httpTrigger]
Invoke url: https://myfunctionapp.azurewebsites.net/api/httptrigger?code=cCr8sAxfBiow548FBDLS1....
Copie o valor Invoke url para seu HttpTrigger , que você agora poderá usar para testar sua função no Azure. A
URL contém um valor da cadeia de caracteres de consulta code que é sua chave de função. Essa chave dificulta
para outras pessoas chamarem seu ponto de extremidade de gatilho HTTP no Azure.
Cole também a URL copiada, incluindo a chave de função, na barra de endereços do navegador da Web.
Acrescente novamente o valor de cadeia de consulta &name=<yourname> à URL e execute a solicitação.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja continuar com Inícios Rápidos
ou tutoriais subsequentes, não limpe os recursos criados neste Início Rápido. Se você não planeja continuar, use o
comando a seguir para excluir todos os recursos criados neste Início Rápido:
az group delete --name myResourceGroup
Próximas etapas
Saiba mais sobre como desenvolver localmente Azure Functions usando as Ferramentas Básicas do Azure
Functions.
Codificar e testar o Azure Functions localmente
Criar uma função usando o Microsoft Azure for
Students Starter
24/10/2019 • 11 minutes to read • Edit Online
Neste tutorial, criaremos uma função HTTP Olá, Mundo em uma assinatura do Microsoft Azure for Students
Starter. Também examinaremos o que está disponível no Azure Functions nesse tipo de assinatura.
O Microsoft Azure for Students Starter oferece uma introdução aos produtos do Azure necessários para
desenvolver na nuvem sem nenhum custo para você. Saiba mais sobre essa oferta aqui.
O Azure Functions lhe permite executar seu código em um ambiente sem servidor sem que seja preciso primeiro
criar uma VM ou publicar um aplicativo Web. Saiba mais sobre o Functions aqui.
Entrar no Azure
Entre no portal do Azure em https://portal.azure.com com sua conta do Azure.
Nome do aplicativo Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z , 0-9 e - .
3. Selecione Localização/Plano de Serviço de Aplicativo acima para escolher uma localização diferente
4. Selecione Criar novo e, em seguida, dê um nome exclusivo para o plano.
5. Selecione a localização mais próxima de você. Veja um mapa completo de regiões do Azure aqui.
Testar a função
1. Em sua nova função, clique em </> Obter URL da função na parte superior direita, selecione padrão
(Tecla de função) e depois clique em Copiar.
2. Cole a URL de função na barra de endereços do navegador. Adicione o valor da cadeia de caracteres de
consulta &name=<yourname> ao final desta URL e pressione Enter em seu teclado para executar a solicitação.
Você deverá ver a resposta retornada pela função exibida no navegador.
O exemplo a seguir mostra a resposta no navegador:
A URL da solicitação inclui uma chave que é necessária, por padrão, para acessar sua função via HTTP.
3. Quando a função é executada, informações de rastreamento são gravadas nos logs. Para ver a saída do
rastreamento da execução anterior, volte para sua função no portal e clique na seta na parte inferior da tela
para expandir os Logs.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você criou um aplicativo de funções com uma função simples disparada por HTTP! Agora, você pode explorar as
ferramentas locais, mais linguagens, monitoramento e integrações.
Criar sua primeira função usando o Visual Studio
Criar sua primeira função usando o Visual Studio Code
Guia do desenvolvedor de JavaScript do Azure Functions
Usar o Azure Functions para conectar a um Banco de Dados SQL do Azure
Saiba mais sobre as associações HTTP do Azure Functions.
Monitorar o Azure Functions
Criar uma função disparada pelo Azure Cosmos DB
08/11/2019 • 17 minutes to read • Edit Online
Saiba como criar uma função disparada quando dados são adicionados ou alterados no Azure Cosmos DB. Para
saber mais sobre o Azure Cosmos DB, confira Azure Cosmos DB: computação de banco de dados sem servidor
usando o Azure Functions.
Pré-requisitos
Para concluir este tutorial:
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
NOTE
As associações do Azure Cosmos DB têm suporte apenas para usar com a API do SQL. Para todas as outras APIs do Azure
Cosmos DB, você deve acessar o banco de dados por meio da sua função usando o cliente estático da API, incluindo a API do
Azure Cosmos DB para MongoDB, a API do Cassandra, a API do Gremlin e a API de Tabela.
API O tipo de conta a ser criada Selecione Núcleo (SQL) para criar
uma consulta e um banco de dados
de documento usando a sintaxe SQL.
Location A região mais próxima dos usuários Selecione uma localização geográfica
para hospedar a sua conta do Azure
Cosmos DB. Use a localização mais
próxima dos usuários para fornecer a
eles acesso mais rápido aos dados.
4. Selecione Examinar + criar. Você pode ignorar as seções Rede e Marcas.
5. Examine as configurações da conta e selecione Criar. São necessários alguns minutos para criar a conta.
Aguarde até que a página do portal exiba Sua implantação está concluída.
6. Selecione Ir para recurso para ir para a página da conta do Azure Cosmos DB.
Criar um Aplicativo de funções do Azure
1. No menu do portal do Azure, selecione Criar um recurso.
Nome do aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
5. Configure o novo gatilho com as configurações conforme especificado na tabela abaixo da imagem.
CONFIGURAÇÃO VALOR SUGERIDO DESCRIÇÃO
Conexão de conta do Azure Nova configuração Selecione Novo e depois escolha sua
Cosmos DB Assinatura, a Conta de banco de
dados criada anteriormente e
Selecionar. Isso cria uma
configuração de aplicativo para sua
conexão de conta. Essa configuração
é usada pela associação para conexão
com o banco de dados.
Crie a coleção de concessão, se Verificado A coleção ainda não existe, então crie
ela não existir uma.
6. Clique em Criar para criar o banco de dados da função disparada do Azure Cosmos DB. Depois que a
função for criada, o código de função baseado em modelo será exibido.
Esse modelo de função grava o número de documentos e a primeira ID de documento para os logs.
Em seguida, você conecta-se à sua conta do Azure Cosmos DB e cria a coleção Items no banco de dados Tasks .
Capacidade de armazenamento Fixo (10 GB) Use o valor padrão. Esse valor é a
capacidade de armazenamento do
banco de dados.
6. Clique em OK para criar a coleção Itens. Pode levar alguns instantes para a coleção ser criada.
Depois que a coleção especificada na associação de função existir, você poderá testar a função adicionando
documentos a essa nova coleção.
Testar a função
1. Expanda a nova coleção taskCollection no Data Explorer, escolha Documentos e, em seguida, selecione
Novo Documento.
2. Substitua o conteúdo do novo documento pelo conteúdo a seguir e então escolha Salvar.
{
"id": "task1",
"category": "general",
"description": "some task"
}
3. Mude para a primeira guia do navegador que contém a função no portal. Expanda os logs de função e
verifique se o novo documento disparou a função. Veja se o valor de ID do documento task1 é gravado
nos logs.
4. (Opcional) Volte para o seu documento, faça uma alteração e, em seguida, clique em Atualizar. Em seguida,
volte para os logs de função e verifique se a atualização também disparou a função.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você criou uma função que é executada quando um documento é adicionado ou modificado no Azure Cosmos DB.
Para obter mais informações sobre gatilhos do Azure Cosmos DB, consulte Associações do Azure Cosmos DB para
Azure Functions.
Agora que você criou sua primeira função, vamos adicionar uma associação de saída à função que grava uma
mensagem na fila Armazenamento.
Adicionar mensagens a uma fila do Armazenamento do Azure usando o Functions
Criar uma função disparada pelo Armazenamento de
Blobs do Azure
07/11/2019 • 12 minutes to read • Edit Online
Saiba como criar uma função disparada quando arquivos são carregados ou atualizados no Armazenamento de
Blobs do Azure.
Pré-requisitos
Baixe e instale o Gerenciador de Armazenamento do Microsoft Azure.
Uma assinatura do Azure. Se você não tiver uma, crie uma conta gratuita antes de começar.
Nome do aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
Criar o contêiner
1. Em sua função, clique em Integrar, expanda Documentaçãoe copie Nome da conta e Chave de conta.
Você usa essas credenciais para conectar-se à conta de armazenamento. Se você já tiver se conectado à
conta de armazenamento, vá para a etapa 4.
4. Expanda a conta de armazenamento anexada, clique com o botão direito do mouse em Contêineres de
blob, clique em Criar contêiner de blob, digite samples-workitems e pressione enter.
Agora que você tem um contêiner de blob, você pode testar a função carregando um arquivo para o contêiner.
Testar a função
1. De volta ao Portal do Azure, navegue até sua função, expanda os Logs na parte inferior da página e
verifique se o streaming de log não está em pausa.
2. No Gerenciador de Armazenamento, expanda sua conta de armazenamento, Contêineres de blob e
samples-workitems. Clique em Carregar e depois em Carregar arquivos... .
3. Na caixa de diálogo Carregar arquivos, clique no campo Arquivos. Navegue até um arquivo em seu
computador local, por exemplo, um arquivo de imagem, selecione-o e clique em Abrir e depois em
Carregar.
4. Volte para os logs de função e verifique se o blob foi lido.
NOTE
Quando seu aplicativo de funções é executado no plano de consumo padrão, pode haver um atraso de até vários
minutos entre o blob que está sendo adicionado ou atualizado e a função sendo disparada. Se você precisar de baixa
latência em suas funções disparadas por blob, considere executar seu aplicativo de funções em um Plano do Serviço
de Aplicativo.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você criou uma função que é executada quando um blob é adicionado a um Armazenamento de Blobs ou
atualizado nele. Para obter mais informações sobre gatilhos de armazenamento de blobs, consulte Associações de
Armazenamento de Blobs do Azure Functions.
Agora que você criou sua primeira função, vamos adicionar uma associação de saída à função que grava uma
mensagem na fila Armazenamento.
Adicionar mensagens a uma fila do Armazenamento do Azure usando o Functions
Criar uma função disparada pelo Armazenamento de
Filas do Azure
07/11/2019 • 12 minutes to read • Edit Online
Saiba como criar uma função que é disparada quando as mensagens são enviadas para uma fila do
Armazenamento do Azure.
Pré-requisitos
Baixe e instale o Gerenciador de Armazenamento do Microsoft Azure.
Uma assinatura do Azure. Se você não tiver uma, crie uma conta gratuita antes de começar.
Nome do aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
4. Expanda a conta de armazenamento anexada, clique com o botão direito do mouse em Filas, clique em
Criar Fila, digite myqueue-items e pressione enter.
Agora que você tem uma fila de armazenamento, você pode testar a função adicionando uma mensagem à fila.
Testar a função
1. De volta ao Portal do Azure, navegue até sua função, expanda os Logs na parte inferior da página e
verifique se o streaming de log não está em pausa.
2. No Gerenciador de Armazenamento, expanda sua conta de armazenamento, Filas e myqueue-items; em
seguida, clique em Adicionar mensagem.
3. Digite sua mensagem "Olá, Mundo!" em Texto da mensagem e clique em OK.
4. Aguarde alguns segundos, depois volte para seus logs de função e verifique se a nova mensagem foi lida da
fila.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você criou uma função que é executada quando uma mensagem é adicionada a uma fila de armazenamento. Para
obter mais informações sobre gatilhos de Armazenamento de Filas, consulte Associações de fila do
Armazenamento do Azure Functions.
Agora que você criou sua primeira função, vamos adicionar uma associação de saída à função que grava uma
mensagem de volta em outra fila.
Adicionar mensagens a uma fila do Armazenamento do Azure usando o Functions
Criar uma função no Azure que é disparada por um
temporizador
07/11/2019 • 9 minutes to read • Edit Online
Saiba como usar o Azure Functions para criar uma função sem servidor que é executada com base em um
agendamento definido por você.
Pré-requisitos
Para concluir este tutorial:
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Nome do aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z (não diferencia
maiúsculas de minúsculas), 0-9 e
- .
3. No campo de pesquisa, digite timer e defina o novo gatilho com as configurações especificadas na tabela
abaixo da imagem.
CONFIGURAÇÃO VALOR SUGERIDO DESCRIÇÃO
4. Clique em Criar. Uma nova função na linguagem de programação escolhida por você e que é executada a
cada minuto é criada.
5. Verifique a execução, exibindo informações de rastreamento gravadas nos logs.
Agora você altera o agendamento da função para que ela seja executada uma vez por hora em vez de uma vez
por minuto.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los
desta maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você criou uma função que é executada segundo um agendamento. Para obter mais informações sobre gatilhos
de temporizador, confira Agendar a execução de código com o Azure Functions.
Agora que você criou sua primeira função, vamos adicionar uma associação de saída à função que grava uma
mensagem na fila Armazenamento.
Adicionar mensagens a uma fila do Armazenamento do Azure usando o Functions
Armazenar dados não estruturados usando o Azure
Functions e o Azure Cosmos DB
08/11/2019 • 11 minutes to read • Edit Online
O Azure Cosmos DB é uma ótima maneira de armazenar dados não estruturados e JSON. Combinado com o
Azure Functions, o Cosmos DB torna o armazenamento de dados rápido e fácil com muito menos código do que o
necessário para armazenar dados em um banco de dados relacional.
NOTE
Neste momento, o gatilho, as associações de entrada e as associações de saída do Azure Cosmos DB funcionam apenas com
contas da API do Graph e a API do SQL.
No Azure Functions, associações de entrada e saída fornecem uma maneira declarativa para se conectar a dados de
serviço externo de sua função. Neste artigo, saiba como atualizar uma função existente a fim de adicionar uma
associação de saída que armazena dados não estruturados em um documento do Azure Cosmos DB.
Pré-requisitos
Para concluir este tutorial:
Este tópico usa como ponto de partida os recursos criados em Criar sua primeira função no portal do Azure. Se
você ainda não fez isso, conclua estas etapas agora para criar seu aplicativo de funções.
2. Selecione Adicionar.
3. Na página Criar Conta do Azure Cosmos DB, insira as configurações básicas da nova conta do Azure
Cosmos.
API O tipo de conta a ser criada Selecione Núcleo (SQL) para criar
uma consulta e um banco de dados
de documento usando a sintaxe SQL.
Location A região mais próxima dos usuários Selecione uma localização geográfica
para hospedar a sua conta do Azure
Cosmos DB. Use a localização mais
próxima dos usuários para fornecer a
eles acesso mais rápido aos dados.
4. Selecione Examinar + criar. Você pode ignorar as seções Rede e Marcas.
5. Examine as configurações da conta e selecione Criar. São necessários alguns minutos para criar a conta.
Aguarde até que a página do portal exiba Sua implantação está concluída.
6. Selecione Ir para recurso para ir para a página da conta do Azure Cosmos DB.
Adicionar uma associação de saída
1. No portal, navegue até o aplicativo de funções que você criou anteriormente e expanda o aplicativo de
funções e a função.
2. Selecione Integrar e +Nova Saída, que está na parte superior direita da página. Escolha Azure Cosmos
DB e clique em Selecionar.
3. Se você receber uma mensagem de Extensões não instaladas, escolha Instalar para instalar a extensão de
associações do Azure Cosmos DB no aplicativo de funções. A instalação pode levar alguns minutos.
4. Use a configuração Saída do Azure Cosmos DB conforme especificado na tabela:
Se for true, cria o banco de dados Verificado A coleção ainda não existe, então crie
e a coleção do Cosmos DB uma.
Conexão de conta do Azure Nova configuração Selecione Novo e depois escolha sua
Cosmos DB Assinatura, a Conta de banco de
dados criada anteriormente e
Selecionar. Isso cria uma
configuração de aplicativo para sua
conexão de conta. Essa configuração
é usada pela associação para conexão
com o banco de dados.
#r "Newtonsoft.Json"
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
public static IActionResult Run(HttpRequest req, out object taskDocument, ILogger log)
{
string name = req.Query["name"];
string task = req.Query["task"];
string duedate = req.Query["duedate"];
Esse exemplo de código lê as cadeias de consulta da Solicitação HTTP e as atribui a campos no objeto
taskDocument . A associação taskDocument envia os dados do objeto desse parâmetro de associação para
armazenamento no banco de dados de documento associado. O banco de dados é criado na primeira execução da
função.
Você adicionou com êxito uma associação ao gatilho HTTP para armazenar dados não estruturados em um Azure
Cosmos DB.
Limpar recursos
Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você não espera precisar
desses recursos no futuro, poderá excluí-los ao excluir o grupo de recursos.
No menu do portal do Azure ou na página Inicial, selecione Grupos de Recursos e, na página Grupos de
Recursos, selecione myResourceGroup.
Na página myResourceGroup, certifique-se de que os recursos listados são aqueles que deseja excluir.
Selecione Excluir, digite myResourceGroup na caixa de texto e selecione Excluir.
Próximas etapas
Para saber mais sobre a associação a um banco de dados Cosmos DB, veja Associações do Azure Functions
Cosmos DB.
Conceitos de gatilhos e de associações do Azure Functions
Saiba como Functions se integra a outros serviços.
Referência do desenvolvedor do Azure Functions
Fornece informações mais técnicas sobre o tempo de execução do Functions e uma referência para funções de
codificação e definição de associações e gatilhos.
Codificar e testar o Azure Functions localmente
Descreve as opções para desenvolver suas funções localmente.
2 minutes to read
Adicionar mensagens a uma fila do Armazenamento
do Azure usando o Functions
24/10/2019 • 12 minutes to read • Edit Online
No Azure Functions, as associações de entrada e saída fornecem uma maneira declarativa para criar dados a partir
de serviços externos disponíveis ao seu código. Neste guia de início rápido, é possível usar uma associação de saída
para criar uma mensagem em uma fila quando uma função é disparada por uma solicitação HTTP. Use o
Gerenciador de Armazenamento do Azure para exibir as mensagens em fila que sua função cria:
Pré-requisitos
Para concluir este guia de início rápido:
Siga as instruções em Criar sua primeira função no portal do Azure e não realize a etapa Limpar recursos.
Este início rápido cria o aplicativo de funções e a função que você usa aqui.
Instale o Gerenciador de Armazenamento do Microsoft Azure. Esta é uma ferramenta que você usará para
examinar a fila de mensagens cuja sua associação de saída cria.
5. Se você receber uma mensagem de Extensões não instaladas, escolha Instalar para instalar a extensão
Associações de armazenamento no aplicativo de funções. Isso pode levar alguns minutos.
No corpo da função, imediatamente antes da instrução return , adicione o código que usa o parâmetro para
criar uma mensagem da fila.
Testar a função
1. Depois que as alterações de código forem salvas, selecione Executar.
Observe que o Corpo da solicitação contém o valor de name Azure. Esse valor aparece na mensagem da
fila que é criada quando a função é invocada.
Como uma alternativa para selecionar Executar aqui, você pode chamar a função inserindo uma URL em
um navegador e especificando o valor name na cadeia de consulta. O método de navegador é mostrado no
guia de início rápido anterior.
2. Confira os logs para verificar se a função foi bem-sucedida.
Uma nova fila denominada outqueue é criada na sua conta de armazenamento pelo tempo de execução do
Functions quando a associação de saída é usada pela primeira vez. Você usará o Gerenciador de Armazenamento
para verificar se a fila e uma mensagem nela foram criadas.
Conectar o Gerenciador de Armazenamento à sua conta
Ignore esta seção caso já tenha instalado o Gerenciador de Armazenamento e o conectado à conta de
armazenamento sendo usada neste guia de início rápido.
1. Execute a ferramenta Gerenciador de Armazenamento do Microsoft Azure, selecione o ícone conectar-se à
esquerda, escolha Usar um nome e chave de conta de armazenamento e selecione Avançar.
2. No portal do Azure, na página de aplicativo de funções, selecione a função e depois Integrar.
3. Selecione a associação de saída do Armazenamento de fila do Azure que você adicionou em uma etapa
anterior.
4. Expanda a seção Documentação na parte inferior da página.
O portal mostra as credenciais que você pode usar no Gerenciador de Armazenamento para se conectar à
conta de armazenamento.
5. Copie o valor Nome da Conta do portal e cole-o na caixa Nome da conta no Gerenciador de
Armazenamento.
6. Clique no ícone mostrar/ocultar ao lado da Chave de Conta para exibir o valor e depois copie o valor
Chave de Conta e cole-o na caixa Chave de conta no Gerenciador de Armazenamento.
7. Selecione Próximo > Conectar.
Examinar a fila de saída
1. No Gerenciador de Armazenamento, selecione a conta de armazenamento sendo usada para este guia de
início rápido.
2. Expanda o nó Filas e selecione a fila denominada outqueue.
A fila contém a mensagem que a associação de saída de fila criou quando você executou a função disparada
por HTTP. Se você tiver invocado a função com o valor name padrão do Azure, a mensagem da fila será
Nome transmitido à função: Azure.
3. Execute a função novamente e você verá uma nova mensagem exibida na fila.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los desta
maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Neste guia de início rápido, você adicionou uma associação de saída a uma função existente. Para obter mais
informações sobre associação a Armazenamento de Filas, consulte Associações de fila do Armazenamento do
Azure Functions.
Conceitos de gatilhos e de associações do Azure Functions
Saiba como Functions se integra a outros serviços.
Referência do desenvolvedor do Azure Functions
Fornece informações mais técnicas sobre o tempo de execução do Functions e uma referência para funções de
codificação e definição de associações e gatilhos.
Codificar e testar o Azure Functions localmente
Descreve as opções para desenvolver suas funções localmente.
2 minutes to read
2 minutes to read
Estratégias para testar seu código no Azure
Functions
25/05/2018 • 14 minutes to read • Edit Online
Este artigo demonstra como criar testes automatizados para o Azure Functions.
É recomendável testar todo o código; no entanto, talvez você obtenha resultados melhores ao encapsular uma
lógica da função e criar testes fora dela. Abstrair a lógica limita as linhas de código da função e permite que ela
seja a única responsável por chamar outras classes ou módulos. No entanto, este artigo demonstra como criar
testes automatizados em um HTTP e uma função disparada por temporizador.
O conteúdo a seguir é dividido em duas seções diferentes direcionadas a linguagens e ambientes distintos. Você
pode aprender a criar testes:
C# no Visual Studio com xUnit
JavaScript no VS Code com Jest
O repositório de exemplo está disponível no GitHub.
C# no Visual Studio
O exemplo a seguir descreve como criar um aplicativo de funções C# no Visual Studio e executar testes com
xUnit.
Configuração
Para configurar o ambiente, crie uma função e teste o aplicativo. As etapas a seguir ajudam você a criar os
aplicativos e as funções necessários para os testes:
1. Crie um aplicativo de funções e nomeie-o como Functions
2. Crie uma função HTTP do modelo e nomeie-a HttpTrigger.
3. Crie uma função temporizadora do modelo e nomeie-a TimerTrigger.
4. Crie um aplicativo de teste xUnit no Visual Studio, clicando em Arquivo > Novo > Projeto > Visual C# >
.NET Core > Projeto de teste xUnit e nomeie-o Functions.Test.
5. Use o NuGet para adicionar uma referência do aplicativo de teste Microsoft. AspNetCore. Mvc
6. Referencie o aplicativo Functions no aplicativo Functions.Test.
Criar classes de teste
Agora que os aplicativos foram criados, será possível criar as classes usadas para executar os testes
automatizados.
Cada função usa uma instância do ILogger para manipular o log de mensagens. Alguns testes não registram
mensagens ou não se preocupam com como log é implementado. Outros testes precisam avaliar as mensagens
registradas para determinar se foram aprovadas.
A classe ListLogger deve implementar a interface ILogger e manter uma lista interna de mensagens para
avaliação durante um teste.
Clique com o botão direito do mouse no aplicativo functions. Test e selecione Adicionar > classe, nomeie-o
NullScope.cs e insira o código a seguir:
using System;
namespace Functions.Tests
{
public class NullScope : IDisposable
{
public static NullScope Instance { get; } = new NullScope();
private NullScope() { }
Em seguida, clique com o botão direito do mouse no aplicativo functions. Test e selecione Adicionar > classe,
nomeie-o ListLogger.cs e insira o código a seguir:
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
namespace Functions.Tests
{
public class ListLogger : ILogger
{
public IList<string> Logs;
public ListLogger()
{
this.Logs = new List<string>();
}
A classe ListLogger implementará os seguintes membros, conforme contratado pela interface ILogger :
BeginScope: os escopos adicionam contexto ao seu registro em log. Nesse caso, o teste apenas aponta
para a instância estática na classe NullScope para permitir que o teste funcione.
IsEnabled: um valor padrão de false é fornecido.
Log: esse método usa a função de formatter fornecida para formatar a mensagem e, em seguida,
adiciona o texto resultante à coleção de Logs .
A coleção Logs é uma instância de List<string> e é inicializada no construtor.
Em seguida, clique com o botão direito do mouse no aplicativo Functions.Test e selecione Adicionar >
Classe. Nomeie como LoggerTypes.cs e insira este código:
namespace Functions.Tests
{
public enum LoggerTypes
{
Null,
List
}
}
namespace Functions.Tests
{
public class TestFactory
{
public static IEnumerable<object[]> Data()
{
return new List<object[]>
{
new object[] { "name", "Bill" },
new object[] { "name", "Paul" },
new object[] { "name", "Steve" }
};
}
if (type == LoggerTypes.List)
{
logger = new ListLogger();
}
else
{
logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
}
return logger;
}
}
}
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Xunit;
namespace Functions.Tests
{
public class FunctionsTests
{
private readonly ILogger logger = TestFactory.CreateLogger();
[Fact]
public async void Http_trigger_should_return_known_string()
{
var request = TestFactory.CreateHttpRequest("name", "Bill");
var response = (OkObjectResult)await HttpFunction.Run(request, logger);
Assert.Equal("Hello, Bill", response.Value);
}
[Theory]
[MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey,
string queryStringValue)
{
var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
var response = (OkObjectResult)await HttpFunction.Run(request, logger);
Assert.Equal($"Hello, {queryStringValue}", response.Value);
}
[Fact]
public void Timer_should_log_message()
{
var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);
TimerTrigger.Run(null, logger);
var msg = logger.Logs[0];
Assert.Contains("C# Timer trigger function executed at", msg);
}
}
}
Depurar testes
Para depurar os testes, defina um ponto de interrupção em um teste, navegue até o Gerenciador de Testes e
clique em Executar > Depurar última execução.
JavaScript no VS Code
O exemplo a seguir descreve como criar um aplicativo de funções JavaScript no VS Code e executar testes com
Jest. Este procedimento usa a extensão de funções do VS Code para criar no Azure Functions.
Configuração
Para configurar o ambiente, inicialize um novo aplicativo Node.js em uma pasta vazia executando npm init .
npm init -y
npm i jest
Agora, atualize package.json para substituir o comando de teste existente com o seguinte comando:
"scripts": {
"test": "jest"
}
module.exports = {
log: jest.fn()
};
Esse módulo simula a função log para representar o contexto de execução padrão.
Em seguida, adicione um novo arquivo, nomeie- defaultTimer.js e adicione o seguinte código:
module.exports = {
IsPastDue: false
};
Esse módulo implementa a propriedade IsPastDue como uma instância de temporizador falsa. Configurações
de temporizador como expressões NCRONTAB não são necessárias aqui, pois o equipamento de teste está
simplesmente chamando a função diretamente para testar o resultado.
Em seguida, use a extensão de funções do VS Code para criar uma função HTTP do JavaScript e nomeie-a
HttpTrigger. Após a criação da função, adicione um novo arquivo à mesma pasta de nome index.test.js e
adicione o seguinte código:
const request = {
query: { name: 'Bill' }
};
expect(context.log.mock.calls.length).toBe(1);
expect(context.res.body).toEqual('Hello Bill');
});
A função HTTP do modelo retornará uma cadeia de caracteres "Hello" concatenada com o nome fornecido na
cadeia de caracteres de consulta. Esse teste cria uma instância falsa de uma solicitação e passa-a para a função
HTTP. O teste verifica se o método log é chamado uma vez e se o texto retornado é igual a "Hello Bill".
Em seguida, use a extensão de funções do VS Code para criar uma função de temporizador do JavaScript e
nomeie-a TimerTrigger. Após a criação da função, adicione um novo arquivo à mesma pasta de nome
index.test.js e adicione o seguinte código:
A função de temporizador do modelo registra uma mensagem no final do corpo da função. Esse teste assegura
que a função log será chamada uma vez.
Executar testes
Para executar os testes, pressione CTRL + ~ para abrir a janela de comando e execute npm test :
npm test
Depurar testes
Para depurar seus testes, adicione a seguinte configuração ao arquivo launch.json:
{
"type": "node",
"request": "launch",
"name": "Jest Tests",
"disableOptimisticBPs": true,
"program": "${workspaceRoot}/node_modules/jest/bin/jest.js",
"args": [
"-i"
],
"internalConsoleOptions": "openOnSessionStart"
}
Próximos passos
Agora que você aprendeu a gravar testes automatizados das funções, continue com estes recursos:
Executar manualmente uma função não disparada por HTTP
Tratamento de erros do Azure Functions
Depuração local do gatilho da Grade de Eventos do Azure Functions
Depurar Azure Functions do PowerShell localmente
24/10/2019 • 12 minutes to read • Edit Online
NOTE
O PowerShell para o Azure Functions está atualmente em versão prévia. Para receber atualizações importantes, assine o
repositório Anúncios do Serviço de Aplicativo do Azure no GitHub.
Você pode depurar suas funções do PowerShell localmente como faria com qualquer script do PowerShell usando
as seguintes ferramentas de desenvolvimento padrão:
Visual Studio Code: Editor de texto gratuito, leve e de software livre da Microsoft com a extensão do
PowerShell que oferece uma experiência de desenvolvimento completa do PowerShell.
Um console do PowerShell: Depurar usando os mesmos comandos que você usaria para depurar qualquer
outro processo do PowerShell.
O Azure Functions Core Tools dá suporte à depuração local de Azure functions, incluindo o PowerShell functions.
PSFunctionApp
| - HttpTriggerFunction
| | - run.ps1
| | - function.json
| - local.settings.json
| - host.json
| - profile.ps1
Esse aplicativo de funções é semelhante ao que você obtém quando conclui o início rápido do PowerShell.
O código de função em run.ps1 é semelhante ao seguinte script:
param($Request)
$name = $Request.Query.Name
if($name) {
$status = 200
$body = "Hello $name"
}
else {
$status = 400
$body = "Please pass a name on the query string or in the request body."
}
Tudo o que você precisa fazer é adicionar uma chamada ao cmdlet Wait-Debugger logo acima da instrução if , da
seguinte maneira:
param($Request)
$name = $Request.Query.Name
if($name) {
$status = 200
$body = "Hello $name"
}
# ...
NOTE
Se o seu projeto não tiver os arquivos de configuração necessários, você será solicitado a adicioná-los.
Definir a versão do PowerShell
O PowerShell Core é instalado lado a lado com o Windows PowerShell. Defina o PowerShell Core como a versão
do PowerShell a ser usada com a extensão do PowerShell para Visual Studio Code.
1. Pressione F1 para exibir o palete de comandos e, em seguida, procure Session .
2. Escolha **PowerShell: Mostrar menu de sessão @ no__t-0.
3. Se a sessão atual não for o PowerShell Core 6, escolha **Switch para: PowerShell Core 6 @ no__t-0.
Quando você tiver um arquivo do PowerShell aberto, verá a versão exibida em verde na parte inferior direita da
janela. A seleção desse texto também exibe o menu sessão. Para saber mais, consulte escolhendo uma versão do
PowerShell para usar com a extensão.
Iniciar o aplicativo de funções
Verifique se Wait-Debugger está definido na função em que você deseja anexar o depurador. Com Wait-Debugger
adicionado, você pode depurar seu aplicativo de funções usando Visual Studio Code.
Escolha o painel depurar e anexe à função do PowerShell.
NOTE
Você precisa garantir que PSWorkerInProcConcurrencyUpperBound esteja definido como 1 para garantir a experiência de
depuração correta em Visual Studio Code. Esse é o padrão.
Com seu aplicativo de funções em execução, você precisa de um console do PowerShell separado para chamar a
função disparada por HTTP.
Nesse caso, o console do PowerShell é o cliente do. O Invoke-RestMethod é usado para disparar a função.
Em um console do PowerShell, execute o seguinte comando:
Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"
Você observará que uma resposta não é retornada imediatamente. Isso ocorre porque Wait-Debugger anexou o
depurador e a execução do PowerShell entrou no modo de interrupção assim que possível. Isso ocorre devido ao
conceito de BreakAll, que é explicado posteriormente. Depois de pressionar o botão continue , o depurador agora
será interrompido na linha logo após Wait-Debugger .
Neste ponto, o depurador é anexado e você pode fazer todas as operações normais do depurador. Para obter mais
informações sobre como usar o depurador no Visual Studio Code, consulte a documentação oficial.
Depois de continuar e chamar totalmente o script, você observará que:
O console do PowerShell que fez o Invoke-RestMethod retornou um resultado
O console integrado do PowerShell no Visual Studio Code está aguardando a execução de um script
Posteriormente, quando você invoca a mesma função, o depurador na extensão do PowerShell é interrompido
logo após o Wait-Debugger .
Abra um console do, cd no diretório do seu aplicativo de funções e execute o seguinte comando:
Com o aplicativo de funções em execução e o Wait-Debugger em vigor, você pode anexar ao processo. Você
precisa de mais dois consoles do PowerShell.
Um dos consoles atua como o cliente. A partir disso, você chama Invoke-RestMethod para disparar a função. Por
exemplo, você pode executar o seguinte comando:
Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"
Você observará que ele não retorna uma resposta, que é um resultado do Wait-Debugger . O runspace do
PowerShell agora está aguardando a anexação de um depurador. Vamos colocar isso em anexo.
No outro console do PowerShell, execute o seguinte comando:
Get-PSHostProcessInfo
To end the debugging session type the 'Detach' command at the debugger prompt, or type 'Ctrl+C' otherwise.
At /Path/To/PSFunctionApp/HttpTriggerFunction/run.ps1:13 char:1
+ if($name) { ...
+ ~~~~~~~~~~~
[DBG]: [Process:49988]: [Runspace1]: PS /Path/To/PSFunctionApp>>
Neste ponto, você está parado em um pontos de interrupção no depurador do PowerShell. A partir daqui, você
pode fazer todas as operações de depuração usuais, depurar, entrar, continuar, encerrar e outras. Para ver o
conjunto completo de comandos de depuração disponíveis no console do, execute os comandos h ou ? .
Você também pode definir pontos de interrupção nesse nível com o cmdlet Set-PSBreakpoint .
Depois de continuar e chamar totalmente o script, você observará que:
O console do PowerShell em que você executou Invoke-RestMethod agora retornou um resultado.
O console do PowerShell em que você executou Debug-Runspace está aguardando a execução de um script.
Você pode invocar a mesma função novamente (usando Invoke-RestMethod , por exemplo) e o depurador é
interrompido logo após o comando Wait-Debugger .
Se essa interrupção ocorrer, execute o comando continue ou c para ignorar esse ponto de interrupção. Em
seguida, você pára no ponto de interrupção esperado.
Próximas etapas
Para saber mais sobre como desenvolver funções usando o PowerShell, confira Azure Functions guia do
desenvolvedor do PowerShell.
Depuração local do gatilho da Grade de Eventos do
Azure Functions
24/10/2019 • 5 minutes to read • Edit Online
Este artigo demonstra como depurar uma função local que manipula um evento de grade de eventos do Azure
gerado por uma conta de armazenamento.
Pré-requisitos
Criar ou usar um aplicativo de função existente
Criar ou usar uma conta de armazenamento existente
Realizar o download do ngrok para permitir que o Azure chame sua função local
Depois que a função é criada, abra o arquivo de código e o copie a URL comentada na parte superior do arquivo.
Esse local é usado ao configurar o gatilho de Grade de Eventos.
Em seguida, defina um ponto de interrupção na linha que começa com log.LogInformation .
Como o utilitário de configuração, a janela de comando deve ser semelhante à seguinte captura de tela:
Cópia de HTTPS URL gerada quando ngrok é executado. Esse local é usado ao configurar o gatilho de Grade de
Eventos.
Na janela Eventos, clique no botão Assinatura de Evento. Na janela Até Assinatura, clique na lista suspensa Tipo
de ponto de extremidade e selecione Web hook.
Depois que o tipo de ponto de extremidade é configurado, clique em Selecionar um ponto de extremidade
para configurar o valor de ponto de extremidade.
O valor do Ponto de extremidade do assinante é composto de três valores diferentes. O prefixo é a URL HTTPS
gerada pelo ngrok. O restante da URL vem da URL encontrada no arquivo de código de função, com o nome da
função adicionado ao final. Começando com a URL do arquivo de código de função, o ngrok URL substitui
http://localhost:7071 e a função nome substitui {functionname} .
IMPORTANT
Sempre que você iniciar o ngrok, a URL HTTPS é gerada novamente e o valor é alterado. Portanto você deve criar uma nova
assinatura de evento cada vez que expor sua função no Azure por meio do ngrok.
Carregar um arquivo
Agora você pode carregar um arquivo para sua conta de armazenamento para disparar um Evento de Grade de
Eventos para sua função local para tratar.
Abra o Gerenciador de Armazenamento e conecte-se à sua conta de armazenamento.
Expanda Contêineres de Blob
Clique com botão direito e selecione Criar contêiner de Blob.
Nomeie o contêiner teste
Selecione o contêiner testar
Clique no botão Carregar
Clique em Carregar arquivos
Selecione um arquivo e carregá-o para o contêiner de blob
Depurar a função
Depois que a Grade de Eventos reconhece que um novo arquivo for carregado para o contêiner de
armazenamento, o ponto de interrupção é atingido em sua função local.
Limpar recursos
Para limpar os recursos criados neste artigo, exclua o contêiner Testar em sua conta de armazenamento.
Próximas etapas
Automatizar o redimensionamento de imagens carregadas usando a Grade de Eventos
Gatilho de Grade de Eventos para o Azure Functions
Usar injeção de dependência no .NET Azure
Functions
31/10/2019 • 9 minutes to read • Edit Online
Azure Functions dá suporte ao padrão de design de software injeção de dependência (DI), que é uma técnica para
obter inversão de controle (IOC ) entre classes e suas dependências.
A injeção de dependência no Azure Functions é criada sobre os recursos de injeção de dependência do .NET
Core. É recomendável ter familiaridade com a injeção de dependência do .NET Core . No entanto, há
diferenças em como você substitui dependências e como os valores de configuração são lidos com Azure
Functions no plano de consumo.
O suporte para injeção de dependência começa com Azure Functions 2. x.
Pré-requisitos
Antes de poder usar a injeção de dependência, você deve instalar os seguintes pacotes NuGet:
Microsoft. Azure. Functions. Extensions
Pacote Microsoft. net. Sdk. Functions versão 1.0.28 ou posterior
Serviços de registro
Para registrar serviços, crie um método para configurar e adicionar componentes a uma instância de
IFunctionsHostBuilder . O host Azure Functions cria uma instância de IFunctionsHostBuilder e a transmite
diretamente para o seu método.
Para registrar o método, adicione o atributo FunctionsStartup assembly que especifica o nome de tipo usado
durante a inicialização.
using System;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Logging;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
builder.Services.AddSingleton((s) => {
return new MyService();
});
builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
}
}
}
Limitações
Uma série de etapas de registro executada antes e depois que o tempo de execução processa a classe de
inicialização. Portanto, tenha em mente os seguintes itens:
A classe de inicialização destina -se apenas à instalação e ao registro. Evite usar serviços registrados na
inicialização durante o processo de inicialização. Por exemplo, não tente registrar uma mensagem em um
agente que está sendo registrado durante a inicialização. Esse ponto do processo de registro é muito cedo
para que os serviços estejam disponíveis para uso. Depois que o método de Configure é executado, o
tempo de execução do Functions continua registrando dependências adicionais, o que pode afetar o
funcionamento dos serviços.
O contêiner de injeção de dependência só mantém tipos explicitamente registrados. Os únicos serviços
disponíveis como tipos que podem ser injetados são os que são configurados no método Configure . Como
resultado, tipos específicos de funções como BindingContext e ExecutionContext não estão disponíveis
durante a instalação ou como tipos injetados.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace MyNamespace
{
public class HttpTrigger
{
private readonly IMyService _service;
private readonly HttpClient _client;
[FunctionName("GetPosts")]
public async Task<IActionResult> Get(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "posts")] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
var res = await _client.GetAsync("https://microsoft.com");
await _service.AddResponse(res);
Serviços de log
Se você precisar de seu próprio provedor de log, registre um tipo personalizado como uma instância de
ILoggerProvider . Application Insights é adicionado por Azure Functions automaticamente.
WARNING
Não adicione AddApplicationInsightsTelemetry() à coleção de serviços, pois ela registra os serviços que entram em
conflito com os serviços fornecidos pelo ambiente.
Não Registre seu próprio TelemetryConfiguration ou TelemetryClient se você estiver usando a funcionalidade
interna do Application Insights.
único
Microsoft.Extensions.Configuration.IConfiguration Configuração de tempo de execução
único
Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider Responsável por fornecer a ID da
instância do host
Se houver outros serviços nos quais você deseja assumir uma dependência, crie um problema e proponha-os no
GitHub.
Substituindo serviços de host
Atualmente, não há suporte para a substituição de serviços fornecidos pelo host. Se houver serviços que você
deseja substituir, crie um problema e proponha-os no GitHub.
De dentro do método Startup.Configure , você pode extrair valores da instância IConfiguration para seu tipo
personalizado usando o seguinte código:
builder.Services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
{
configuration.Bind(settings);
});
Chamar Bind copia os valores que têm nomes de propriedade correspondentes da configuração na instância
personalizada. A instância de opções agora está disponível no contêiner IoC para injetar em uma função.
O objeto options é injetado na função como uma instância da interface de IOptions genérica. Use a propriedade
Value para acessar os valores encontrados em sua configuração.
using System;
using Microsoft.Extensions.Options;
Consulte o padrão de opções em ASP.NET Core para obter mais detalhes sobre como trabalhar com opções.
WARNING
Evite tentar ler valores de arquivos como local. Settings. JSON ou appSettings. { Environment }. JSON no plano de consumo.
Os valores lidos desses arquivos relacionados a conexões de gatilho não estão disponíveis conforme o aplicativo é
dimensionado porque a infraestrutura de hospedagem não tem acesso às informações de configuração.
Próximos passos
Para saber mais, consulte os recursos a seguir:
Como monitorar seu aplicativo de funções
Práticas recomendadas para funções
Gerenciar conexões no Azure Functions
24/10/2019 • 9 minutes to read • Edit Online
Funções em um aplicativo de funções compartilham recursos. Entre esses recursos compartilhados estão as
conexões: Conexões HTTP, conexões de banco de dados e conexões com serviços como o armazenamento do
Azure. Quando muitas funções estão em execução simultaneamente, é possível ficar sem conexões
disponíveis. Este artigo explica como codificar suas funções para evitar o uso de mais conexões do que
precisam.
Limite de conexão
O número de conexões disponíveis é limitado parcialmente porque um aplicativo de funções é executado em
um ambiente de área restrita. Uma das restrições que a área de proteção impõe em seu código é um limite no
número de conexões de saída, que são atualmente 600 conexões ativas (total de 1.200) por instância. Quando
você atinge esse limite, o tempo de execução do Functions grava a seguinte mensagem
Host thresholds exceeded: Connections nos logs:. Para obter mais informações, consulte os limites de serviço
do Functions.
Esse limite é por instância. Quando o controlador de escala adiciona instâncias do aplicativo de funções para
lidar com mais solicitações, cada instância tem um limite de conexão independente. Isso significa que não há
nenhum limite de conexão global e você pode ter muito mais do que 600 conexões ativas em todas as
instâncias ativas.
Ao solucionar problemas, certifique-se de ter habilitado Application Insights para seu aplicativo de funções.
Application Insights permite exibir métricas para seus aplicativos de funções, como execuções. Para obter mais
informações, consulte Exibir telemetria no Application insights.
Clientes estáticos
Para evitar manter mais conexões que o necessário, reutilize as instâncias do cliente em vez de criar novas com
cada invocação de função. É recomendável reutilizar conexões de cliente para qualquer idioma em que você
possa escrever sua função. Por exemplo, clientes .net como o HttpClient, oDocumentClient e os clientes de
armazenamento do Azure podem gerenciar conexões se você usar um único cliente estático.
Aqui estão algumas diretrizes a serem seguidas quando você estiver usando um cliente específico do serviço
em um aplicativo Azure Functions:
Não crie um novo cliente com cada invocação de função.
Crie um único cliente estático que cada invocação de função possa usar.
Considere a criação de um único cliente estático em uma classe auxiliar compartilhada se funções
diferentes usarem o mesmo serviço.
Uma pergunta comum sobre o HttpClient no .net é "Devo descartar meu cliente?" Em geral, você descartar
objetos que IDisposable implementam quando você terminar de usá-los. Mas você não descartar um cliente
estático porque não está pronto usando-o quando a função termina. Você quer que o cliente estático
permaneça durante a duração do aplicativo.
Exemplos de agente HTTP (JavaScript)
Como ele fornece melhores opções de gerenciamento de conexão, você deve usar a classe http.agent nativa
em vez de métodos não nativos, como o módulo node-fetch . Os parâmetros de conexão são configurados
http.agent por meio de opções na classe. Para obter opções detalhadas disponíveis com o agente http,
consulte novo agente[(]opções).
A classe http.globalAgent global usada pelo http.request() tem todos esses valores definidos para seus
respectivos padrões. A maneira recomendada de configurar limites de conexão em Funções é definir um
número máximo globalmente. O exemplo a seguir define o número máximo de soquetes para o aplicativo de
função:
http.globalAgent.maxSockets = 200;
O exemplo a seguir cria uma nova solicitação HTTP com um agente HTTP personalizado somente para essa
solicitação:
// Rest of function
}
Conexões SqlClient
Seu código de função pode usar o .NET Framework Provedor de Dados para SQL Server (SqlClient) para
fazer conexões com um banco de dados relacional do SQL. Esse também é o provedor subjacente para
estruturas de dados que dependem de ADO.NET, como Entity Framework. Ao contrário das conexões
HttpClient e DocumentClient, o ADO.NET implementa o pool de conexões por padrão. Mas como você ainda
pode ficar sem conexões, você deve otimizar as conexões com o banco de dados. Para obter mais informações,
consulte Pool de Conexões do SQL Server (ADO.NET).
TIP
Algumas estruturas de dados, como Entity Framework, normalmente recebem cadeias de conexão da seção
connectionStrings de um arquivo de configuração. Nesse caso, é necessário adicionar explicitamente as cadeias de
conexão de banco de dados SQL à coleção Cadeias de conexão das configurações de aplicativo de funções e no
local.settings.json file no projeto local. Se você estiver criando uma instância de SqlConnection em seu código de função,
deverá armazenar o valor da cadeia de conexão nas configurações do aplicativo com suas outras conexões.
Próximas etapas
Para obter mais informações sobre por que recomendamos clientes estáticos, consulte antipadrão de
instanciação impróprio.
Para obter mais dicas de desempenho do Azure Functions, consulte Melhore o desempenho e a confiabilidade
do Azure Functions.
Tratamento de erros do Azure Functions
07/11/2019 • 3 minutes to read • Edit Online
O tratamento de erros no Azure Functions é importante para evitar perda de dados, eventos perdidos e para
monitorar a integridade do aplicativo.
Este artigo descreve estratégias gerais para tratamento de erros junto com links para erros específicos de
associação.
Tratamento de erros
Os erros gerados em um Azure Functions podem vir de qualquer uma das seguintes origens:
Uso de gatilhos e associações de Azure Functions internos
Chamadas para APIs de serviços subjacentes do Azure
Chamadas para pontos de extremidade REST
Chamadas para bibliotecas de cliente, pacotes ou APIs de terceiros
Seguir as práticas sólidas de tratamento de erros é importante para evitar a perda de dados ou mensagens
perdidas. As práticas recomendadas de tratamento de erros incluem as seguintes ações:
Habilitar Application Insights
Usar tratamento de erro estruturado
Design para Idempotência
Implementar políticas de repetição (quando apropriado)
Usar tratamento de erro estruturado
Capturar e publicar erros é essencial para monitorar a integridade do seu aplicativo. O nível mais alto de
qualquer código de função deve incluir um bloco try/catch. No bloco catch, você pode capturar e publicar erros.
Tentar suporte novamente
Os seguintes gatilhos têm suporte interno de repetição:
Armazenamento de Blobs do Azure
Armazenamento de Filas do Azure
Barramento de Serviço do Azure (fila/tópico)
Por padrão, esses gatilhos retentam solicitações até cinco vezes. Após a quinta repetição, os dois gatilhos gravam
uma mensagem em uma fila suspeita.
Você precisa implementar manualmente as políticas de repetição para quaisquer outros tipos de associações ou
disparadores. Implementações manuais podem incluir a gravação de informações de erro em uma fila de
mensagens suspeitas. Ao gravar em uma fila suspeita, você tem a oportunidade de tentar novamente as
operações mais tarde. Essa abordagem é a mesma usada pelo gatilho do armazenamento de BLOBs.
Este artigo demonstra como executar manualmente uma função não disparada por HTTP por meio de solicitação
HTTP especialmente formatada.
Em alguns contextos, talvez seja necessário executar "sob demanda" uma Função do Azure disparada
indiretamente. Exemplos de gatilhos indiretos incluem funções em um agendamento ou funções que são
executadas como resultado da ação do outro recurso.
Postman é usado no exemplo a seguir, mas você pode usar cURL, Fiddler ou qualquer outro como a ferramenta
para enviar solicitações HTTP.
Nome de host: A localização pública do aplicativo de funções que é composta pelo nome do aplicativo de
funções mais azurewebsites.net ou seu domínio personalizado.
Caminho da pasta: Para acessar as funções não disparadas por HTTP por meio de uma solicitação HTTP,
você precisa enviar a solicitação por meio das pastas admin/funções.
Nome da função: O nome da função que você deseja executar.
Você pode usar esta localização de solicitação no Postman, juntamente com a chave mestra da função da
solicitação para o Azure para executar a função.
NOTE
Ao executar localmente, a chave mestra da função não é necessária. É possível chamar a função diretamente omitindo o
cabeçalho x-functions-key .
Devido às permissões elevadas no aplicativo de funções concedidas pela chave mestra, você não deve
compartilhar essa chave com terceiros nem distribuí-la em um aplicativo.
Chamar a função
Abra Postman e siga estas etapas:
1. Insira a localização de solicitação na caixa de texto URL.
2. Garanta que o método HTTP seja definido como POST.
3. Clique na guia Cabeçalhos.
4. Insira x-functions-key como a primeira chave e cole a chave mestra (da área de transferência) na caixa
valor.
5. Insira Content-Type como a segunda chave e insira application/json como o valor.
6. Clique na guia Corpo.
7. Insira { "input": "test" } como o corpo da solicitação.
8. Clique em Enviar.
O Postman então relata um status 202 Aceito.
Em seguida, volte à sua função no portal do Azure. Localize a janela Logs e verá mensagens provenientes da
chamada manual para a função.
Próximas etapas
Estratégias para testar seu código no Azure Functions
Depuração local do gatilho da Grade de Eventos do Azure Functions
Implantação contínua para Azure Functions
25/05/2018 • 6 minutes to read • Edit Online
Você pode usar Azure Functions para implantar o código continuamente usando a integração de controle do
código-fonte. A integração de controle do código-fonte habilita um fluxo de trabalho no qual uma atualização
de código dispara a implantação no Azure. Se você for novo no Azure Functions, comece analisando o Azure
Functions visão geral.
A implantação contínua é uma boa opção para projetos em que você integra contribuições múltiplas e
frequentes. Ao usar a implantação contínua, você mantém uma única fonte de verdade para seu código, o que
permite que as equipes colaborem facilmente. Você pode configurar a implantação contínua no Azure
Functions dos seguintes locais de código-fonte:
Azure Repos
GitHub
Bitbucket
A unidade de implantação para funções no Azure é o aplicativo de funções. Todas as funções em um aplicativo
de funções são implantadas ao mesmo tempo. Depois de habilitar a implantação contínua, o acesso ao código
de função no portal do Azure é configurado como somente leitura porque a fonte de verdade está definida
como em outro lugar.
FunctionApp
| - host.json
| - Myfirstfunction
| | - function.json
| | - ...
| - mysecondfunction
| | - function.json
| | - ...
| - SharedCode
| - bin
Na versão 2.x do tempo de execução de funções, todas as funções no aplicativo de funções devem
compartilhar a mesma pilha de linguagem.
O host. JSON arquivo contém configurações específicas de tempo de execução e está na pasta raiz do
aplicativo de funções. Um bin pasta contém pacotes e outros arquivos de biblioteca que requer que o
aplicativo de funções. Consulte os requisitos específicos a um idioma para um projeto de aplicativo de função:
Biblioteca de classes C# (.csproj)
Script do C# (.csx)
Script em F#
Java
JavaScript
Cenários de implantação
Mover as funções existentes para implantação contínua
Se você já escreveu funções no portal do Azure e deseja baixar o conteúdo do seu aplicativo antes de alternar
para a implantação contínua, vá para a guia visão geral do seu aplicativo de funções. Selecione o botão
baixar conteúdo do aplicativo .
NOTE
Depois de configurar a integração contínua, você não poderá mais editar seus arquivos de origem no portal do
functions.
Próximas etapas
Práticas recomendadas para o Azure Functions
Azure Functions slots de implantação
07/11/2019 • 15 minutes to read • Edit Online
Azure Functions slots de implantação permitem que seu aplicativo de funções execute diferentes instâncias
chamadas "Slots". Os slots são ambientes diferentes expostos por meio de um ponto de extremidade disponível
publicamente. Uma instância de aplicativo sempre é mapeada para o slot de produção e você pode trocar
instâncias atribuídas a um slot sob demanda. Os aplicativos de funções em execução no plano de serviço de
aplicativos podem ter vários slots, enquanto em consumo apenas um slot é permitido.
O seguinte reflete como as funções são afetadas por slots de permuta:
O redirecionamento de tráfego é contínuo; nenhuma solicitação foi descartada devido a uma troca.
Se uma função estiver em execução durante uma permuta, a execução continuará e os gatilhos subsequentes
serão roteados para a instância do aplicativo trocado.
NOTE
No momento, os slots não estão disponíveis para o plano de consumo do Linux.
Operações de permuta
Durante uma troca, um slot é considerado a origem e o outro destino. O slot de origem tem a instância do
aplicativo que é aplicada ao slot de destino. As etapas a seguir garantem que o slot de destino não experimente
tempo de inatividade durante uma troca:
1. Aplicar configurações: As configurações do slot de destino são aplicadas a todas as instâncias do slot de
origem. Por exemplo, as configurações de produção são aplicadas à instância de preparo. As configurações
aplicadas incluem as seguintes categorias:
Configurações do aplicativo e cadeias de conexão específicas do slot (se aplicável)
Configurações de implantação contínua (se habilitada)
Configurações de autenticação do serviço de aplicativo (se habilitado)
2. Aguarde as reinicializações e a disponibilidade: A permuta espera que cada instância no slot de origem
conclua sua reinicialização e esteja disponível para solicitações. Se alguma instância não for reiniciada, a
operação de permuta reverterá todas as alterações no slot de origem e interromperá a operação.
3. Roteamento de atualização: Se todas as instâncias no slot de origem forem ativadas com êxito, os dois
slots concluirão a permuta alternando as regras de roteamento. Após essa etapa, o slot de destino (por
exemplo, o slot de produção) tem o aplicativo que foi anteriormente ativado no slot de origem.
4. Repetir operação: Agora que o slot de origem tem o aplicativo de pré-permuta anteriormente no slot de
destino, execute a mesma operação aplicando todas as configurações e reiniciando as instâncias do slot de
origem.
Tenha em mente os seguintes pontos:
Em qualquer ponto da operação de permuta, a inicialização dos aplicativos trocados ocorre no slot de
origem. O slot de destino permanece online enquanto o slot de origem está sendo preparado, se a troca é
bem-sucedida ou falha.
Para trocar um slot de preparo pelo slot de produção, verifique se o slot de produção é sempre o slot de
destino. Dessa forma, a operação de permuta não afeta seu aplicativo de produção.
As configurações relacionadas a origens e associações de eventos precisam ser definidas como
configurações de slot de implantação antes de iniciar uma troca. Marcá-los como "adesivos"
antecipadamente garante que os eventos e as saídas sejam direcionados para a instância apropriada.
Gerenciar configurações
Quando você clona a configuração de outro slot de implantação, a configuração clonada é editável. Alguns
elementos de configuração seguem o conteúdo em uma permuta (não específico do slot), enquanto outros
elementos de configuração permanecem no mesmo slot após uma permuta (específica do slot). As listas a seguir
mostram as configurações que são alteradas quando você permuta os slots.
Configurações que são permutadas:
Configurações gerais, como versão do Framework, 32/64 bits, Web Sockets
Configurações do aplicativo (podem ser configuradas para serem transfixadas em um slot)
Cadeias de conexão (podem ser configuradas para aderir a um slot)
Mapeamentos de manipulador
Certificados públicos
Conteúdo de trabalhos Web
Conexões híbridas *
Integração de rede virtual *
Pontos de extremidade de serviço *
Rede de distribuição de conteúdo do Azure *
Os recursos marcados com um asterisco (*) estão planejados para serem desalternados.
Configurações que não são trocadas:
Pontos de extremidade de publicação
Nomes de domínio personalizados
Certificados não públicos e configurações de TLS/SSL
Configurações de escala
Agendadores de trabalhos Web
Restrições de IP
Sempre Ativo
Configurações do log de diagnóstico
CORS (compartilhamento de recursos entre origens)
NOTE
Determinadas configurações de aplicativo que se aplicam a configurações não alternadas também são trocadas. Por exemplo,
como as configurações de log de diagnóstico não são trocadas, as configurações de aplicativo relacionadas, como
WEBSITE_HTTPLOGGING_RETENTION_DAYS e DIAGNOSTICS_AZUREBLOBRETENTIONDAYS , também não são trocadas, mesmo que
elas não apareçam como configurações de slot.
Implantação
Os slots ficam vazios quando você cria um slot. Você pode usar qualquer uma das tecnologias de implantação com
suporte para implantar seu aplicativo em um slot.
Dimensionamento
Todos os slots são dimensionados para o mesmo número de trabalhadores que o slot de produção.
Para planos de consumo, o slot é dimensionado conforme o aplicativo de funções é dimensionado.
Para planos do serviço de aplicativo, o aplicativo é dimensionado para um número fixo de trabalhadores. Os
slots são executados no mesmo número de trabalhadores que o plano do aplicativo.
Adicionar um slot
Você pode adicionar um slot por meio da CLI ou por meio do Portal. As etapas a seguir demonstram como criar
um novo slot no Portal:
1. Navegue até seu aplicativo de funções e clique no sinal de adição ao lado de Slots.
Slots de permuta
Você pode trocar os slots por meio da CLI ou por meio do Portal. As etapas a seguir demonstram como trocar
slots no Portal:
1. Navegue até o aplicativo de funções
2. Clique no nome do slot de origem que você deseja alternar
3. Na guia visão geral , clique no botão alternar
Remover um slot
Você pode remover um slot por meio da CLI ou por meio do Portal. As etapas a seguir demonstram como
remover um slot no Portal:
1. Navegue até o aplicativo de funções visão geral
2. Clique no botão excluir
NOTE
Não é possível alterar o plano do serviço de aplicativo de um slot no plano de consumo.
Níveis de suporte
Há dois níveis de suporte para slots de implantação:
Disponibilidade geral (GA ) : suporte completo e aprovado para uso em produção.
Versão prévia: ainda não tem suporte, mas é esperado para alcançar o status de GA no futuro.
Próximas etapas
Tecnologias de implantação no Azure Functions
Entrega contínua usando o Azure DevOps
27/10/2019 • 8 minutes to read • Edit Online
Você pode implantar automaticamente sua função em um aplicativo Azure Functions usando Azure pipelines.
Você tem duas opções para definir seu pipeline:
Arquivo YAML: um arquivo YAML descreve o pipeline. O arquivo pode ter uma seção de etapas de
compilação e uma seção de versão. O arquivo YAML deve estar no mesmo repositório que o aplicativo.
Modelo: modelos são tarefas prontas que criam ou implantam seu aplicativo.
pool:
vmImage: 'VS2017-Win2016'
steps:
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
inputs:
command: publish
arguments: '--configuration Release --output publish_output'
projects: '*.csproj'
publishWebProjects: false
modifyOutputPath: true
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
name: 'drop'
JavaScript
Você pode usar o exemplo a seguir para criar um arquivo YAML para criar um aplicativo JavaScript:
pool:
vmImage: ubuntu-16.04 # Use 'VS2017-Win2016' if you have Windows native +Node modules
steps:
- bash: |
if [ -f extensions.csproj ]
then
dotnet build extensions.csproj --output ./bin
fi
npm install
npm run build --if-present
npm prune --production
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
name: 'drop'
Python
Você pode usar o exemplo a seguir para criar um arquivo YAML para criar um aplicativo Python. O Python tem
suporte apenas para Azure Functions Linux. O YAML para Python 3,7 pode ser criado substituindo todas as
instâncias de 3,6 por 3,7 neste YAML.
pool:
vmImage: ubuntu-16.04
steps:
- task: UsePythonVersion@0
displayName: "Setting python version to 3.6 as required by functions"
inputs:
versionSpec: '3.6'
architecture: 'x64'
- bash: |
if [ -f extensions.csproj ]
then
dotnet build extensions.csproj --output ./bin
fi
python3.6 -m venv worker_venv
source worker_venv/bin/activate
pip3.6 install setuptools
pip3.6 install -r requirements.txt
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
name: 'drop'
PowerShell
Você pode usar o exemplo a seguir para criar um arquivo YAML para empacotar um aplicativo PowerShell. O
PowerShell só tem suporte para o Windows Azure Functions.
pool:
vmImage: 'VS2017-Win2016'
steps:
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
name: 'drop'
steps:
- task: AzureFunctionApp@1
inputs:
azureSubscription: '<Azure service connection>'
appType: functionApp
appName: '<Name of function app>'
#Uncomment the next lines to deploy to a deployment slot
#deployToSlotOrASE: true
#resourceGroupName: '<Resource Group Name>'
#slotName: '<Slot name>'
steps:
- task: AzureFunctionApp@1
inputs:
azureSubscription: '<Azure service connection>'
appType: functionAppLinux
appName: '<Name of function app>'
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<Resource Group Name>'
#slotName: '<Slot name>'
Em alguns casos, os artefatos de compilação têm uma estrutura de pastas específica. Talvez seja necessário
selecionar a caixa de seleção nome da pasta raiz para caminhos de arquivo .
Aplicativos JavaScript
Se seu aplicativo JavaScript tiver uma dependência em módulos nativos do Windows, você deverá atualizar a
versão do pool do agente para o VS2017 hospedado.
Próximos passos
Examine a Azure Functions visão geral.
Examine a visão geral do Azure DevOps.
Entrega contínua usando a ação do GitHub
24/10/2019 • 7 minutes to read • Edit Online
As ações do GitHub permitem definir um fluxo de trabalho para criar e implantar automaticamente o código de
funções no aplicativo de funções no Azure.
IMPORTANT
No momento, as ações do GitHub estão em beta. Primeiro, você deve se inscrever para ingressar na versão prévia usando
sua conta do github.
Em ações do GitHub, um fluxo de trabalho é um processo automatizado que você define em seu repositório github.
Esse processo informa ao GitHub como criar e implantar seu projeto de aplicativo do Functions no GitHub.
Um fluxo de trabalho é definido por um arquivo YAML (. yml) no caminho /.github/workflows/ em seu
repositório. Essa definição contém as várias etapas e parâmetros que compõem o fluxo de trabalho.
Para um fluxo de trabalho Azure Functions, o arquivo tem três seções:
SECTION TAREFAS
Neste exemplo, substitua os espaços reservados no recurso por sua ID de assinatura, grupo de recursos e nome do
aplicativo de funções. A saída são as credenciais de atribuição de função que fornecem acesso ao seu aplicativo de
funções. Copie esse objeto JSON, que você pode usar para autenticar do GitHub.
NOTE
Você não precisará criar uma entidade de serviço se decidir usar o perfil de publicação para autenticação.
IMPORTANT
É sempre uma boa prática conceder acesso mínimo. É por isso que o escopo no exemplo anterior é limitado ao aplicativo de
funções específico e não ao grupo de recursos inteiro.
2. Use AZURE_CREDENTIALS para o nome e a saída do comando copiado para valor, se você selecionar
Adicionar segredo. Se você estiver usando o perfil de publicação, use SCM_CREDENTIALS para o nome e o
conteúdo do arquivo para valor.
O GitHub agora pode se autenticar no seu aplicativo de funções no Azure.
Configurar o ambiente
A configuração do ambiente pode ser feita usando uma das ações de instalação de publicação.
.NET actions/setup-dotnet
Java actions/setup-java
JavaScript actions/setup-node
Python actions/setup-python
Os exemplos a seguir mostram a parte do fluxo de trabalho que configura o ambiente para os vários idiomas com
suporte:
JavaScript
Python
.NET
Java
- name: 'Login via Azure CLI'
uses: Azure/actions/login@master
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Setup Java 1.8.x
uses: actions/setup-java@v1
with:
# If your pom.xml <maven.compiler.source> version is not in 1.8.x
# Please change the Java version to match the version in pom.xml <maven.compiler.source>
java-version: '1.8.x'
Python
.NET
Java
- name: 'Run mvn'
shell: bash
run: |
# If your function app project is not located in your repository's root
# Please change your directory for maven build in pushd
pushd . ./POM_ARTIFACT_ID
mvn clean package
mvn azure-functions:package
popd
PARÂMETRO EXPLICAÇÃO
Próximas etapas
Para exibir um Workflow. YAML completo, consulte um dos arquivos no repositório de exemplos de fluxo de
trabalho de ações do Azure GitHub que têm functionapp no nome. Você pode usar esses exemplos em um ponto
de partida para seu fluxo de trabalho.
Saiba mais sobre as ações do GitHub
Implantação de zip para o Azure Functions
07/11/2019 • 14 minutes to read • Edit Online
Este artigo descreve como implantar seus arquivos de projeto de aplicativo de função para o Azure de um
arquivo .zip (compactado). Você aprenderá a realizar uma implantação de envio por push, usando a CLI do Azure
e usando as APIs REST. As Ferramentas básicas do Azure Functions também usam essas APIs de implantação
ao publicar um projeto local no Azure.
O Azure Functions tem a gama completa de opções de implantação e integração contínuas que são fornecidas
pelo Serviço de Aplicativo do Azure. Para saber mais, confira Implantação contínua do Azure Functions.
Para acelerar o desenvolvimento, talvez você ache mais fácil implantar seus arquivos de projeto do aplicativo de
funções diretamente de um arquivo .zip. A API de implantação do .zip extrai o conteúdo de um arquivo .zip para a
pasta wwwroot do seu aplicativo de funções. Essa implantação de arquivo .zip usa o mesmo serviço Kudu que
alimenta implementações baseadas em integração contínua, incluindo:
Exclusão de arquivos que foram mantidos de implantações anteriores.
Personalização da implantação, incluindo execução de scripts de implantação.
Logs de implantação.
Gatilhos de função de sincronização em um aplicativo de funções de Plano de consumo.
Para obter mais informações, consulte a referência de implantação do .zip.
IMPORTANT
Quando você usa a implantação de .zip, todos os arquivos de uma implantação existente que não são encontrados no
arquivo .zip são excluídos do seu aplicativo de funções.
O código para todas as funções em um aplicativo de funções específico está localizado em uma pasta do projeto
raiz que contém um arquivo de configuração do host e uma ou mais subpastas. Cada subpasta contém o código
para uma função distinta. A estrutura de pastas é mostrada no seguinte representação:
FunctionApp
| - host.json
| - Myfirstfunction
| | - function.json
| | - ...
| - mysecondfunction
| | - function.json
| | - ...
| - SharedCode
| - bin
Na versão 2.x do tempo de execução de funções, todas as funções no aplicativo de funções devem compartilhar a
mesma pilha de linguagem.
O host. JSON arquivo contém configurações específicas de tempo de execução e está na pasta raiz do aplicativo
de funções. Um bin pasta contém pacotes e outros arquivos de biblioteca que requer que o aplicativo de funções.
Consulte os requisitos específicos a um idioma para um projeto de aplicativo de função:
Biblioteca de classes C# (.csproj)
Script do C# (.csx)
Script em F#
Java
JavaScript
Um aplicativo de funções contém todos os arquivos e pastas no diretório wwwroot . Uma implantação de arquivo.
zip inclui o conteúdo do diretório wwwroot , mas não o diretório em si. Ao implantar um projeto de biblioteca de
classes C#, você deve incluir os arquivos de biblioteca compilados e as dependências em uma subpasta bin em
seu pacote .zip.
O arquivo .zip baixado está no formato correto para ser republicado no seu aplicativo de funções
usando a implantação por push do .zip. O download do portal também pode adicionar os arquivos
necessários para abrir o aplicativo de funções diretamente no Visual Studio.
Usando APIs REST:
Use a seguinte API GET de implantação para baixar os arquivos de seu projeto <function_app> :
https://<function_app>.scm.azurewebsites.net/api/zip/site/wwwroot/
Incluir /site/wwwroot/ assegura que o arquivo zip inclua somente os arquivos de projeto do aplicativo de
funções e não todo o site. Se ainda não tiver se conectado ao Azure, será solicitado que você faça isso.
Você também pode baixar um arquivo .zip de um repositório do GitHub. Quando você baixa um repositório
GitHub como um arquivo .zip, o GitHub adiciona um nível extra de pasta para o branch. Esse nível extra de pasta
significa que você não pode implantar o arquivo .zip diretamente como baixou do GitHub. Se você estiver usando
um repositório GitHub para manter seu aplicativo de funções, você deve usar a integração contínua para
implantar seu aplicativo.
Esse comando implanta os arquivos de projeto do arquivo .zip baixado para seu aplicativo de funções no Azure.
Em seguida, ele reinicia o aplicativo. Para visualizar a lista de implantações para o aplicativo, é necessário usar as
APIs REST.
Quando você estiver usando a CLI do Azure em seu computador local, <zip_file_path> é o caminho para o
arquivo .zip em seu computador. Você também pode executar a CLI do Azure no Azure Cloud Shell. Quando
você usa o Cloud Shell, você deve primeiro carregar seu arquivo .zip de implantação para a conta do Azure Files
associada com o seu Cloud Shell. Nesse caso, <zip_file_path> é o local de armazenamento que a sua conta do
Cloud Shell usa. Para obter mais informações, consulte Persistir arquivos no Azure Cloud Shell.
Essa solicitação dispara a implantação de envio do arquivo .zip carregado. Você pode examinar as implantações
atuais e anteriores, usando o ponto de extremidade https://<app_name>.scm.azurewebsites.net/api/deployments ,
conforme mostrado no exemplo de cURL a seguir. Novamente, substitua <app_name> com o nome do seu
aplicativo e <deployment_user> com o nome de usuário de suas credenciais de implantação.
$username = "<deployment-user>"
$password = "<deployment-password>"
$apiUrl = "https://<app-name>.scm.azurewebsites.net/api/deployments"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,
$password)))
$userAgent = "powershell/1.0"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent
$userAgent -Method GET
Personalização da implantação
O processo de implantação presume que o arquivo .zip em que você efetua push contém um aplicativo pronto
para execução. Por padrão, nenhuma personalização é executada. Para habilitar os mesmos processos de
compilação que você obtém com a integração contínua, adicione o seguinte para as configurações do aplicativo:
SCM_DO_BUILD_DURING_DEPLOYMENT=true
Quando você usar a implantação por push do .zip, essa configuração é falsa por padrão. O padrão é verdadeiro
para implantações de integração contínua. Quando definido como verdadeiras, as configurações de implantação
são usadas durante a implantação. Você pode configurar essas configurações como configurações de aplicativo
ou em um arquivo de configuração de .deployment localizado na raiz do seu arquivo .zip. Para obter mais
informações, consulte Repositório e configurações relacionadas à implantação na referência de implantação.
Próximas etapas
Implantação contínua para Azure Functions
Executar o Azure Functions de um arquivo de
pacote
31/10/2019 • 6 minutes to read • Edit Online
No Azure, você pode executar suas funções diretamente de um arquivo de pacote de implantação no
aplicativo de funções. A outra opção é implantar os arquivos no diretório d:\home\site\wwwroot do
aplicativo de funções.
Este artigo descreve os benefícios de executar suas funções de um pacote. Ele também mostra como
habilitar essa funcionalidade em seu aplicativo de funções.
IMPORTANT
Ao implantar suas funções em um aplicativo de funções do Linux em um plano Premium, você deve sempre executar
a partir do arquivo de pacote e publicar seu aplicativo usando o Azure Functions Core Tools.
VALUE DESCRIÇÃO
Cau t i on
Ao executar um aplicativo de funções no Windows, a opção de URL externa gera um pior desempenho de
inicialização a frio. Ao implantar seu aplicativo de funções no Windows, você deve definir
WEBSITE_RUN_FROM_PACKAGE para 1 e publicar com a implantação do zip.
O exemplo a seguir mostra um aplicativo de funções configurado para ser executado de um arquivo .zip
hospedado no armazenamento de Blobs do Azure:
NOTE
No momento, apenas arquivos de pacote .zip têm suporte.
Solução de Problemas
Executar do pacote torna wwwroot somente leitura, portanto, você receberá um erro ao gravar arquivos
nesse diretório.
Não há suporte para formatos tar e gzip.
Esse recurso não compõe o cache local.
Para obter um desempenho de inicialização a frio aprimorado, use a opção de zip local (
WEBSITE_RUN_FROM_PACKAGE = 1 ).
Próximos passos
Implantação contínua para Azure Functions
Automatizar a implantação de recursos para seu
aplicativo de funções do Azure Functions
07/11/2019 • 18 minutes to read • Edit Online
Você pode usar um modelo do Azure Resource Manager para implantar um aplicativo de funções. Este artigo
descreve os recursos e os parâmetros necessários para fazer isso. Talvez seja necessário implantar recursos
adicionais, dependendo dos gatilhos e associações em seu aplicativo de funções.
Para saber mais sobre a criação de modelos, consulte Criação de modelos do Azure Resource Manager.
Para modelos de exemplo, consulte:
Aplicativo de funções no Plano de Consumo
Aplicativo de funções no Plano do Serviço de Aplicativo do Azure
Recursos necessários
Uma implantação Azure Functions normalmente consiste nesses recursos:
REFERÊNCIA DE SINTAXE E
RECURSO REQUISITO PROPRIEDADES
1 Um plano de hospedagem só é necessário quando você opta por executar seu aplicativo de funções em um
plano Premium (em versão prévia) ou em um plano do serviço de aplicativo.
TIP
Embora não seja necessário, é altamente recomendável que você configure Application Insights para seu aplicativo.
Conta de armazenamento
Uma conta de armazenamento do Azure é necessária para um aplicativo de funções. Você precisa de uma conta
de finalidade geral que dá suporte a blobs, tabelas, consultas e arquivos. Para saber mais, confira Requisitos da
conta de armazenamento do Azure Functions.
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[variables('storageAccountName')]",
"apiVersion": "2019-04-01",
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "[parameters('storageAccountType')]"
}
}
Além disso, a propriedade AzureWebJobsStorage deve ser especificada como uma configuração de aplicativo na
configuração do site. Se o aplicativo de função não usar o Application Insights para monitoramento, também
deverá especificar AzureWebJobsDashboard como uma configuração de aplicativo.
O tempo de execução do Azure Functions usa a cadeia de conexão AzureWebJobsStorage para criar filas internas.
Quando o Application Insights não estiver habilitado, o tempo de execução usará a cadeia de conexão
AzureWebJobsDashboard para fazer logon no armazenamento de Tabela do Azure e capacitar a guia Monitor no
portal.
Essas propriedades são especificadas na coleção appSettings no objeto siteConfig :
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'),
';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
},
{
"name": "AzureWebJobsDashboard",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'),
';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
}
]
Application Insights
Application Insights é recomendado para monitorar seus aplicativos de funções. O recurso Application Insights é
definido com o tipo Microsoft. insights/Components e o tipo Web:
{
"apiVersion": "2015-05-01",
"name": "[variables('appInsightsName')]",
"type": "Microsoft.Insights/components",
"kind": "web",
"location": "[resourceGroup().location]",
"tags": {
"[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/',
variables('functionAppName'))]": "Resource"
},
"properties": {
"Application_Type": "web",
"ApplicationId": "[variables('functionAppName')]"
}
},
Além disso, a chave de instrumentação precisa ser fornecida ao aplicativo de funções usando a configuração de
aplicativo APPINSIGHTS_INSTRUMENTATIONKEY . Essa propriedade é especificada na coleção appSettings no objeto
siteConfig :
"appSettings": [
{
"name": "APPINSIGHTS_INSTRUMENTATIONKEY",
"value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')),
'2015-05-01').InstrumentationKey]"
}
]
Plano de hospedagem
A definição do plano de hospedagem varia e pode ser uma das seguintes:
Plano de consumo (padrão)
Plano Premium (em versão prévia)
Plano do Serviço de Aplicativo
Aplicativo de funções
O recurso de aplicativo de funções é definido usando um recurso do tipo Microsoft. Web/sites e o tipo
functionapp:
{
"apiVersion": "2015-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"location": "[resourceGroup().location]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
"[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
]
IMPORTANT
Se você estiver definindo explicitamente um plano de hospedagem, um item adicional será necessário na matriz de
dependências: "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
AzureWebJobsStorage Uma cadeia de conexão para uma conta Consulte a conta de armazenamento
de armazenamento que o tempo de
execução do Functions para a fila
interna
FUNCTIONS_WORKER_RUNTIME A pilha de idiomas a ser usada para dotnet , node , java ou python
funções neste aplicativo
{
"type":"Microsoft.Web/serverfarms",
"apiVersion":"2016-09-01",
"name":"[variables('hostingPlanName')]",
"location":"[resourceGroup().location]",
"properties":{
"name":"[variables('hostingPlanName')]",
"computeMode":"Dynamic"
},
"sku":{
"name":"Y1",
"tier":"Dynamic",
"size":"Y1",
"family":"Y",
"capacity":0
}
}
NOTE
O plano de consumo não pode ser explicitamente definido para Linux. Ele será criado automaticamente.
Se você definir explicitamente seu plano de consumo, será necessário definir a propriedade serverFarmId no
aplicativo para que ele aponte para a ID de recurso do plano. Você deve garantir que o aplicativo de funções
também tenha uma configuração dependsOn para o plano.
Criar um aplicativo de funções
Windows
No Windows, um plano de consumo requer duas configurações adicionais na configuração do site:
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING e WEBSITE_CONTENTSHARE . Essas propriedades configuram a conta de
armazenamento e o caminho do arquivo em que o código e as configurações do aplicativo de funções estão
armazenados.
{
"apiVersion": "2016-03-01",
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"location": "[resourceGroup().location]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-
preview').key1)]"
},
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-
preview').key1)]"
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "[toLower(variables('functionAppName'))]"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "10.14.1"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2"
}
]
}
}
}
Linux
No Linux, o aplicativo de funções deve ter seu kind definido como functionapp,linux e deve ter a propriedade
reserved definida como true :
{
"apiVersion": "2016-03-01",
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"location": "[resourceGroup().location]",
"kind": "functionapp,linux",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountName'),'2015-05-01-
preview').key1)]"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "10.14.1"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2"
}
]
},
"reserved": true
}
}
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2015-04-01",
"name": "[variables('hostingPlanName')]",
"location": "[resourceGroup().location]",
"properties": {
"name": "[variables('hostingPlanName')]",
"sku": "EP1"
}
}
{
"apiVersion": "2016-03-01",
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"location": "[resourceGroup().location]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-
preview').key1)]"
},
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-
preview').key1)]"
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "[toLower(variables('functionAppName'))]"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "10.14.1"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2"
}
]
}
}
}
Para executar seu aplicativo no Linux, você também deve definir o kind como Linux :
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2018-02-01",
"name": "[variables('hostingPlanName')]",
"location": "[resourceGroup().location]",
"kind": "Linux",
"sku": {
"name": "S1",
"tier": "Standard",
"size": "S1",
"family": "S",
"capacity": 1
}
}
Os aplicativos do Linux também devem incluir uma propriedade linuxFxVersion em siteConfig . Se você estiver
apenas implantando o código, o valor para isso será determinado pela pilha de tempo de execução desejada:
Python DOCKER|microsoft/azure-functions-python3.6:2.0
JavaScript DOCKER|microsoft/azure-functions-node8:2.0
.NET DOCKER|microsoft/azure-functions-dotnet-core2.0:2.0
{
"apiVersion": "2016-03-01",
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"location": "[resourceGroup().location]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-
preview').key1)]"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "10.14.1"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2"
}
],
"linuxFxVersion": "DOCKER|microsoft/azure-functions-node8:2.0"
}
}
}
Se você estiver implantando uma imagem de contêiner personalizada, deverá especificá-la com linuxFxVersion e
incluir a configuração que permite que a imagem seja puxada, como em aplicativo Web para contêineres. Além
disso, defina WEBSITES_ENABLE_APP_SERVICE_STORAGE como false , já que o conteúdo do aplicativo é fornecido no
próprio contêiner:
{
"apiVersion": "2016-03-01",
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"location": "[resourceGroup().location]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-
preview').key1)]"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "10.14.1"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2"
},
{
"name": "DOCKER_REGISTRY_SERVER_URL",
"value": "[parameters('dockerRegistryUrl')]"
},
{
"name": "DOCKER_REGISTRY_SERVER_USERNAME",
"value": "[parameters('dockerRegistryUsername')]"
},
{
"name": "DOCKER_REGISTRY_SERVER_PASSWORD",
"value": "[parameters('dockerRegistryPassword')]"
},
{
"name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
"value": "false"
}
],
"linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag"
}
}
}
Implantar o modelo
Você pode usar qualquer uma das seguintes maneiras para implantar o modelo:
PowerShell
CLI do Azure
Portal do Azure
API REST
Botão Implantar no Azure
Substitua <url-encoded-path-to-azuredeploy-json> por uma versão codificada de URL do caminho bruto de seu
azuredeploy.json arquivo no GitHub.
[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)]
(https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)
<a href="https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>"
target="_blank"><img src="https://azuredeploy.net/deploybutton.png"></a>
# Create the parameters for the file, which for this template is the function app name.
$TemplateParams = @{"appName" = "<function-app-name>"}
Para testar essa implantação, você pode usar um modelo como este que cria um aplicativo de funções no
Windows em um plano de consumo. Substitua <function-app-name> por um nome exclusivo para seu aplicativo
de funções.
Próximas etapas
Saiba mais sobre como desenvolver e configurar o Azure Functions.
Referência do desenvolvedor do Azure Functions
Como definir configurações do aplicativo de funções do Azure
Como criar a sua primeira função do Azure
Instale a versão prévia 2 do Azure Functions Runtime
26/10/2019 • 9 minutes to read • Edit Online
IMPORTANT
O Azure Functions Runtime preview 2 oferece suporte somente a versão 1.x do tempo de execução do Azure Functions. Esse
recurso de visualização não está sendo atualizado para dar suporte à versão 2.x do tempo de execução e nenhuma
atualização futura planejados. Se você precisa para hospedar o tempo de execução de funções do Azure fora do Azure,
considere usando o Azure Functions no Kubernetes com KEDA
Se você quiser instalar a versão prévia 2 do Azure Functions Runtime, execute estas etapas:
1. Certifique-se de que sua máquina atenda aos requisitos mínimos.
2. Baixe o Instalador da visualização do Azure Functions Runtime.
3. Desinstale a versão prévia 1 do Azure Functions Runtime.
4. Instale a versão prévia 2 do Azure Functions Runtime.
5. Conclua a configuração da versão prévia 2 do Azure Functions Runtime.
6. Criar sua primeira função na versão prévia do Azure Functions Runtime
Pré-requisitos
Antes de instalar a visualização do Azure Functions Runtime, você deve ter os seguintes recursos disponíveis:
1. Um computador executando o Microsoft Windows Server 2016 ou a Atualização do Microsoft Windows 10
para Criadores (Professional ou Enterprise Edition).
2. Uma instância do SQL Server em execução em sua rede. O requisito mínimo de edição é o SQL Server Express.
NOTE
Você pode instalar a Função de trabalho do Functions em muitos outros computadores. Para fazer isso, siga estas
instruções e só selecione a Função de trabalho do Functions no instalador.
5. Clique em Avançar para que o Assistente de instalação do Tempo de Execução do Azure Functions
comece o processo de instalação no seu computador.
6. Após a conclusão, o assistente de instalação inicia a ferramenta de configuração do Azure Functions
Runtime.
NOTE
Se você estiver instalando no Windows 10 e o recurso Contêiner não tiver sido habilitado, a Configuração do
Azure Functions Runtime solicitará a reinicialização do computador para concluir a instalação.
2. Clique na guia Banco de Dados, insira os detalhes de conexão para a instância do SQL Server, incluindo a
especificação de uma chave mestra de banco de dadose clique em Aplicar. A conectividade com uma
instância do SQL Server é necessária para que o Azure Functions Runtime crie um banco de dados a fim de
dar suporte ao Runtime.
3. Clique na guia Credenciais. Aqui, você deve criar duas novas credenciais para uso com um
compartilhamento de arquivos para hospedar todos os seus aplicativos de funções. Especifique combinações
de Nome de usuário e Senha para o proprietário do compartilhamento de arquivo e para o usuário
do compartilhamento de arquivo e clique em Aplicar.
4. Clique na guia Compartilhamento de Arquivos. Aqui, você deve especificar os detalhes do local do
compartilhamento de arquivos. O compartilhamento de arquivos pode ser criado para você, ou você pode
usar um Compartilhamento de Arquivo existente e clicar em Aplicar. Se você selecionar um novo local de
Compartilhamento de Arquivos, especifique um diretório para ser usado pelo Azure Functions Runtime.
5. Clique na guia IIS. Essa guia mostra os detalhes dos sites no IIS que serão criados pela ferramenta de
configuração do Azure Functions Runtime. Você pode especificar um nome DNS personalizado aqui para o
portal da versão prévia do Azure Functions Runtime. Clique em Aplicar para concluir.
6. Clique na guia Serviços. Essa guia mostra o status dos serviços em sua instalação do Tempo de Execução
do Azure Functions. Se o Serviço de Ativação de Host do Azure Functions não estiver em execução após
a configuração inicial, clique em Iniciar Serviço.
7. Navegue até o Portal do Azure Functions Runtime como https://<machinename>.<domain>/ .
2. Você será solicitado a Entrar; se implantado em um domínio, use seu nome de usuário da conta do domínio
e a senha. Caso contrário, use seu nome de usuário de conta local e a senha para fazer logon no portal.
3. Para criar aplicativos de funções, você deve criar uma assinatura. No canto superior esquerdo do portal,
clique na + opção ao lado das assinaturas.
5. Todos os seus aplicativos de funções estão listados no painel esquerdo do portal. Para criar um novo
aplicativo de funções, selecione o título Aplicativo de Funções e clique na opção + .
6. Insira um nome para seu aplicativo de funções, selecione a assinatura correta, escolha a versão do Azure
Functions Runtime que deseja programar e clique em Criar
7. Seu novo aplicativo de funções está listado no painel esquerdo do portal. Selecione Functions e clique em
Nova Função na parte superior do painel central no portal.
8. Selecione a função Gatilho de Temporizador, no submenu direito, nomeie sua função e altere o
Agendamento para */5 * * * * * (essa expressão cron faz com que a função de temporizador seja
executada a cada cinco segundos) e clique em Criar
9. A função foi criada. Você pode exibir o log de execução do seu aplicativo de funções expandindo o painel log
na parte inferior do portal.
Gerenciar seu aplicativo de funções
08/11/2019 • 10 minutes to read • Edit Online
No Azure Functions, um aplicativo de funções fornece o contexto de execução para suas funções individuais. Os
comportamentos do aplicativo de funções se aplicam a todas as funções hospedadas por um aplicativo função de
determinada. Todas as funções em um aplicativo de funções devem ser do mesmo idioma.
As funções individuais em um aplicativo de funções são implantadas juntas e dimensionadas juntas. Todas as
funções no mesmo aplicativo de funções compartilham recursos, por instância, à medida que o aplicativo de
funções é dimensionado.
Cadeias de conexão, variáveis de ambiente e outras configurações de aplicativo são definidas separadamente para
cada aplicativo de funções. Todos os dados que devem ser compartilhados entre os aplicativos de funções devem
ser armazenados externamente em um repositório persistente.
Este artigo descreve como configurar e gerenciar seus aplicativos de funções.
TIP
Muitas opções de configuração também podem ser gerenciadas usando o CLI do Azure.
Você pode navegar até tudo o que precisa para gerenciar seu aplicativo de funções na página Visão geral, em
particular as configurações do aplicativo e os recursos da plataforma .
Configurações do aplicativo
A guia configurações do aplicativo mantém as configurações que são usadas pelo seu aplicativo de funções.
Essas configurações são armazenadas criptografadas e você deve selecionar Mostrar valores para ver os valores
no Portal. Você também pode acessar as configurações do aplicativo usando o CLI do Azure.
Portal
Para adicionar uma configuração no portal, selecione nova configuração de aplicativo e adicione o novo par
chave-valor.
CLI do Azure
O az functionapp config appsettings list comando retorna as configurações de aplicativo existentes, como no
exemplo a seguir:
O az functionapp config appsettings set comando adiciona ou atualiza uma configuração de aplicativo. O
exemplo a seguir cria uma configuração com uma chave CUSTOM_FUNCTION_APP_SETTING chamada e um valor 12345
de:
Recursos da plataforma
Aplicativos de funções executados e mantidos pela plataforma de Serviço de Aplicativo do Azure. Dessa forma,
seus aplicativos de funções têm acesso à maioria dos recursos da principal plataforma de hospedagem na Web do
Azure. Na guia Recursos da plataforma você acessa vários recursos da plataforma de Serviço de Aplicativo para
uso em seus aplicativos de funções.
NOTE
Nem todos os recursos do Serviço de Aplicativo estão disponíveis quando um aplicativo de funções é executado no plano de
hospedagem de Consumo.
O restante deste artigo se concentra nos seguintes recursos do serviço de aplicativo no portal do Azure que são
úteis para as funções do:
Editor do Serviço de Aplicativo
Console
Ferramentas avançadas (Kudu)
Opções de implantação
CORS
Autenticação
Para saber mais sobre como trabalhar com configurações da Serviço de Aplicativo, confira Definir configurações
do Serviço de Aplicativo do Azure.
Editor de Serviço de Aplicativo
O Editor do Serviço de Aplicativo é um editor avançado dentro do portal que você pode usar para modificar
arquivos de configuração JSON e arquivos de código. Escolher essa opção inicia uma nova guia do navegador
com um editor básico. Isso permite que você se integre ao repositório do Git, execute e depure código, além de
modificar as configurações do aplicativos de funções. Esse editor fornece um ambiente de desenvolvimento
aprimorado para suas funções comparadas com o editor de funções interno.
Recomendamos que você considere o desenvolvimento de suas funções no computador local. Quando você
desenvolve localmente e publica no Azure, seus arquivos de projeto são somente leitura no Portal. Para saber
mais, confira código e teste Azure Functions localmente.
Console
O console no portal é uma ferramenta ideal de desenvolvimento quando você preferir interagir com seu aplicativo
de funções na linha de comando. Os comandos comuns incluem criação e navegação de diretório e arquivo, bem
como execução scripts e arquivos em lote.
Ao desenvolver localmente, é recomendável usar o Azure Functions Core Tools e o CLI do Azure.
Ferramentas avançadas (Kudu)
As ferramentas avançadas para o Serviço de Aplicativo (também conhecidas como Kudu) fornecem acesso a
recursos administrativos avançados de seu aplicativo de funções. No Kudu, você pode gerenciar informações do
sistema, configurações do aplicativo, variáveis de ambiente, extensões do site, cabeçalhos HTTP e variáveis de
servidor. Você também pode iniciar o Kudu navegando até o ponto de extremidade SCM de seu aplicativo de
funções, como https://<myfunctionapp>.scm.azurewebsites.net/
Centro de implantação
Quando você usa uma solução de controle do código-fonte para desenvolver e manter seu código de funções, a
central de implantação permite criar e implantar a partir do controle do código-fonte. Seu projeto é compilado e
implantado no Azure quando você faz atualizações. Para obter mais informações, consulte tecnologias de
implantação no Azure Functions.
Compartilhamento de recursos entre origens
Para evitar a execução de código mal-intencionado no cliente, os navegadores modernos bloqueiam solicitações
de aplicativos Web para recursos em execução em um domínio separado. O CORS (compartilhamento de
recursos entre origens) permite Access-Control-Allow-Origin que um cabeçalho declare quais origens têm
permissão para chamar pontos de extremidade em seu aplicativo de funções.
Portal
Quando você configura a lista de origens permitidas para seu aplicativo de Access-Control-Allow-Origin
funções, o cabeçalho é automaticamente adicionado a todas as respostas de pontos de extremidade http em seu
aplicativo de funções.
Quando o curinga ( * ) é usado, todos os outros domínios são ignorados.
Use o az functionapp cors add comando para adicionar um domínio à lista de origens permitidas. O exemplo a
seguir adiciona o domínio contoso.com:
Use o az functionapp cors show comando para listar as origens permitidas atualmente.
Autenticação
Quando as funções usam um gatilho HTTP, você pode exigir que as chamadas sejam autenticadas primeiro. O
serviço de aplicativo dá suporte à autenticação Azure Active Directory e a entrar com provedores sociais, como
Facebook, Microsoft e Twitter. Para obter detalhes sobre como configurar provedores de autenticação específicos,
consulte Visão geral de autenticação do serviço de aplicativo do Azure.
Próximas etapas
Definir configurações do Serviço de Aplicativo do Azure
Implantação contínua para Azure Functions
Como direcionar Azure Functions versões de tempo
de execução
01/11/2019 • 8 minutes to read • Edit Online
Um aplicativo de funções é executado em uma versão específica do tempo de execução de Azure Functions. Há
duas versões principais: 1. x e 2. x, com a versão 3. x na visualização. Por padrão, os aplicativos de funções que
são criados versão 2. x do tempo de execução. Este artigo explica como configurar um aplicativo de funções no
Azure para ser executado na versão que você escolher. Para obter informações sobre como configurar um
ambiente de desenvolvimento local para uma versão específica, consulte código e teste Azure Functions
localmente.
NOTE
Se você fixar em uma versão específica do Azure Functions e tentar publicar no Azure usando o Visual Studio, uma janela
de diálogo será exibida solicitando que você atualize para a versão mais recente ou cancele a publicação. Para evitar isso,
adicione a propriedade <DisableFunctionExtensionVersionUpdate>true</DisableFunctionExtensionVersionUpdate>
em seu arquivo de .csproj .
Quando uma nova versão estiver disponível publicamente, um prompt no portal lhe dará a chance de se mover
para essa versão. Depois de mover para uma nova versão, você sempre pode usar a configuração
FUNCTIONS_EXTENSION_VERSION aplicativo para voltar para uma versão anterior.
A tabela a seguir mostra os valores de FUNCTIONS_EXTENSION_VERSION para cada versão principal para habilitar as
atualizações automáticas:
3. x (visualização) ~3
2. x ~2
1.x ~1
Uma alteração na versão de tempo de execução faz com que um aplicativo de funções seja reiniciado.
IMPORTANT
Embora a versão de tempo de execução seja determinada pela configuração de FUNCTIONS_EXTENSION_VERSION , você
deve fazer essa alteração na portal do Azure e não alterando a configuração diretamente. Isso ocorre porque o portal
valida as alterações e faz outras alterações relacionadas, conforme necessário.
da portal do Azure
Use o procedimento a seguir para exibir e atualizar a versão de tempo de execução usada no momento por um
aplicativo de funções.
1. No portal do Azure, navegue até o aplicativo de funções.
2. Em Recursos Configurados, escolha Configurações do aplicativo de funções.
NOTE
Usando o portal do Azure, você não pode alterar a versão de tempo de execução de um aplicativo de funções que já
contém funções.
Da CLI do Azure
Você também pode exibir e definir o FUNCTIONS_EXTENSION_VERSION do CLI do Azure.
NOTE
Como outras configurações podem ser afetadas pela versão de tempo de execução, você deve alterar a versão no Portal. O
portal automaticamente faz as outras atualizações necessárias, como a versão do node. js e a pilha de tempo de execução,
quando você altera as versões de tempo de execução.
Usando o CLI do Azure, exiba a versão de tempo de execução atual com o comando AZ functionapp config
appSettings Set .
Nesse código, substitua <function_app> pelo nome do seu aplicativo de funções. Substitua também
<my_resource_group> pelo nome do grupo de recursos para seu aplicativo de funções.
Você verá a FUNCTIONS_EXTENSION_VERSION na seguinte saída, que foi truncada para maior clareza:
[
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"slotSetting": false,
"value": "~2"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"slotSetting": false,
"value": "dotnet"
},
...
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"slotSetting": false,
"value": "8.11.1"
}
]
Substitua <function_app> pelo nome do seu aplicativo de funções. Substitua também <my_resource_group> pelo
nome do grupo de recursos para seu aplicativo de funções. Além disso, substitua <version> por uma versão
válida do tempo de execução 1. x ou ~2 para a versão 2. x.
Você pode executar esse comando no Azure cloud Shell escolhendo experimentar no exemplo de código
anterior. Você também pode usar o CLI do Azure localmente para executar esse comando depois de executar AZ
login para entrar.
Próximos passos
Direcione o tempo de execução de 2,0 em seu ambiente de desenvolvimento local
Consulte notas de versão para versões de tempo de execução
Instalar ou atualizar manualmente as extensões de
associação do Azure Functions no portal
24/10/2019 • 3 minutes to read • Edit Online
O tempo de execução do Azure Functions versão 2.x usa extensões de associação para implementar código a
gatilhos e associações. As extensões de associação são fornecidas nos pacotes NuGet. Registrar uma extensão é
basicamente instalar um pacote. Ao desenvolver funções, a maneira de instalar as extensões de associação
depende do ambiente de desenvolvimento. Para obter mais informações, consulte Registrar extensões de
associação no artigo de gatilhos e associações.
Às vezes, é necessário instalar ou atualizar manualmente as extensões de associação no portal do Azure. Por
exemplo, talvez seja necessário atualizar uma associação registrada para uma versão mais recente. Também
pode ser necessário registrar uma associação com suporte que não pode ser instalada na guia Integrar no
portal.
8. Retorne à guia Visão geral no portal, escolha Iniciar para iniciar o aplicativo de funções.
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Como desabilitar funções no Azure Functions
24/10/2019 • 6 minutes to read • Edit Online
Este artigo explica como desabilitar uma função no Azure Functions. Desabilitar significa fazer com que o tempo
de execução igore o gatilho automático que está definido para a função. A maneira de fazer isso depende da
versão de tempo de execução e a linguagem de programação:
Funções 2. x:
Uma maneira para todos os idiomas
Modo opcional para bibliotecas de classes do C#
Funções 1. x:
Linguagens de script
Biblioteca de Classes C#
Para reabilitar a função, execute novamente o mesmo comando com um valor de false .
Portal
Você também pode usar o Estado da Função ativar a guia Gerenciar da função. A opção funciona criando e
excluindo o AzureWebJobs.<FUNCTION_NAME>.Disabled configuração de aplicativo.
Functions 2.x - bibliotecas de classes do C#
Em uma biblioteca de classes do Functions 2.x, é recomendável que você use o método que funciona para todos os
idiomas. Mas se você preferir, você pode usar o atributo desabilitar como no Functions 1.x.
{
"bindings": [
{
"type": "queueTrigger",
"direction": "in",
"name": "myQueueItem",
"queueName": "myqueue-items",
"connection":"MyStorageConnectionAppSetting"
}
],
"disabled": true
}
ou
"bindings": [
...
],
"disabled": "IS_DISABLED"
No segundo exemplo, a função está desabilitada quando há uma configuração de aplicativo chamada
IS_DISABLED e é definida como true ou 1.
Você pode editar o arquivo no portal do Azure ou usar o Estado da Função ative a função da guia Gerenciar. A
opção portal funciona, alterando o arquivo function.json.
O atributo sem parâmetro de construtor exige que você recompilar e reimplanta o projeto para alterar o estado de
desabilitado da função. Uma maneira mais flexível para usar o atributo deve incluir um parâmetro de construtor
que se refere a uma configuração de aplicativo booliano, conforme mostrado no exemplo a seguir:
Esse método permite habilitar e desabilitar a função, alterando a configuração de aplicativo, sem recompilar ou
reinstalar. Alterar uma configuração de aplicativo faz com que o aplicativo de funções seja reiniciado, portanto, a
alteração de estado desabilitado é reconhecida imediatamente.
IMPORTANT
O Disabled atributo é a única maneira de desabilitar uma função de biblioteca de classe. Gerado o arquivo function. JSON
para uma função de biblioteca de classe não se destina a ser editado diretamente. Se você editar esse arquivo, tudo o que
faria para a disabled propriedade não terá efeito.
O mesmo vale para o estado de função ative a guia Gerenciar, assim que funcionar, alterando o arquivo Function. JSON.
Além disso, observe que o portal pode indicar que a função está desabilitada quando não estiver.
Próximas etapas
Este artigo trata-se como desabilitar disparadores automáticos. Para obter mais informações, consulte Gatilhos e
associações de armazenamento de Blobs.
Azure Functions recuperação de desastres
geograficamente
07/11/2019 • 7 minutes to read • Edit Online
Quando todas as regiões ou datacenters do Azure têm experiência com tempo de inatividade, é fundamental para a
computação continuar o processamento em uma região diferente. Este artigo explicará algumas das estratégias que
você pode usar para implantar funções para permitir a recuperação de desastres.
Conceitos básicos
Azure Functions executado em uma região específica. Para obter maior disponibilidade, você pode implantar as
mesmas funções em várias regiões. Quando em várias regiões, você pode ter suas funções em execução no padrão
ativo/ativo ou no padrão ativo/passivo .
Ativa/ativa. Ambas as regiões estão ativas e recebendo eventos (duplicados ou rotacionalmente). Ativo/ativo é
recomendado para funções HTTPS em combinação com a porta frontal do Azure.
Ativo/passivo. Uma região está ativa e recebendo eventos, enquanto um secundário está ocioso. Quando o
failover é necessário, a região secundária é ativada e assume o processamento. Isso é recomendado para
funções não HTTP, como barramento de serviço e hubs de eventos.
Leia como executar aplicativos em várias regiões para obter mais informações sobre implantações de várias
regiões.
Antes do failover, os editores que enviarem para o alias compartilhado rotearão para o Hub de eventos primário. O
aplicativo de funções primário está ouvindo exclusivamente o Hub de eventos primário. O aplicativo de funções
secundário será passivo e ocioso. Assim que o failover for iniciado, os Publicadores que enviarem para o alias
compartilhado agora serão roteados para o Hub de eventos secundário. O aplicativo de função secundário agora
ficará ativo e começará a disparar automaticamente. O failover efetivo para uma região secundária pode ser
totalmente controlado do hub de eventos, com as funções se tornando ativas somente quando o respectivo Hub de
eventos estiver ativo.
Leia mais sobre informações e considerações sobre failover com o barramento de serviço e os hubs de eventos.
Próximas etapas
Criar porta frontal do Azure
Considerações sobre failover de hubs de eventos
Monitorar Azure Functions
07/11/2019 • 39 minutes to read • Edit Online
O Azure Functions oferece integração interna com informações de aplicativo Azure para monitorar
funções. Este artigo mostra como configurar Azure Functions para enviar arquivos de log gerados
pelo sistema para Application Insights.
É recomendável usar Application Insights porque coleta dados de log, desempenho e erro. Ele detecta
automaticamente anomalias de desempenho e inclui poderosas ferramentas de análise para ajudá-lo
a diagnosticar problemas e a entender como suas funções são usadas. Ele foi projetado para ajudar
você a aprimorar continuamente o desempenho e a usabilidade do seu aplicativo. Você pode até
mesmo usar Application Insights durante o desenvolvimento do projeto de aplicativo de função local.
Para obter mais informações, consulte o que é Application insights?.
Como a instrumentação de Application Insights necessária é incorporada ao Azure Functions, tudo o
que você precisa é de uma chave de instrumentação válida para conectar seu aplicativo de funções a
um recurso de Application Insights.
2. Selecione Atualizar periodicamente, até que a lista de invocações de função seja exibida.
Pode levar até cinco minutos para que a lista seja exibida enquanto o cliente de telemetria
batche dados para transmissão para o servidor. (O atraso não se aplica ao Live Metrics Stream.
Esse serviço se conecta ao host de Funções quando você carrega a página, logo os logs são
transmitidos diretamente para a página.)
3. Para ver os logs de uma invocação de função específica, selecione o link da coluna Data para a
invocação.
A saída de logs para essa invocação aparece em uma nova página.
Você pode ver que ambas as páginas têm uma execução no Application insights link para a
consulta Application insights Analytics que recupera os dados.
A consulta a seguir é exibida. Você pode ver que a lista de invocação está limitada aos últimos 30 dias.
A lista mostra no máximo 20 linhas ( where timestamp > ago(30d) | take 20 ). A lista de detalhes de
invocação é para os últimos 30 dias sem nenhum limite.
Para obter mais informações, consulte Dados de telemetria da consulta a seguir neste artigo.
Para obter informações sobre como usar o Application Insights, consulte a documentação do o
Application Insights. Esta seção mostra alguns exemplos de como exibir dados no Application
Insights. Se você já estiver familiarizado com o Application Insights, poderá ir diretamente para as
seções sobre como configurar e personalizar os dados de telemetria.
As áreas de Application Insights a seguir podem ser úteis ao avaliar o comportamento, o
desempenho e os erros em suas funções:
TAB DESCRIÇÃO
Live Metrics Stream Exiba os dados de métricas conforme eles são criados
em tempo real.
requests
| where timestamp > ago(30m)
| summarize count() by cloud_RoleInstance, bin(timestamp, 1m)
| render timechart
As tabelas disponíveis são mostradas na guia esquema à esquerda. Você pode encontrar os dados
gerados por invocações de função nas tabelas a seguir:
TABELA DESCRIÇÃO
TABELA DESCRIÇÃO
As outras tabelas são para testes de disponibilidade e telemetria de cliente e navegador. Você pode
implementar a telemetria personalizada para adicionar dados a ela.
Dentro de cada tabela, alguns dos dados específicos do Functions estão em um campo
customDimensions . Por exemplo, a consulta a seguir recupera todos os rastreamentos que têm o nível
de log Error .
traces
| where customDimensions.LogLevel == "Error"
LOGLEVEL CODIFICAR
Rastreamento 0
Depuração 1
Informações 2
Aviso 3
Erro 4
Crítico 5
Nenhum 6
{
"logging": {
"fileLoggingMode": "always",
"logLevel": {
"default": "Information",
"Host.Results": "Error",
"Function": "Error",
"Host.Aggregator": "Trace"
}
}
}
Versão 1.x
{
"logger": {
"categoryFilter": {
"defaultLevel": "Information",
"categoryLevels": {
"Host.Results": "Error",
"Function": "Error",
"Host.Aggregator": "Trace"
}
}
}
}
Se host. JSON incluir várias categorias que comecem com a mesma cadeia de caracteres, será feito
primeiro a correspondência com as mais longas. Suponha que você queira tudo do tempo de
execução, exceto Host.Aggregator para fazer logon no nível Error , mas deseja que Host.Aggregator
Faça logon no nível Information :
Versão 2.x
{
"logging": {
"fileLoggingMode": "always",
"logLevel": {
"default": "Information",
"Host": "Error",
"Function": "Error",
"Host.Aggregator": "Information"
}
}
}
Versão 1.x
{
"logger": {
"categoryFilter": {
"defaultLevel": "Information",
"categoryLevels": {
"Host": "Error",
"Function": "Error",
"Host.Aggregator": "Information"
}
}
}
}
Para suprimir todos os logs para uma categoria, você pode usar o nível de log None . Nenhum log é
gravado com essa categoria e não há nenhum nível de registro acima dele.
As seções a seguir descrevem as principais categorias de logs que o runtime cria.
Categoria Host.Results
Esses logs aparecem como "solicitações" no Application Insights. Elas indicam o sucesso ou a falha de
uma função.
Todos esses logs são gravados no nível Information . Se você filtrar em Warning ou acima, não verá
nenhum desses dados.
Categoria Host.Aggregator
Esses logs fornecem contagens e médias de chamadas de função sobre um período configurável. O
período padrão é de 30 segundos ou 1.000 resultados, o que ocorrer primeiro.
Os logs estão disponíveis na tabela customMetrics no Application Insights. Os exemplos são o
número de execuções, a taxa de sucesso e a duração.
Todos esses logs são gravados no nível Information . Se você filtrar em Warning ou acima, não verá
nenhum desses dados.
Outras categorias
Todos os logs para categorias diferentes daquelas já listadas estão disponíveis na tabela traces no
Application Insights.
Todos os logs com categorias que começam com Host são gravados pelo tempo de execução do
functions. Os logs "função iniciada" e "função concluída" têm a categoria Host.Executor . Para
execuções bem-sucedidas, esses logs são do nível Information . As exceções são registradas no nível
Error . O tempo de execução também cria logs de nível Warning , por exemplo: mensagens de fila
enviadas para a fila de suspeita.
Os logs gravados pelo seu código de função têm a categoria Function e podem ser qualquer nível de
log.
Configurar o agregador
Conforme observado na seção anterior, o runtime agrega dados sobre as execuções de função em um
período. O período padrão é de 30 segundos ou 1.000 execuções, o que ocorrer primeiro. Você pode
definir essa configuração no arquivo host. JSON. Aqui está um exemplo:
{
"aggregator": {
"batchSize": 1000,
"flushTimeout": "00:00:30"
}
}
Configurar a amostragem
O Application Insights tem um recurso de amostragem que pode protegê-lo de produzir dados de
telemetria demais em execuções concluídas em momentos de pico de carga. Quando a taxa de
execuções de entrada excede um limite especificado, Application Insights começa a ignorar
aleatoriamente algumas das execuções de entrada. A configuração padrão para o número máximo de
execuções por segundo é 20 (cinco na versão 1. x). Você pode configurar a amostragem em host.
JSON. Aqui está um exemplo:
Versão 2.x
{
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 20
}
}
}
}
Versão 1.x
{
"applicationInsights": {
"sampling": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 5
}
}
}
NOTE
Amostragem é habilitado por padrão. Se parecer que faltam dados, talvez seja necessário ajustar as
configurações de amostragem para que se ajustem ao seu cenário de monitoramento específico.
Se você mantiver a mesma cadeia de caracteres de mensagem e inverter a ordem dos parâmetros, o
texto da mensagem resultante terá os valores nos locais errados.
Os espaços reservados são tratados dessa forma para que você possa fazer registro em log
estruturado. Application Insights armazena os pares nome-valor do parâmetro e a cadeia de
caracteres da mensagem. O resultado é que os argumentos da mensagem tornam-se campos que
você pode consultar.
Se a chamada do método de agente for semelhante ao exemplo anterior, você poderá consultar o
campo customDimensions.prop__rowKey . O prefixo prop__ é adicionado para garantir que não haja
colisões entre os campos que o tempo de execução adiciona e os campos que o código de função
adiciona.
Você também pode consultar a cadeia de caracteres da mensagem original referenciando o campo
customDimensions.prop__{OriginalFormat} .
{
customDimensions: {
"prop__{OriginalFormat}":"C# Queue trigger function processed: {message}",
"Category":"Function",
"LogLevel":"Information",
"prop__message":"c9519cbf-b1e6-4b9b-bf24-cb7d10b1bb89"
}
}
logger.LogMetric("TestMetric", 1234);
Esse código é uma alternativa para chamar TrackMetric usando a API Application Insights para .NET.
context.log.metric("TestMetric", 1234);
Esse código é uma alternativa para chamar trackMetric usando o SDK do node. js para Application
Insights.
namespace functionapp0915
{
public class HttpTrigger2
{
private readonly TelemetryClient telemetryClient;
/// Using dependency injection will guarantee that you use the same configuration for
telemetry collected automatically and manually.
public HttpTrigger2(TelemetryConfiguration telemetryConfiguration)
{
this.telemetryClient = new TelemetryClient(telemetryConfiguration);
}
[FunctionName("HttpTrigger2")]
public Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
HttpRequest req, ExecutionContext context, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
DateTime start = DateTime.UtcNow;
// Track an Event
var evt = new EventTelemetry("Function called");
evt.Context.User.Id = name;
this.telemetryClient.TrackEvent(evt);
// Track a Metric
var metric = new MetricTelemetry("Test Metric", DateTime.Now.Millisecond);
metric.Context.User.Id = name;
this.telemetryClient.TrackMetric(metric);
// Track a Dependency
var dependency = new DependencyTelemetry
{
Name = "GET api/planets/1/",
Target = "swapi.co",
Data = "https://swapi.co/api/planets/1/",
Timestamp = start,
Duration = DateTime.UtcNow - start,
Success = true
};
dependency.Context.User.Id = name;
this.telemetryClient.TrackDependency(dependency);
Versão 1.x
using System;
using System.Net;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.WebJobs;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Linq;
namespace functionapp0915
{
public static class HttpTrigger2
{
private static string key = TelemetryConfiguration.Active.InstrumentationKey =
System.Environment.GetEnvironmentVariable(
"APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);
[FunctionName("HttpTrigger2")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
HttpRequestMessage req, ExecutionContext context, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
DateTime start = DateTime.UtcNow;
// Track an Event
var evt = new EventTelemetry("Function called");
UpdateTelemetryContext(evt.Context, context, name);
telemetryClient.TrackEvent(evt);
// Track a Metric
var metric = new MetricTelemetry("Test Metric", DateTime.Now.Millisecond);
UpdateTelemetryContext(metric.Context, context, name);
telemetryClient.TrackMetric(metric);
// Track a Dependency
var dependency = new DependencyTelemetry
{
Name = "GET api/planets/1/",
Target = "swapi.co",
Data = "https://swapi.co/api/planets/1/",
Timestamp = start,
Duration = DateTime.UtcNow - start,
Success = true
};
UpdateTelemetryContext(dependency.Context, context, name);
telemetryClient.TrackDependency(dependency);
}
context.done();
};
Dependências
As funções v2 coletam automaticamente as dependências para solicitações HTTP, ServiceBus e SQL.
Você pode escrever código personalizado para mostrar as dependências. Para obter exemplos,
consulte o código de exemplo na C# seção telemetria personalizada. O código de exemplo resulta em
um mapa de aplicativo em Application insights semelhante à imagem a seguir:
Relatar problemas
Para relatar um problema com a integração do Application Insights em Functions ou para fazer
sugestões ou uma solicitação, crie um problema no GitHub.
Logs de streaming
Ao desenvolver um aplicativo, muitas vezes você deseja ver o que está sendo gravado nos logs em
tempo quase real durante a execução no Azure.
Há duas maneiras de exibir um fluxo de arquivos de log que está sendo gerado por suas execuções de
função.
Streaming de log interno: a plataforma do serviço de aplicativo permite que você exiba um
fluxo dos arquivos de log do aplicativo. Isso é equivalente à saída vista quando você depura
suas funções durante o desenvolvimento local e quando você usa a guia teste no Portal. Todas
as informações baseadas em log são exibidas. Para obter mais informações, consulte Stream
logs. Esse método de streaming dá suporte a apenas uma única instância e não pode ser usado
com um aplicativo em execução no Linux em um plano de consumo.
Live Metrics Stream: quando seu aplicativo de funções está conectado ao Application
insights, você pode exibir dados de log e outras métricas quase em tempo real no portal do
Azure usando Live Metrics Stream. Use esse método ao monitorar funções em execução em
várias instâncias ou no Linux em um plano de consumo. Esse método usa dados de amostra.
Os fluxos de log podem ser exibidos no portal e na maioria dos ambientes de desenvolvimento locais.
Portal
Você pode exibir os dois tipos de fluxos de log no Portal.
Streaming de log interno
Para exibir os logs de streaming no portal, selecione a guia recursos da plataforma em seu
aplicativo de funções. Em seguida, em monitoramento, escolha streaming de log.
Isso conecta seu aplicativo ao serviço de streaming de log e os logs de aplicativo são exibidos na
janela. Você pode alternar entre logs do aplicativo e logs do servidor Web.
Live Metrics Stream
Para exibir o Live Metrics Stream para seu aplicativo, selecione a guia visão geral do seu aplicativo
de funções. Quando Application Insights habilita, você verá um link de Application insights em
recursos configurados. Esse link leva você até a página de Application Insights para seu aplicativo.
Em Application Insights, selecione Live Metrics Stream. As entradas de log de amostra são exibidas
em telemetria de exemplo.
Código do Visual Studio
Para ativar os logs de streaming para seu aplicativo de funções no Azure:
1. Selecione F1 para abrir a paleta de comandos e, em seguida, pesquise e execute o comando
Azure Functions: Inicie os logsde streaming.
2. Selecione seu aplicativo de funções no Azure e, em seguida, selecione Sim para habilitar o log
de aplicativo para o aplicativo de funções.
3. Dispare suas funções no Azure. Observe que os dados de log são exibidos na janela saída no
Visual Studio Code.
4. Quando terminar, lembre-se de executar o comando Azure Functions: Interrompa os logs
de streaming para desabilitar o registro em log para o aplicativo de funções.
Ferramentas principais
Streaming de log interno
Use a logstream opção para começar a receber logs de streaming de um aplicativo de funções
específico em execução no Azure, como no exemplo a seguir:
Azure CLI
Você pode habilitar os logs de streaming usando o CLI do Azure. Use os comandos a seguir para
entrar, escolher sua assinatura e transmitir arquivos de log:
az login
az account list
az account set --subscription <subscriptionNameOrId>
az webapp log tail --resource-group <RESOURCE_GROUP_NAME> --name <FUNCTION_APP_NAME>
Azure PowerShell
Você pode habilitar os logs de streaming usando Azure PowerShell. Para o PowerShell, use os
seguintes comandos para adicionar sua conta do Azure, escolha sua assinatura e transmita os
arquivos de log:
Add-AzAccount
Get-AzSubscription
Get-AzSubscription -SubscriptionName "<subscription name>" | Select-AzSubscription
Get-AzWebSiteLog -Name <FUNCTION_APP_NAME> -Tail
Próximos passos
Para saber mais, consulte os recursos a seguir:
Application Insights
Registro em log de ASP.NET Core
Azure Functions de monitoramento com logs de
Azure Monitor
27/10/2019 • 3 minutes to read • Edit Online
O Azure Functions oferece uma integração com Azure monitor logs para monitorar funções. Este artigo mostra
como configurar Azure Functions para enviar logs gerados pelo sistema e pelo usuário a logs do Azure Monitor.
Os logs de Azure Monitor fornecem a capacidade de consolidar logs de diferentes recursos no mesmo espaço de
trabalho, onde podem ser analisados com consultas para recuperar, consolidar e analisar rapidamente os dados
coletados. É possível criar e testar consultas usando o Log Analytics no portal do Azure e, em seguida, analisar
diretamente os dados usando essas ferramentas ou salvar consultas para uso com visualizações ou regras de
alerta.
O Azure Monitor usa uma versão da linguagem de consulta Kusto usada pelo Azure Data Explorer que é adequada
para consultas de log simples, mas também inclui funcionalidades avançadas como agregações, junções e análises
inteligentes. É possível aprender a linguagem de consulta rapidamente por meio de várias lições.
NOTE
A integração com os logs de Azure Monitor está atualmente em visualização pública para aplicativos de funções em execução
no consumo do Windows, Premium e planos de hospedagem dedicados.
Configurando
Na seção monitoramento, selecione configurações de diagnóstico e clique em Adicionar.
Na página configuração, escolha Enviar para log Analyticse, em log , escolha FunctionAppLogs, essa tabela
contém os logs desejados.
Python
.NET
Java
PowerShell
Consultando os logs
Para consultar os logs gerados, vá para o espaço de trabalho do log Analytics e clique em logs.
Azure Functions grava todos os logs na tabela FunctionAppLogs , aqui estão algumas consultas de exemplo.
Todos os logs
FunctionAppLogs
| order by TimeGenerated desc
Exceções
FunctionAppLogs
| where ExceptionDetails != ""
| order by TimeGenerated asc
Próximos passos
Examinar a visão geral de Azure Functions
Saiba mais sobre os logs de Azure monitor
Saiba mais sobre a linguagem de consulta.
Adicionar um certificado SSL no Serviço de
Aplicativo do Azure
08/11/2019 • 30 minutes to read • Edit Online
O Serviço de Aplicativo do Azure fornece um serviço de hospedagem na Web altamente escalonável e com
aplicação automática de patches. Este artigo mostra como criar, carregar ou importar um certificado privado ou
público no Serviço de Aplicativo.
Depois que o certificado for adicionado ao aplicativo Serviço de Aplicativo ou aplicativo de funções, você poderá
proteger um nome DNS personalizado com ele ou usá-lo em seu código do aplicativo.
A tabela a seguir lista as opções disponíveis para adição de certificados no Serviço de Aplicativo:
OPÇÃO DESCRIÇÃO
Criar um Certificado gratuito gerenciado pelo Serviço de Um certificado privado fácil de usar se você só precisa
Aplicativo (versão prévia) proteger seu domínio personalizado www ou qualquer
domínio não raiz no Serviço de Aplicativo.
Comprar um certificado do Serviço de Aplicativo Um certificado privado gerenciado pelo Azure. Ele combina a
simplicidade do gerenciamento automatizado de certificado e
a flexibilidade das opções de renovação e exportação.
Importar um certificado do Key Vault Útil se você usar o Azure Key Vault para gerenciar seus
certificados PKCS12. Consulte Requisitos do certificado
privado.
Carregar um certificado público Os certificados públicos não são usados para proteger
domínios personalizados, mas você pode carregá-los em seu
código se precisar que eles acessem recursos remotos.
Pré-requisitos
Para seguir este guia de instruções, é necessário ter:
Crie um aplicativo do Serviço de Aplicativo.
Somente para certificado gratuito: mapeie um subdomínio (por exemplo, www.contoso.com ) para o Serviço de
Aplicativo com um registro CNAME.
NOTE
Os certificados ECC (Criptografia de Curva Elíptica) podem funcionar com o Serviço de Aplicativo, mas não são
abordados neste artigo. Trabalhe com sua autoridade de certificação seguindo exatamente estas etapas para criar certificados
ECC.
Certifique-se de que o aplicativo Web não esteja na camada F1 ou D1. A camada atual do seu aplicativo Web é
realçada por uma caixa azul escuro.
Não há suporte para SSL personalizado na camada F1 ou D1. Se precisar escalar verticalmente, siga as etapas da
próxima seção. Caso contrário, feche a página Aumentar e ignore a seção Aumentar seu plano do Serviço de
Aplicativo.
Escalar verticalmente seu Plano do Serviço de Aplicativo
Selecione qualquer uma das camadas não gratuitas (B1, B2, B3 ou qualquer camada na categoria Produção). Para
obter opções adicionais, clique em Ver opções adicionais.
Clique em Aplicar.
Quando você receber a notificação a seguir, a operação de escala terá sido concluída.
Qualquer domínio não raiz que esteja adequadamente mapeado para seu aplicativo com um registro CNAME
estará listado na caixa de diálogo. Selecione o domínio personalizado para criar um certificado gratuito e selecione
Criar. Só é possível criar apenas um certificado para cada domínio personalizado compatível.
Quando a operação for concluída, você verá o certificado na lista Certificados de Chave Privada.
IMPORTANT
Para proteger um domínio personalizado com esse certificado, ainda é necessário criar uma associação de certificado. Execute
as etapas em Criar associação.
Use a tabela a seguir para ajudá-lo a configurar o certificado. Ao terminar, clique em Criar.
CONFIGURAÇÃO DESCRIÇÃO
Nome do Host do Domínio Raiz Especifique o domínio raiz aqui. O certificado emitido protege
ambos, o domínio raiz e o subdomínio www . No certificado
emitido, o campo Nome Comum contém o domínio raiz, e o
campo Nome Alternativo da Entidade contém o domínio www
. Para proteger apenas um subdomínio qualquer, especifique
aqui o nome de domínio totalmente qualificado do
subdomínio (por exemplo, mysubdomain.contoso.com ).
Termos legais Clique para confirmar que você concorda com os termos
legais. Os certificados são obtidos no GoDaddy.
O Cofre da Chave do Azure ajuda a proteger chaves criptográficas e segredos usados por aplicativos e serviços em
nuvem. É o armazenamento de escolha para certificados de Serviço de Aplicativo.
Na página Status do Key Vault, clique em Repositório do Key Vault para criar um novo cofre ou escolher um
cofre existente. Se você optar por criar um novo cofre, use a tabela a seguir para ajudá-lo a configurar o cofre e
clique em Criar. veja para criar novo Key Vault no mesmo grupo de recursos e assinatura.
CONFIGURAÇÃO DESCRIÇÃO
Depois de selecionar o cofre, feche a página Repositório do Key Vault. A opção Armazenar deve mostrar uma
marca de seleção verde para sucesso. Mantenha a página aberta para a próxima etapa.
Verificar a propriedade de domínio
Na mesma página Configuração do Certificado usada na última etapa, clique em Etapa 2: verificar.
Selecione Verificação do Serviço de Aplicativo. Uma vez que você já mapeou o domínio ao seu aplicativo Web
(veja Pré-requisitos), ele já foi verificado. Basta clicar em Verificar para concluir esta etapa. Clique no botão
Atualizar até que a mensagem O Certificado tem Domínio Verificado seja exibida.
NOTE
Há suporte para quatro tipos de métodos de verificação de domínio:
Serviço de Aplicativo – a opção mais conveniente quando o domínio já está mapeado para um aplicativo do Serviço de
Aplicativo na mesma assinatura. Ela tira proveito do fato de que o aplicativo de Serviço de Aplicativo já verificou a
propriedade de domínio.
Domínio – verifique um domínio do Serviço de Aplicativo que você adquiriu do Azure. O Azure adiciona automaticamente
a verificação do registro TXT para você e conclui o processo.
Email – verifique o domínio enviando um email para o administrador de domínio. As instruções são fornecidas quando
você seleciona a opção.
Manual – verifique o domínio usando uma página HTML (apenas certificado Standard) ou um registro TXT do DNS. As
instruções são fornecidas quando você seleciona a opção.
IMPORTANT
Para proteger um domínio personalizado com esse certificado, ainda é necessário criar uma associação de certificado. Execute
as etapas em Criar associação.
CONFIGURAÇÃO DESCRIÇÃO
Quando a operação for concluída, você verá o certificado na lista Certificados de Chave Privada. Se a
importação falhar com um erro, o certificado não atenderá aos requisitos do Serviço de Aplicativo.
IMPORTANT
Para proteger um domínio personalizado com esse certificado, ainda é necessário criar uma associação de certificado. Execute
as etapas em Criar associação.
-----BEGIN CERTIFICATE-----
<your entire Base64 encoded SSL certificate>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<The entire Base64 encoded intermediate certificate 1>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<The entire Base64 encoded intermediate certificate 2>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<The entire Base64 encoded root certificate>
-----END CERTIFICATE-----
Quando solicitado, defina uma senha de exportação. Você usará essa senha quando carregar o certificado SSL
para o Serviço de Aplicativo posteriormente.
Se você usou o IIS ou o Certreq.exe para gerar a solicitação de certificado, instale o certificado no computador
local e, em seguida, exporte o certificado para PFX .
Carregar certificado no Serviço de Aplicativo
Agora você está pronto para carregar o certificado no Serviço de Aplicativo.
No portal do Azure, no menu à esquerda, selecione Serviços de Aplicativos > <nome_do_aplicativo> .
No painel de navegação à esquerda de seu aplicativo, selecione Configurações de TLS/SSL > Certificados de
Chave Privada (.pfx) > Carregar Certificado.
Em Arquivo de Certificado PFX, selecione o arquivo PFX. Em Senha do certificado, digite a senha que você
criou ao exportar o arquivo PFX. Ao terminar, clique em Carregar.
Quando a operação for concluída, você verá o certificado na lista Certificados de Chave Privada.
IMPORTANT
Para proteger um domínio personalizado com esse certificado, ainda é necessário criar uma associação de certificado. Execute
as etapas em Criar associação.
NOTE
Se você não clicar em Sincronizar, o Serviço de Aplicativo sincronizará automaticamente seu certificado dentro de 48 horas.
Renovar certificado
Para ativar a renovação automática do seu certificado a qualquer momento, selecione o certificado na página
Certificados do Serviço de Aplicativo e clique em Configurações de Renovação Automática no painel de
navegação à esquerda. Por padrão, os certificados do Serviço de Aplicativo têm um período de validade de um ano.
Selecione Ativado e clique em Salvar. Os certificados poderão iniciar automaticamente renovação 60 dias antes
do término se você tiver ativado a renovação automática.
Para renovar manualmente o certificado, clique em Renovação Manual. Você pode solicitar renovar
manualmente o certificado de 60 dias antes da expiração.
Após a conclusão da operação de renovação, clique em Sincronizar. A operação de sincronização atualiza
automaticamente as associações de nome de host do certificado no Serviço de Aplicativo sem causar tempo de
inatividade em seus aplicativos.
NOTE
Se você não clicar em Sincronizar, o Serviço de Aplicativo sincronizará automaticamente seu certificado dentro de 48 horas.
Exportar o certificado
Como o certificado do Serviço de Aplicativo é um segredo do Key Vault, você pode exportar uma cópia em PFX
dele e usá-lo para outros serviços do Azure ou fora do Azure.
Para exportar o Certificado do Serviço de Aplicativo como um arquivo PFX, execute os seguintes comandos no
Cloud Shell. Você também poderá executá-lo localmente se tiver instalado a CLI do Azure. Substitua os espaços
reservados pelos nomes que você usou ao criar o certificado do Serviço de Aplicativo.
O arquivo appservicecertificate.pfx baixado é um arquivo PKCS12 bruto que contém os certificados públicos e
privados. Sempre que receber a solicitação, a senha de importação e a frase secreta de PEM serão a cadeia de
caracteres vazia.
Excluir Certificado
A exclusão de um certificado do Serviço de Aplicativo é final e irreversível. Qualquer associação no Serviço de
Aplicativo com esse certificado ficará inválida. Para evitar a exclusão acidental, o Azure coloca um bloqueio no
certificado. Para excluir um certificado do Serviço de Aplicativo, primeiro remova o bloqueio de exclusão no
certificado.
Selecione o certificado na página Certificados do Serviço de Aplicativo e, em seguida, selecione Bloqueios na
navegação à esquerda.
Localize o bloqueio em seu certificado com o tipo de bloqueio Exclusão. À direita, selecione Excluir.
Agora você pode excluir o certificado do Serviço de Aplicativo. Na navegação à esquerda, selecione Visão Geral >
Excluir. Na caixa de diálogo de confirmação, digite o nome do certificado e selecione OK.
Automatizar com scripts
CLI do Azure
#!/bin/bash
fqdn=<replace-with-www.{yourdomain}>
pfxPath=<replace-with-path-to-your-.PFX-file>
pfxPassword=<replace-with-your=.PFX-password>
resourceGroup=myResourceGroup
webappname=mywebapp$RANDOM
# Create an App Service plan in Basic tier (minimum required by custom domains).
az appservice plan create --name $webappname --resource-group $resourceGroup --sku B1
# Before continuing, go to your DNS configuration UI for your custom domain and follow the
# instructions at https://aka.ms/appservicecustomdns to configure a CNAME record for the
# hostname "www" and point it your web app's default domain name.
PowerShell
$fqdn="<Replace with your custom domain name>"
$pfxPath="<Replace with path to your .PFX file>"
$pfxPassword="<Replace with your .PFX password>"
$webappname="mywebapp$(Get-Random)"
$location="West Europe"
# Before continuing, go to your DNS configuration UI for your custom domain and follow the
# instructions at https://aka.ms/appservicecustomdns to configure a CNAME record for the
# hostname "www" and point it your web app's default domain name.
# Upgrade App Service plan to Basic tier (minimum required by custom SSL certificates)
Set-AzAppServicePlan -Name $webappname -ResourceGroupName $webappname `
-Tier Basic
Mais recursos
Proteger um nome DNS personalizado com uma associação SSL
Impor HTTPS
Impor o TLS 1.1/1.2
Usar um certificado SSL no código do aplicativo
Perguntas frequentes: Certificados do Serviço de Aplicativo
Configurar seu aplicativo do serviço de aplicativo
para usar o logon do Azure AD
01/11/2019 • 12 minutes to read • Edit Online
Este artigo mostra como configurar Azure App serviço para usar o Azure Active Directory (AD do Azure) como
um provedor de autenticação.
NOTE
Neste momento, Azure App serviço e Azure Functions só têm suporte do Azure AD v 1.0. Eles não têm suporte da
plataforma Microsoft Identity v 2.0, que inclui MSAL (bibliotecas de autenticação da Microsoft).
Restringir o acesso dessa maneira se aplica a todas as chamadas para seu aplicativo, o que pode não ser
desejável para aplicativos que têm um home page publicamente disponível, como em muitos aplicativos de
página única. Para tais aplicativos, Permitir solicitações anônimas (nenhuma ação) pode ser preferível,
com o aplicativo iniciando o logon manualmente. Para obter mais informações, consulte fluxo de
autenticação.
6. Clique em Salvar.
5. Selecione Criar.
6. Depois que o registro do aplicativo for criado, copie a ID do aplicativo (cliente) e a ID do diretório
(locatário) para mais tarde.
7. Selecione identidade visual. Na URL da Home Page, insira a URL do seu aplicativo do serviço de
aplicativo e selecione salvar.
8. Selecione expor uma API > conjunto. Cole a URL do aplicativo do serviço de aplicativo e selecione
salvar.
NOTE
Esse valor é o URI de ID do aplicativo do registro do aplicativo. Se seu aplicativo Web exigir acesso a uma API na
nuvem, você precisará do URI de ID de aplicativo do aplicativo Web ao configurar o recurso de serviço de
aplicativo de nuvem. Você pode usar isso, por exemplo, se desejar que o serviço de nuvem Conceda explicitamente
acesso ao aplicativo Web.
CAMPO DESCRIÇÃO
NOTE
A ID do cliente configurada sempre é considerada implicitamente como um público permitido, independentemente
de como você configurou os públicos de token permitidos.
4. Selecione Criar.
NOTE
Para um aplicativo do Windows, use o SID do pacote como o URI em vez disso.
5. Depois que o registro do aplicativo for criado, copie o valor da ID do aplicativo (cliente) .
6. Selecione permissões de API > adicionar uma permissão > minhas APIs.
7. Selecione o registro de aplicativo que você criou anteriormente para seu aplicativo do serviço de aplicativo.
Se você não vir o registro do aplicativo, certifique-se de ter adicionado o escopo user_impersonation em
criar um registro de aplicativo no Azure ad para seu aplicativo do serviço de aplicativo.
8. Selecione user_impersonatione, em seguida, selecione adicionar permissões.
Você já configurou um aplicativo de cliente nativo que pode acessar seu aplicativo do Serviço de aplicativo.
Próximas etapas
Visão geral de autenticação/autorização do serviço de aplicativo.
Uso avançado de autenticação e autorização no serviço Azure App
Adicione autenticação ao seu aplicativo móvel: Ios, Android, Windows universal, xamarin. Android, xamarin.
Ios, xamarin. Forms, Cordova.
Configurar seu aplicativo do serviço de aplicativo
para usar o logon do Facebook
01/11/2019 • 5 minutes to read • Edit Online
Este artigo mostra como configurar Azure App serviço para usar o Facebook como um provedor de autenticação.
Para concluir o procedimento neste artigo, você precisa de uma conta do Facebook que tenha um endereço de
email verificado e um número de telefone celular. Para criar uma nova conta do Facebook, vá para facebook.com.
IMPORTANT
O segredo do aplicativo é uma credencial de segurança importante. Não compartilhe essa senha com ninguém nem
distribua-a em um aplicativo cliente.
10. A conta do Facebook que você usou para registrar o aplicativo é um administrador do aplicativo. Neste
ponto, somente os administradores podem entrar neste aplicativo.
Para autenticar outras contas do Facebook, selecione revisão do aplicativo e habilite Make <your-App-
Name > público para permitir que o público geral acesse o aplicativo usando a autenticação do Facebook.
Adicionar informações do Facebook ao seu aplicativo
1. Entre no portal do Azure e navegue até o aplicativo do serviço de aplicativo.
2. Selecione configurações > autenticação/autorizaçãoe verifique se a autenticação do serviço de
aplicativo está ativada.
3. Selecione Facebooke cole os valores de ID do aplicativo e segredo do aplicativo que você obteve
anteriormente. Habilite todos os escopos necessários para seu aplicativo.
4. Selecione OK.
Por padrão, o serviço de aplicativo fornece autenticação, mas não restringe o acesso autorizado ao
conteúdo e às APIs do site. Você precisa autorizar usuários em seu código de aplicativo.
5. Adicional Para restringir o acesso somente aos usuários autenticados pelo Facebook, defina a ação a ser
tomada quando a solicitação não for autenticada no Facebook. Quando você define essa
funcionalidade, seu aplicativo requer que todas as solicitações sejam autenticadas. Ele também redireciona
todas as solicitações não autenticadas para o Facebook para autenticação.
Cau t i on
Restringir o acesso dessa maneira se aplica a todas as chamadas para seu aplicativo, o que pode não ser
desejável para aplicativos que têm um home page publicamente disponível, como em muitos aplicativos de
página única. Para tais aplicativos, Permitir solicitações anônimas (nenhuma ação) pode ser preferível
para que o aplicativo inicie manualmente a autenticação em si. Para obter mais informações, consulte fluxo
de autenticação.
6. Clique em Salvar.
Agora você está pronto para usar o Facebook para autenticação em seu aplicativo.
Próximas etapas
Visão geral de autenticação/autorização do serviço de aplicativo.
Uso avançado de autenticação e autorização no serviço Azure App
Adicione autenticação ao seu aplicativo móvel: Ios, Android, Windows universal, xamarin. Android, xamarin.
Ios, xamarin. Forms, Cordova.
Configurar seu aplicativo do serviço de aplicativo
para usar o logon do Google
01/11/2019 • 3 minutes to read • Edit Online
Este tópico mostra como configurar o Serviço de Aplicativo do Azure para usar o Google como um provedor de
autenticação.
Para concluir o procedimento neste tópico, você deve ter uma conta do Google com um endereço de email
verificado. Para criar uma nova conta do Google, vá para accounts.google.com.
IMPORTANT
O segredo do aplicativo é uma credencial de segurança importante. Não compartilhe essa senha com ninguém nem
distribua-a em um aplicativo cliente.
Restringir o acesso dessa maneira se aplica a todas as chamadas para seu aplicativo, o que pode não ser
desejável para aplicativos que têm um home page publicamente disponível, como em muitos aplicativos de
página única. Para tais aplicativos, Permitir solicitações anônimas (nenhuma ação) pode ser preferível
para que o aplicativo inicie manualmente a autenticação em si. Para obter mais informações, consulte fluxo
de autenticação.
6. Clique em Salvar.
Agora você está pronto para usar o Google para autenticação em seu aplicativo.
Próximas etapas
Visão geral de autenticação/autorização do serviço de aplicativo.
Uso avançado de autenticação e autorização no serviço Azure App
Adicione autenticação ao seu aplicativo móvel: Ios, Android, Windows universal, xamarin. Android, xamarin.
Ios, xamarin. Forms, Cordova.
Configurar seu aplicativo do serviço de aplicativo
para usar o logon da conta da Microsoft
01/11/2019 • 4 minutes to read • Edit Online
Este tópico mostra como configurar o Serviço de Aplicativo do Azure para usar a conta da Microsoft como um
provedor de autenticação.
IMPORTANT
A senha é uma credencial de segurança importante. Não compartilhe a senha com ninguém nem distribua-a em um
aplicativo cliente.
Restringir o acesso dessa maneira se aplica a todas as chamadas para seu aplicativo, o que pode não ser
desejável para aplicativos que têm um home page publicamente disponível, como em muitos aplicativos
de página única. Para tais aplicativos, Permitir solicitações anônimas (nenhuma ação) pode ser
preferível para que o aplicativo inicie manualmente a autenticação em si. Para obter mais informações,
consulte fluxo de autenticação.
6. Clique em Salvar.
Agora você está pronto para usar uma conta da Microsoft para autenticação em seu aplicativo.
Próximas etapas
Visão geral de autenticação/autorização do serviço de aplicativo.
Uso avançado de autenticação e autorização no serviço Azure App
Adicione autenticação ao seu aplicativo móvel: Ios, Android, Windows universal, xamarin. Android, xamarin.
Ios, xamarin. Forms, Cordova.
Configurar seu aplicativo do serviço de aplicativo
para usar o logon do Twitter
01/11/2019 • 4 minutes to read • Edit Online
Este artigo mostra como configurar Azure App serviço para usar o Twitter como um provedor de autenticação.
Para concluir o procedimento neste artigo, você precisa de uma conta do Twitter que tenha um endereço de email
e número de telefone verificados. Para criar uma nova conta do Twitter, vá para twitter.com.
4. Na parte inferior da página, leia e aceite os termos. Selecione criar seu aplicativo do Twitter. Os
detalhes do aplicativo são exibidos.
5. Selecione a guia configurações , marque permitir que este aplicativo seja usado para entrar com o
Twittere, em seguida, selecione Atualizar configurações.
6. Selecione a guia Chaves e Tokens de Acesso .
Anote esses valores:
Chave do consumidor (chave de API)
Segredo do consumidor (segredo da API)
NOTE
O segredo do consumidor é uma credencial de segurança importante. Não compartilhe esse segredo com ninguém
nem o distribua com seu aplicativo.
Restringir o acesso dessa maneira se aplica a todas as chamadas para seu aplicativo, o que pode não ser
desejável para aplicativos que têm um home page publicamente disponível, como em muitos aplicativos de
página única. Para tais aplicativos, Permitir solicitações anônimas (nenhuma ação) pode ser preferível
para que o aplicativo inicie manualmente a autenticação em si. Para obter mais informações, consulte fluxo
de autenticação.
7. Clique em Salvar.
Agora você está pronto para usar o Twitter para autenticação em seu aplicativo.
Próximas etapas
Visão geral de autenticação/autorização do serviço de aplicativo.
Uso avançado de autenticação e autorização no serviço Azure App
Adicione autenticação ao seu aplicativo móvel: Ios, Android, Windows universal, xamarin. Android, xamarin.
Ios, xamarin. Forms, Cordova.
Uso avançado de autenticação e autorização no
Serviço de Aplicativo do Azure
26/10/2019 • 21 minutes to read • Edit Online
Este artigo mostra como personalizar a autenticação e a autorização integradas no Serviço de Aplicativo e
gerenciar a identidade do seu aplicativo.
Para começar rapidamente, veja um dos seguintes tutoriais:
Tutorial: Autenticar e autorizar usuários de ponta a ponta no Serviço de Aplicativo do Azure (Windows)
Tutorial: Autenticar e autorizar usuários de ponta a ponta no Serviço de Aplicativo do Azure para Linux
Como configurar seu aplicativo para usar o logon do Active Directory do Azure
Como configurar seu aplicativo para usar o logon do Facebook
Como configurar seu aplicativo para usar o logon do Google
Como configurar seu aplicativo para usar o logon da Conta da Microsoft
Como configurar seu aplicativo para usar o logon do Twitter
Quando o usuário clica em um dos links, a respectiva página de entrada é aberta para que ele entre.
Para redirecionar o usuário pós-entada para uma URL personalizada, use o parâmetro de cadeia de caracteres de
consulta post_login_redirect_url (não deve ser confundido com o URI de redirecionamento na configuração do
provedor de identidade). Por exemplo, para orientar o usuário para /Home/Index após entrar, use o seguinte código
HTML:
{"id_token":"<token>","access_token":"<token>"}
O formato do token varia ligeiramente de acordo com o provedor. Consulte a tabela a seguir para obter detalhes:
aad {"access_token":"<access_token>"}
twitter {"access_token":"<access_token>",
"access_token_secret":"
<acces_token_secret>"}
Se o token do provedor for validado com êxito, a API retorna com um authenticationToken no corpo da resposta,
que é seu token de sessão.
{
"authenticationToken": "...",
"user": {
"userId": "sid:..."
}
}
Uma vez que esse token de sessão, você pode acessar os recursos de aplicativo protegido, adicionando o
X-ZUMO-AUTH cabeçalho às solicitações HTTP. Por exemplo:
GET https://<appname>.azurewebsites.net/api/products/1
X-ZUMO-AUTH: <authenticationToken_value>
Sair de uma sessão
Os usuários podem iniciar uma saída, enviando uma GET solicitação ao ponto de extremidade /.auth/logout do
aplicativo. A solicitação GET faz o seguinte:
Limpa os cookies de autenticação da sessão atual.
Exclui os tokens do usuário atual do Token Store.
Para o Azure Active Directory e o Google, executa uma saída do servidor no provedor de identidade.
Aqui está um link de saída simples em uma página da Web:
Por padrão, uma saída com êxito redireciona o cliente para a URL /.auth/logout/done . É possível alterar a página
de redirecionamento pós-saída, adicionando o parâmetro de consulta post_logout_redirect_uri . Por exemplo:
GET /.auth/logout?post_logout_redirect_uri=/index.html
GET /.auth/logout?post_logout_redirect_uri=https%3A%2F%2Fmyexternalurl.com
Google X-MS-TOKEN-GOOGLE-ID-TOKEN
X-MS-TOKEN-GOOGLE-ACCESS-TOKEN
X-MS-TOKEN-GOOGLE-EXPIRES-ON
X-MS-TOKEN-GOOGLE-REFRESH-TOKEN
Twitter X-MS-TOKEN-TWITTER-ACCESS-TOKEN
X-MS-TOKEN-TWITTER-ACCESS-TOKEN-SECRET
Do seu código do cliente (por exemplo, um aplicativo móvel ou JavaScript no navegador), envie uma solicitação
HTTP GET para /.auth/me . O JSON retornado tem os tokens específicos do provedor.
NOTE
Tokens de acesso são para acessar recursos do provedor, para que eles fiquem presentes somente se você configurar o
provedor com um segredo do cliente. Para saber como obter tokens de atualização, confira Tokens de acesso de atualização.
5. Clique em Put.
Depois que seu provedor estiver configurado, você poderá encontrar o token de atualização e o tempo de
expiração do token de acesso na loja do token.
Para atualizar o token de acesso a qualquer momento, basta chamar /.auth/refresh em qualquer idioma. O
snippet a seguir usa o jQuery para atualizar seus tokens de acesso de um cliente JavaScript.
function refreshTokens() {
let refreshUrl = "/.auth/refresh";
$.ajax(refreshUrl) .done(function() {
console.log("Token refresh completed successfully.");
}) .fail(function() {
console.log("Token refresh failed. See application logs for details.");
});
}
Se um usuário revoga as permissões concedidas ao seu aplicativo, a chamada para /.auth/me pode falhar com um
resposta 403 Forbidden . Para diagnosticar erros, verifique os logs de aplicativo para obter detalhes.
NOTE
O período de cortesia se aplica somente à sessão autenticada do Serviço de Aplicativo, não aos tokens de provedores de
identidade. Não há um período de cortesia para os tokens de provedor expirados.
"additionalLoginParams": ["domain_hint=<domain_name>"]
IMPORTANT
É possível que o cliente remova o parâmetro domain_hint depois de receber a URL de redirecionamento e, em seguida, faça
logon com um domínio diferente. Portanto, embora essa função seja conveniente, ela não é um recurso de segurança.
Próximos passos
Tutorial: Autenticar e autorizar usuários ponta a ponta (Windows) Tutorial: Autenticar e autorizar usuários de ponta
a ponta (Linux)
Azure App restrições de acesso de serviço
24/10/2019 • 12 minutes to read • Edit Online
As restrições de acesso permitem que você defina uma lista de permissão/negação ordenada de prioridade que
controla o acesso à rede para seu aplicativo. A lista pode incluir endereços IP ou sub-redes de rede virtual do
Azure. Quando há uma ou mais entradas, há então um "negar tudo" implícito que existe no final da lista.
A funcionalidade de restrições de acesso funciona com todas as cargas de trabalho hospedadas do serviço de
aplicativo, incluindo; aplicativos Web, aplicativos de API, aplicativos do Linux, aplicativos de contêiner do Linux e
funções.
Quando uma solicitação é feita ao seu aplicativo, o endereço de é avaliado em relação às regras de endereço IP
em sua lista de restrições de acesso. Se o endereço de estiver em uma sub-rede configurada com pontos de
extremidade de serviço para Microsoft. Web, a sub-rede de origem será comparada com as regras de rede virtual
em sua lista de restrições de acesso. Se o endereço não é permitido o acesso com base nas regras na lista, o
serviço responderá com um código de status HTTP 403.
O recurso de restrições de acesso é implementado nas funções de front-end do serviço de aplicativo, que são
upstream dos hosts de trabalho em que seu código é executado. Portanto, as restrições de acesso são
efetivamente ACLs de rede.
A capacidade de restringir o acesso ao seu aplicativo Web de uma VNet (rede virtual) do Azure é chamada de
pontos de extremidade de serviço. Os pontos de extremidade de serviço permitem restringir o acesso a um
serviço multilocatário de sub-redes selecionadas. Ele deve ser habilitado tanto no lado da rede quanto no serviço
com o qual está sendo habilitado. Ele não funciona para restringir o tráfego para aplicativos hospedados em um
Ambiente do Serviço de Aplicativo. Se você estiver em um Ambiente do Serviço de Aplicativo, poderá controlar o
acesso ao seu aplicativo com regras de endereço IP.
A lista mostrará todas as restrições atuais que estão em seu aplicativo. Se você tiver uma restrição de VNet em
seu aplicativo, a tabela mostrará se os pontos de extremidade de serviço estão habilitados para Microsoft. Web.
Quando não houver nenhuma restrição definida em seu aplicativo, seu aplicativo poderá ser acessado de
qualquer lugar.
Para excluir uma regra, clique em ... em sua regra e clique em remover.
Bloqueando um único endereço IP
Ao adicionar sua primeira regra de restrição de IP, o serviço adicionará uma regra negar tudo explícita com uma
prioridade de 2147483647. Na prática, a regra negar tudo explícita será executada pela última vez e bloqueará o
acesso a qualquer endereço IP que não seja explicitamente permitido usando uma regra de permissão .
Para o cenário em que os usuários desejam bloquear explicitamente um único endereço IP ou bloco de endereço
IP, mas permitir que todas as outras pessoas acessem, é necessário adicionar uma regra permitir tudo explícito.
Site do SCM
Além de poder controlar o acesso ao seu aplicativo, você também pode restringir o acesso ao site do SCM usado
pelo seu aplicativo. O site do SCM é o ponto de extremidade de implantação da Web e também o console do
kudu. Você pode atribuir separadamente restrições de acesso ao site do SCM do aplicativo ou usar o mesmo
conjunto para o aplicativo e o site do SCM. Quando você marca a caixa para ter as mesmas restrições que seu
aplicativo, tudo fica em branco. Se você desmarcar a caixa, quaisquer configurações que você tenha anteriormente
no site do SCM serão aplicadas.
Manipulação programática de regras de restrição de acesso
Atualmente, não há uma CLI ou o PowerShell para o novo recurso de restrições de acesso, mas os valores podem
ser definidos manualmente com uma operação Put da API REST do Azure na configuração do aplicativo no
Gerenciador de recursos. Por exemplo, você pode usar resources.azure.com e editar o bloco ipSecurityRestrictions
para adicionar o JSON necessário.
O local para obter essas informações no Gerenciador de Recursos é:
management.azure.com/subscriptions/subscription ID/resourceGroups/resource
groups/providers/Microsoft.Web/sites/web app name/config/web?api-version=2018-02-01
A sintaxe JSON para o exemplo anterior é:
{
"properties": {
"ipSecurityRestrictions": [
{
"ipAddress": "122.133.144.0/24",
"action": "Allow",
"tag": "Default",
"priority": 100,
"name": "IP example rule"
}
]
}
}
IMPORTANT
Identidades gerenciadas para Serviço de Aplicativo e Azure Functions não se comportarão conforme o esperado se seu
aplicativo for migrado entre assinaturas/locatários. O aplicativo precisará obter uma nova identidade, que pode ser feita ao
desabilitar e reabilitar o recurso. Consulte removendo uma identidade abaixo. Recursos de downstream também precisará ter
políticas de acesso atualizadas para usar a nova identidade.
Este tópico mostra como criar uma identidade gerenciada para aplicativos do Serviço de Aplicativo e do Azure
Functions e como usá-la para acessar outros recursos. Uma identidade gerenciada do Azure Active Directory
permite que seu aplicativo acesse com facilidade outros recursos protegidos pelo AAD, como o Azure Key Vault. A
identidade é gerenciada pela plataforma do Azure e não exige provisionamento ou giro de nenhum segredo. Para
obter mais informações sobre identidades gerenciadas no AAD, veja Identidades gerenciadas para recursos do
Azure.
Seu aplicativo pode receber dois tipos de identidades:
Uma identidade atribuída pelo sistema é vinculada ao seu aplicativo e é excluída se o seu aplicativo for
excluído. Um aplicativo só pode ter uma identidade atribuída pelo sistema.
Uma identidade atribuída pelo usuário é um recurso do Azure independente que pode ser atribuído ao seu
aplicativo. Um aplicativo pode ter várias identidades atribuídas pelo usuário.
az login
2. Crie um aplicativo Web usando a CLI. Para ver mais exemplos de como usar a CLI com o Serviço de
Aplicativo, consulte Exemplos de CLI do Serviço de Aplicativo:
3. Execute o comando identity assign para criar a identidade para este aplicativo:
As etapas a seguir guiarão você pela criação de um aplicativo da Web e pela atribuição de uma identidade usando o
Azure PowerShell:
1. Se necessário, instale o Azure PowerShell usando a instrução encontrada no guia do Azure PowerShell e, em
seguida, execute Login-AzAccount para criar uma conexão com o Azure.
2. Crie um aplicativo da Web usando o Azure PowerShell. Para obter mais exemplos de como usar o Azure
PowerShell com o Serviço de Aplicativo, consulte Amostras do PowerShell do Serviço de Aplicativo :
3. Execute o comando Set-AzWebApp -AssignIdentity para criar a identidade para este aplicativo:
"identity": {
"type": "SystemAssigned"
}
NOTE
Um aplicativo pode ter identidades atribuídas pelo sistema e atribuídas pelo usuário ao mesmo tempo. Nesse caso, a type
propriedade seria SystemAssigned,UserAssigned
Adicionar o tipo atribuído pelo sistema diz ao Azure para criar e gerenciar a identidade do seu aplicativo.
Por exemplo, um aplicativo Web pode ser semelhante ao seguinte:
{
"apiVersion": "2016-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('appName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "SystemAssigned"
},
"properties": {
"name": "[variables('appName')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"hostingEnvironment": "",
"clientAffinityEnabled": false,
"alwaysOn": true
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
]
}
"identity": {
"type": "SystemAssigned",
"tenantId": "<TENANTID>",
"principalId": "<PRINCIPALID>"
}
No qual <TENANTID> e <PRINCIPALID> são substituídos por GUIDs. A propriedade tenantId identifica a qual
locatário do AAD a identidade pertence. O principalId é um identificador exclusivo para a nova identidade do
aplicativo. No AAD, a entidade de serviço tem o mesmo nome que você deu à sua instância do Serviço de
Aplicativo ou das Funções do Azure.
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {}
}
}
NOTE
Um aplicativo pode ter identidades atribuídas pelo sistema e atribuídas pelo usuário ao mesmo tempo. Nesse caso, a type
propriedade seria SystemAssigned,UserAssigned
Adicionando o tipo atribuído pelo usuário e um cotells do Azure para criar e gerenciar a identidade do seu
aplicativo.
Por exemplo, um aplicativo Web pode ser semelhante ao seguinte:
{
"apiVersion": "2016-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('appName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
}
},
"properties": {
"name": "[variables('appName')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"hostingEnvironment": "",
"clientAffinityEnabled": false,
"alwaysOn": true
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
]
}
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {
"principalId": "<PRINCIPALID>",
"clientId": "<CLIENTID>"
}
}
}
No qual <PRINCIPALID> e <CLIENTID> são substituídos por GUIDs. O principalId é um identificador exclusivo para a
identidade que é usada para a administração do AAD. O clientId é um identificador exclusivo para a nova
identidade do aplicativo que é usado para especificar qual identidade usar durante as chamadas de runtime.
IMPORTANT
Talvez seja necessário configurar o recurso de destino para permitir o acesso do aplicativo. Por exemplo, se você solicitar um
token para o Key Vault, será necessário se certificar de que uma política de acesso que inclui a identidade do aplicativo foi
adicionada. Caso contrário, as chamadas para o Key Vault serão rejeitadas, mesmo se elas incluírem o token. Para saber mais
sobre os recursos que oferecem suporte a tokens do Azure Active Directory, veja Serviços do Azure que dão suporte à
autenticação do Azure AD.
Há um protocolo REST simples para obter um token no Serviço de Aplicativo e no Azure Functions. Isso pode ser
usado para todos os aplicativos e linguagens. Para alguns .NET e Java, o SDK do Azure fornece uma abstração
sobre esse protocolo e facilita uma experiência de desenvolvimento local.
Usar o protocolo REST
Um aplicativo com uma identidade gerenciada tem duas variáveis de ambiente definidas:
MSI_ENDPOINT: a URL para o serviço de token local.
MSI_SECRET: um cabeçalho usado para ajudar a reduzir os ataques de falsificação da solicitação do lado do
servidor (SSRF ). O valor é trocado pela plataforma.
A MSI_ENDPOINT é uma URL local da qual o aplicativo pode solicitar tokens. Para obter um token para um
recurso, solicite uma HTTP GET para esse ponto de extremidade, incluindo os seguintes parâmetros:
IMPORTANT
Se você estiver tentando obter tokens para identidades atribuídas pelo usuário, deverá incluir a propriedade clientid . Caso
contrário, o serviço de token tentará obter um token para uma identidade atribuída pelo sistema, que pode ou não existir.
Uma resposta bem-sucedida de 200 OK inclui um corpo JSON com as seguintes propriedades:
Essa resposta é igual a resposta à solicitação do AAD de token de acesso de serviço para serviço.
NOTE
Variáveis de ambiente são configuradas quando o processo é iniciado pela primeira vez, então após habilitar a identidade
gerenciada para o seu aplicativo, você pode precisar reiniciar o aplicativo ou reimplantar o código dele antes que
MSI_ENDPOINT e MSI_SECRET estejam disponíveis para seu código.
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJ0eXAi…",
"expires_on": "09/14/2017 00:00:00 PM +00:00",
"resource": "https://vault.azure.net",
"token_type": "Bearer"
}
Exemplos de código
.NET
JavaScript
Python
PowerShell
TIP
Para as linguagens .NET, também é possível usar Microsoft.Azure.Services.AppAuthentication em vez de criar essa solicitação
por conta própria.
private readonly HttpClient _client;
// ...
public async Task<HttpResponseMessage> GetToken(string resource) {
var request = new HttpRequestMessage(HttpMethod.Get,
String.Format("{0}/?resource={1}&api-version=2017-09-01",
Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource));
request.Headers.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
return await _client.SendAsync(request);
}
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
// ...
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");
// OR
var kv = new KeyVaultClient(new
KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
Para saber mais sobre o Microsoft.Azure.Services.AppAuthentication e as operações que ele expõe, consulte a
Referência Microsoft.Azure.Services.AppAuthentication e Serviço de Aplicativo e KeyVault com a amostra MSI
.NET.
Usando o SDK do Azure para Java
Para aplicativos e funções Java, a maneira mais simples de trabalhar com uma identidade gerenciada é por meio do
SDK do Azure para Java. Esta seção mostra a você como começar a usar a biblioteca no seu código.
1. Adicione uma referência à biblioteca do SDK do Azure. Para projetos Maven, você pode adicionar esse
trecho à seção dependencies do arquivo POM do projeto:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure</artifactId>
<version>1.23.0</version>
</dependency>
2. Use o objeto AppServiceMSICredentials para autenticação. Este exemplo mostra como esse mecanismo pode
ser usado para trabalhar com Azure Key Vault:
import com.microsoft.azure.AzureEnvironment;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.keyvault.Vault
//...
Azure azure = Azure.authenticate(new AppServiceMSICredentials(AzureEnvironment.AZURE))
.withSubscription(subscriptionId);
Vault myKeyVault = azure.vaults().getByResourceGroup(resourceGroup, keyvaultName);
"identity": {
"type": "None"
}
Remover uma identidade atribuída pelo sistema dessa maneira também a excluirá do AAD. As identidades
atribuídas pelo sistema também são automaticamente removidas do AAD quando o recurso do aplicativo é
excluído.
NOTE
Há também uma configuração de aplicativo que pode ser definida, WEBSITE_DISABLE_MSI, que apenas desativa o serviço de
token local. No entanto, ele deixa a identidade no local e ferramentas ainda mostrará a identidade gerenciada como "ligada"
ou "habilitada". Como resultado, o uso dessa configuração não é recomendado.
Próximos passos
Acesse o Banco de Dados SQL com segurança usando uma identidade gerenciada
Usar referências de Key Vault para o serviço de
aplicativo e Azure Functions
08/11/2019 • 8 minutes to read • Edit Online
NOTE
Key Vault referências não estão disponíveis atualmente nos planos de consumo do Linux.
Este tópico mostra como trabalhar com segredos do Cofre de Chaves do Azure no seu aplicativo Serviço de
Aplicativo ou no Aplicativo de Funções do Azure sem exigir alterações de código. Azure Key Vault é um serviço que
fornece gerenciamento centralizado de segredos, com controle total sobre políticas de acesso e histórico de
auditoria.
NOTE
No momento, as referências do Key Vault suportam apenas identidades gerenciadas atribuídas pelo sistema.
Identidades atribuídas pelo usuário não podem ser usadas.
3. Crie uma política de acesso no Key Vault para a identidade do aplicativo que você criou anteriormente. Ative
a permissão secreta "Obter" nesta política. Não defina o "aplicativo autorizado" ou as configurações
applicationId , pois isso não é compatível com uma identidade gerenciada.
NOTE
Key Vault referências não estão atualmente capazes de resolver segredos armazenados em um cofre de chaves com
restrições de rede.
Sintaxe de referência
Uma referência do Key Vault é da forma @Microsoft.KeyVault({referenceString}) , em que {referenceString} é
substituído por uma das seguintes opções:
VaultName = vaultName; SecretName = secretName; O VaultName deve ser o nome do seu recurso Key Vault. O
SecretVersion = secretVersion SecretName deve ser o nome do segredo de destino. O
SecretVersion deve ser a versão do segredo a ser usado.
Por exemplo, uma referência completa com a versão seria parecida com a seguinte:
@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
)
Como alternativa:
@Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret;SecretVersion=ec96f02080254f109c51a1f14cdb1931)
TIP
A maioria das configurações de aplicativos que usam referências do Key Vault deve ser marcada como configurações de slot,
pois você deve ter cofres separados para cada ambiente.
{
//...
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[variables('storageAccountName')]",
//...
},
{
"type": "Microsoft.Insights/components",
"name": "[variables('appInsightsName')]",
//...
},
{
"type": "Microsoft.Web/sites",
"name": "[variables('functionAppName')]",
"name": "[variables('functionAppName')]",
"identity": {
"type": "SystemAssigned"
},
//...
"resources": [
{
"type": "config",
"name": "appsettings",
//...
"dependsOn": [
"[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
"[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
"[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'),
variables('storageConnectionStringName'))]",
"[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'),
variables('appInsightsKeyName'))]"
],
"properties": {
"AzureWebJobsStorage": "[concat('@Microsoft.KeyVault(SecretUri=',
reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]",
"WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('@Microsoft.KeyVault(SecretUri=',
reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]",
"APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=',
reference(variables('appInsightsKeyResourceId')).secretUriWithVersion, ')')]",
"WEBSITE_ENABLE_SYNC_UPDATE_SITE": "true"
//...
}
},
{
"type": "sourcecontrols",
"name": "web",
//...
"dependsOn": [
"[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
"[resourceId('Microsoft.Web/sites/config', variables('functionAppName'),
'appsettings')]"
],
}
]
},
{
"type": "Microsoft.KeyVault/vaults",
"name": "[variables('keyVaultName')]",
//...
"dependsOn": [
"[resourceId('Microsoft.Web/sites', variables('functionAppName'))]"
],
"properties": {
//...
"accessPolicies": [
{
"tenantId": "[reference(concat('Microsoft.Web/sites/', variables('functionAppName'),
'/providers/Microsoft.ManagedIdentity/Identities/default'), '2015-08-31-PREVIEW').tenantId]",
"objectId": "[reference(concat('Microsoft.Web/sites/', variables('functionAppName'),
'/providers/Microsoft.ManagedIdentity/Identities/default'), '2015-08-31-PREVIEW').principalId]",
"permissions": {
"secrets": [ "get" ]
}
}
]
},
"resources": [
{
"type": "secrets",
"name": "[variables('storageConnectionStringName')]",
//...
"dependsOn": [
"[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
],
"properties": {
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountResourceId'),'2015-05-01-
preview').key1)]"
}
},
{
"type": "secrets",
"name": "[variables('appInsightsKeyName')]",
//...
"dependsOn": [
"[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
"[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
],
"properties": {
"value": "[reference(resourceId('microsoft.insights/components/',
variables('appInsightsName')), '2015-05-01').InstrumentationKey]"
}
}
]
}
]
}
NOTE
Neste exemplo, a implantação do controle de origem depende das configurações do aplicativo. Esse comportamento
normalmente é inseguro, pois a atualização da configuração do aplicativo se comporta de maneira assíncrona. No entanto,
como incluímos a configuração do aplicativo WEBSITE_ENABLE_SYNC_UPDATE_SITE , a atualização é síncrona. Isso significa que
a implantação do controle de origem só será iniciada quando as configurações do aplicativo tiverem sido totalmente
atualizadas.
O Azure Cosmos DB é uma ótima maneira de armazenar dados não estruturados e JSON. Combinado com o
Azure Functions, o Cosmos DB torna o armazenamento de dados rápido e fácil com muito menos código do que o
necessário para armazenar dados em um banco de dados relacional.
NOTE
Neste momento, o gatilho, as associações de entrada e as associações de saída do Azure Cosmos DB funcionam apenas com
contas da API do Graph e a API do SQL.
No Azure Functions, associações de entrada e saída fornecem uma maneira declarativa para se conectar a dados
de serviço externo de sua função. Neste artigo, saiba como atualizar uma função existente a fim de adicionar uma
associação de saída que armazena dados não estruturados em um documento do Azure Cosmos DB.
Pré-requisitos
Para concluir este tutorial:
Este tópico usa como ponto de partida os recursos criados em Criar sua primeira função no portal do Azure. Se
você ainda não fez isso, conclua estas etapas agora para criar seu aplicativo de funções.
2. Selecione Adicionar.
3. Na página Criar Conta do Azure Cosmos DB, insira as configurações básicas da nova conta do Azure
Cosmos.
API O tipo de conta a ser criada Selecione Núcleo (SQL) para criar
uma consulta e um banco de dados
de documento usando a sintaxe SQL.
Location A região mais próxima dos usuários Selecione uma localização geográfica
para hospedar a sua conta do Azure
Cosmos DB. Use a localização mais
próxima dos usuários para fornecer a
eles acesso mais rápido aos dados.
4. Selecione Examinar + criar. Você pode ignorar as seções Rede e Marcas.
5. Examine as configurações da conta e selecione Criar. São necessários alguns minutos para criar a conta.
Aguarde até que a página do portal exiba Sua implantação está concluída.
6. Selecione Ir para recurso para ir para a página da conta do Azure Cosmos DB.
Adicionar uma associação de saída
1. No portal, navegue até o aplicativo de funções que você criou anteriormente e expanda o aplicativo de
funções e a função.
2. Selecione Integrar e +Nova Saída, que está na parte superior direita da página. Escolha Azure Cosmos
DB e clique em Selecionar.
3. Se você receber uma mensagem de Extensões não instaladas, escolha Instalar para instalar a extensão
de associações do Azure Cosmos DB no aplicativo de funções. A instalação pode levar alguns minutos.
4. Use a configuração Saída do Azure Cosmos DB conforme especificado na tabela:
Se for true, cria o banco de dados Verificado A coleção ainda não existe, então crie
e a coleção do Cosmos DB uma.
Conexão de conta do Azure Nova configuração Selecione Novo e depois escolha sua
Cosmos DB Assinatura, a Conta de banco de
dados criada anteriormente e
Selecionar. Isso cria uma
configuração de aplicativo para sua
conexão de conta. Essa configuração
é usada pela associação para conexão
com o banco de dados.
#r "Newtonsoft.Json"
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
public static IActionResult Run(HttpRequest req, out object taskDocument, ILogger log)
{
string name = req.Query["name"];
string task = req.Query["task"];
string duedate = req.Query["duedate"];
Esse exemplo de código lê as cadeias de consulta da Solicitação HTTP e as atribui a campos no objeto
taskDocument . A associação taskDocument envia os dados do objeto desse parâmetro de associação para
armazenamento no banco de dados de documento associado. O banco de dados é criado na primeira execução da
função.
Você adicionou com êxito uma associação ao gatilho HTTP para armazenar dados não estruturados em um Azure
Cosmos DB.
Limpar recursos
Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você não espera precisar
desses recursos no futuro, poderá excluí-los ao excluir o grupo de recursos.
No menu do portal do Azure ou na página Inicial, selecione Grupos de Recursos e, na página Grupos de
Recursos, selecione myResourceGroup.
Na página myResourceGroup, certifique-se de que os recursos listados são aqueles que deseja excluir.
Selecione Excluir, digite myResourceGroup na caixa de texto e selecione Excluir.
Próximas etapas
Para saber mais sobre a associação a um banco de dados Cosmos DB, veja Associações do Azure Functions
Cosmos DB.
Conceitos de gatilhos e de associações do Azure Functions
Saiba como Functions se integra a outros serviços.
Referência do desenvolvedor do Azure Functions
Fornece informações mais técnicas sobre o tempo de execução do Functions e uma referência para funções de
codificação e definição de associações e gatilhos.
Codificar e testar o Azure Functions localmente
Descreve as opções para desenvolver suas funções localmente.
Adicionar uma associação de fila do Armazenamento
do Azure à sua função do Python
24/10/2019 • 14 minutes to read • Edit Online
O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever
seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na
definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo
especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações
de entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.
Este artigo mostra como integrar a função criada no artigo de início rápido anterior com uma fila de
Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados de uma
solicitação HTTP em uma mensagem na fila.
A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço
vinculado. Para facilitar essa conexão, use a conta de armazenamento que você criou com o seu aplicativo de
funções. A conexão com essa conta já está armazenada em uma configuração de aplicativo chamada
AzureWebJobsStorage .
Pré-requisitos
Antes de iniciar este artigo, conclua as etapas na parte 1 do início rápido do Python.
NOTE
Os comandos da CLI do Azure neste artigo funcionam em Bash e são verificados para serem executados no Azure Cloud
Shell. Você deve modificá-los para eles serem executados em um prompt de comando local do Windows.
IMPORTANT
Esse comando substitui todas as configurações existentes por valores do aplicativo de funções no Azure.
Como ela contém segredos, o arquivo local.settings.json nunca é publicado e deve ser excluído do controle do código-fonte.
É necessário ter o valor AzureWebJobsStorage , que é a cadeia de conexão da Conta de armazenamento. Use esta
conexão para verificar se a associação de saída funciona conforme o esperado.
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Selecionar associação com Azure Queue Storage A associação é uma associação de fila
direção... do Armazenamento do Azure.
O nome usado para identificar essa msg Nome que identifica o parâmetro de
associação em seu código associação referenciado em seu código.
Uma associação é incluída na matriz bindings no seu arquivo function.json, que agora deve se parecer com o
seguinte exemplo:
{
...
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')
if name:
msg.set(name)
return func.HttpResponse(f"Hello {name}!")
else:
return func.HttpResponse(
"Please pass a name on the query string or in the request body",
status_code=400
)
Ao usar uma associação de saída, não é necessário usar o código do SDK do Armazenamento do Azure para se
autenticar, para obter uma referência de fila ou para escrever dados. O tempo de execução do Functions e a
associação de saída da fila fazem essas tarefas para você.
NOTE
Como você habilitou os pacotes de extensões no host.json, a extensão de associação do armazenamento foi baixada e
instalada para você durante a inicialização, juntamente com outras extensões de associação da Microsoft.
Copie a URL da função HttpTrigger da saída do tempo de execução de função e cole-a na barra de endereços do
navegador. Acrescente o valor de cadeia de consulta ?name=<yourname> a essa URL e execute a solicitação. Você
deve ver a mesma resposta no navegador como você viu no artigo anterior.
Dessa vez, a associação de saída também cria uma fila denominada outqueue em sua Conta de armazenamento e
adiciona uma mensagem com essa mesma cadeia de caracteres.
Em seguida, use a CLI do Azure para exibir a nova fila e verifique se uma mensagem foi adicionada. Também é
possível exibir sua fila usando o Gerenciador de Armazenamento do Microsoft Azure ou no portal do Azure.
Definir a conexão da Conta de armazenamento
Abra o arquivo local.settings.json e copie o valor de AzureWebJobsStorage , que é a cadeia de conexão da Conta de
armazenamento. Defina a variável de ambiente AZURE_STORAGE_CONNECTION_STRING como a cadeia de conexão
usando o seguinte comando do Bash:
AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"
Quando você definir a cadeia de conexão na variável de ambiente AZURE_STORAGE_CONNECTION_STRING , é possível
acessar a conta de Armazenamento sem ter que fornecer a autenticação toda vez.
Consultar a Fila de armazenamento
É possível usar o comando az storage queue list para exibir as Filas de armazenamento em sua conta, como no
exemplo a seguir:
A saída desse comando inclui uma fila denominada outqueue , que é a fila que foi criada quando a função foi
executada.
Em seguida, use o comando az storage message peek para exibir as mensagens nessa fila, como no exemplo a
seguir:
echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --
decode`
A cadeia de caracteres retornada deve ser a mesma que a mensagem enviada para testar a função.
NOTE
O exemplo anterior decodifica a cadeia de caracteres retornada de base64. Isso ocorre porque as associações de
Armazenamento de fila gravam e leem do Armazenamento do Azure como cadeias de caracteres base64.
Reimplantar o projeto
Para atualizar o aplicativo publicado, use o comando func azure functionapp publish do Core Tools para
implantar o código do projeto no Azure. Nesse exemplo, substitua <APP_NAME> pelo nome de seu aplicativo.
Novamente, é possível usar cURL ou um navegador para testar a função implantada. Como antes, acrescente a
cadeia de caracteres de consulta &name=<yourname> à URL, como mostrado no exemplo a seguir:
curl https://myfunctionapp.azurewebsites.net/api/httptrigger?code=cCr8sAxfBiow548FBDLS1....&name=<yourname>
Examine a mensagem da Fila de armazenamento novamente para verificar se a associação de saída gera uma
nova mensagem na fila, conforme esperado.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja continuar com Inícios Rápidos
ou tutoriais subsequentes, não limpe os recursos criados neste Início Rápido. Se você não planeja continuar, use o
comando a seguir para excluir todos os recursos criados neste Início Rápido:
Próximas etapas
Você atualizou a função disparada por HTTP para gravar dados em uma fila de armazenamento. Para saber mais
sobre como desenvolver o Azure Functions usando o Python, confira o Guia do desenvolvedor de Python para o
Azure Functions e Gatilhos e associações do Azure Functions. Para obter exemplos de projetos de funções
completos no Python, confira os Exemplos de funções de Python.
Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções:
Habilitar a integração do Application Insights
Adicionar mensagens a uma fila do Armazenamento
do Azure usando o Functions
24/10/2019 • 12 minutes to read • Edit Online
No Azure Functions, as associações de entrada e saída fornecem uma maneira declarativa para criar dados a
partir de serviços externos disponíveis ao seu código. Neste guia de início rápido, é possível usar uma associação
de saída para criar uma mensagem em uma fila quando uma função é disparada por uma solicitação HTTP. Use
o Gerenciador de Armazenamento do Azure para exibir as mensagens em fila que sua função cria:
Pré-requisitos
Para concluir este guia de início rápido:
Siga as instruções em Criar sua primeira função no portal do Azure e não realize a etapa Limpar
recursos. Este início rápido cria o aplicativo de funções e a função que você usa aqui.
Instale o Gerenciador de Armazenamento do Microsoft Azure. Esta é uma ferramenta que você usará para
examinar a fila de mensagens cuja sua associação de saída cria.
5. Se você receber uma mensagem de Extensões não instaladas, escolha Instalar para instalar a extensão
Associações de armazenamento no aplicativo de funções. Isso pode levar alguns minutos.
No corpo da função, imediatamente antes da instrução return , adicione o código que usa o parâmetro
para criar uma mensagem da fila.
Testar a função
1. Depois que as alterações de código forem salvas, selecione Executar.
Observe que o Corpo da solicitação contém o valor de name Azure. Esse valor aparece na mensagem
da fila que é criada quando a função é invocada.
Como uma alternativa para selecionar Executar aqui, você pode chamar a função inserindo uma URL em
um navegador e especificando o valor name na cadeia de consulta. O método de navegador é mostrado
no guia de início rápido anterior.
2. Confira os logs para verificar se a função foi bem-sucedida.
Uma nova fila denominada outqueue é criada na sua conta de armazenamento pelo tempo de execução do
Functions quando a associação de saída é usada pela primeira vez. Você usará o Gerenciador de Armazenamento
para verificar se a fila e uma mensagem nela foram criadas.
Conectar o Gerenciador de Armazenamento à sua conta
Ignore esta seção caso já tenha instalado o Gerenciador de Armazenamento e o conectado à conta de
armazenamento sendo usada neste guia de início rápido.
1. Execute a ferramenta Gerenciador de Armazenamento do Microsoft Azure, selecione o ícone conectar-se à
esquerda, escolha Usar um nome e chave de conta de armazenamento e selecione Avançar.
2. No portal do Azure, na página de aplicativo de funções, selecione a função e depois Integrar.
3. Selecione a associação de saída do Armazenamento de fila do Azure que você adicionou em uma
etapa anterior.
4. Expanda a seção Documentação na parte inferior da página.
O portal mostra as credenciais que você pode usar no Gerenciador de Armazenamento para se conectar à
conta de armazenamento.
5. Copie o valor Nome da Conta do portal e cole-o na caixa Nome da conta no Gerenciador de
Armazenamento.
6. Clique no ícone mostrar/ocultar ao lado da Chave de Conta para exibir o valor e depois copie o valor
Chave de Conta e cole-o na caixa Chave de conta no Gerenciador de Armazenamento.
7. Selecione Próximo > Conectar.
Examinar a fila de saída
1. No Gerenciador de Armazenamento, selecione a conta de armazenamento sendo usada para este guia de
início rápido.
2. Expanda o nó Filas e selecione a fila denominada outqueue.
A fila contém a mensagem que a associação de saída de fila criou quando você executou a função
disparada por HTTP. Se você tiver invocado a função com o valor name padrão do Azure, a mensagem da
fila será Nome transmitido à função: Azure.
3. Execute a função novamente e você verá uma nova mensagem exibida na fila.
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los
desta maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Neste guia de início rápido, você adicionou uma associação de saída a uma função existente. Para obter mais
informações sobre associação a Armazenamento de Filas, consulte Associações de fila do Armazenamento do
Azure Functions.
Conceitos de gatilhos e de associações do Azure Functions
Saiba como Functions se integra a outros serviços.
Referência do desenvolvedor do Azure Functions
Fornece informações mais técnicas sobre o tempo de execução do Functions e uma referência para funções
de codificação e definição de associações e gatilhos.
Codificar e testar o Azure Functions localmente
Descreve as opções para desenvolver suas funções localmente.
Conectar funções ao Armazenamento do Azure
usando o Visual Studio Code
24/10/2019 • 20 minutes to read • Edit Online
O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever
seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na
definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo
especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações
de entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.
Este artigo mostra como usar Visual Studio Code para conectar a função criada no artigo de início rápido anterior
ao Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados da solicitação
HTTP em uma mensagem na fila.
A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço
vinculado. Para facilitar, use a Conta de armazenamento que você criou com o seu aplicativo de funções. A conexão
com essa conta já está armazenada em uma configuração de aplicativo chamada AzureWebJobsStorage .
Pré-requisitos
Antes de iniciar este artigo, você deve atender aos seguintes requisitos:
Instale a extensão de Armazenamento do Azure para o Visual Studio Code.
Instale o Gerenciador de Armazenamento do Azure. O Gerenciador de Armazenamento é uma ferramenta que
você usará para examinar as mensagens da fila geradas pela associação de saída. O Gerenciador de
Armazenamento tem suporte em sistemas operacionais baseados em macOS, Windows e Linux.
Instale ferramentas de CLI do .NET Core (somente projetos C#).
Conclua as etapas na parte 1 do início rápido do Visual Studio Code.
Este artigo pressupõe que você já esteja conectado à sua assinatura do Azure do Visual Studio Code. Você pode
entrar executando Azure: Sign In na paleta de comandos.
2. Escolha o aplicativo de função que você criou no artigo anterior. Selecione Sim para todos para substituir
as configurações locais existentes.
IMPORTANT
Como ela contém segredos, o arquivo local.settings.json nunca é publicado e é excluído do controle do código-fonte.
3. Copie o valor AzureWebJobsStorage , que é a chave do valor da cadeia de conexão da Conta de
armazenamento. Use esta conexão para verificar se a associação de saída funciona conforme o esperado.
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Selecionar associação com Azure Queue Storage A associação é uma associação de fila
direção... do Armazenamento do Azure.
O nome usado para identificar essa msg Nome que identifica o parâmetro de
associação em seu código associação referenciado em seu código.
PROMPT VALOR DESCRIÇÃO
Uma associação é incluída na matriz bindings no seu arquivo function.json, que agora deve se parecer com o
seguinte exemplo:
{
...
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
3. Cole a URL para a solicitação HTTP na barra de endereços do navegador. Acrescente o valor de cadeia de
consulta ?name=<yourname> a essa URL e execute a solicitação. A execução é pausada quando o ponto de
interrupção é atingido.
4. Quando você continua a execução, o exemplo a seguir mostra a resposta no navegador à solicitação GET:
5. Para interromper a depuração, pressione Shift + F5.
Uma nova fila denominada outqueue é criada na sua conta de armazenamento pelo tempo de execução do
Functions quando a associação de saída é usada pela primeira vez. Você usará o Gerenciador de Armazenamento
para verificar se a fila foi criada junto com a nova mensagem.
Conectar o Gerenciador de Armazenamento à sua conta
Ignore esta seção se você já instalou o Gerenciador de Armazenamento do Azure e o conectou à sua conta do
Azure.
1. Execute a ferramenta Gerenciador de Armazenamento do Azure, selecione o ícone de conexão à esquerda e
selecione Adicionar uma conta.
2. Na caixa de diálogo Conectar, escolha Adicionar uma conta do Azure, escolha seu Ambiente do Azure
e selecione Entrar... .
Depois de entrar na sua conta, você verá todas as assinaturas do Azure associadas à ela.
Examinar a fila de saída
1. No Visual Studio Code, pressione a tecla F1 para abrir a paleta de comandos, em seguida, procure e execute
o comando Azure Storage: Open in Storage Explorer e escolha o nome da sua conta de armazenamento.
Sua conta de armazenamento é aberta no Gerenciador de Armazenamento do Azure.
2. Expanda o nó Filas e selecione a fila denominada outqueue.
A fila contém a mensagem que a associação de saída de fila criou quando você executou a função disparada
por HTTP. Se você tiver invocado a função com o valor name padrão do Azure, a mensagem da fila será
Nome transmitido à função: Azure.
3. Execute a função novamente, envie outra solicitação e você verá uma nova mensagem na fila.
Agora, chegou a hora de republicar o aplicativo de funções atualizado no Azure.
curl https://myfunctionapp.azurewebsites.net/api/httptrigger?code=cCr8sAxfBiow548FBDLS1....&name=
<yourname>
4. Novamente, Examinar a Mensagem da fila de armazenamento para verificar se a associação de saída gera
novamente uma nova mensagem na fila.
Limpar recursos
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los
desta maneira:
1. No Visual Studio Code, pressione F1 para abrir a paleta de comandos. Na paleta de comandos, pesquise e
selecione Azure Functions: Open in portal .
2. Escolha seu aplicativo de funções e pressione Enter. A página do aplicativo de funções é aberta no portal do
Azure.
3. Na guia Visão geral, selecione o link nomeado em Grupo de Recursos.
4. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
5. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você atualizou sua função disparada por HTTP para gravar dados em uma Fila de armazenamento. Para saber
mais sobre o desenvolvimento de funções, confira Desenvolver Funções do Azure usando o Visual Studio Code.
Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções:
Habilitar a integração do Application Insights
Conectar funções ao Armazenamento do Azure
usando o Visual Studio
24/10/2019 • 13 minutes to read • Edit Online
O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever
seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na
definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo
especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações
de entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.
Este artigo mostra como usar Visual Studio para conectar a função criada no artigo de Início Rápido anterior do
Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados da solicitação
HTTP em uma mensagem na fila.
A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço
vinculado. Para facilitar, use a Conta de armazenamento que você criou com o seu aplicativo de funções. A conexão
com essa conta já está armazenada em uma configuração de aplicativo chamada AzureWebJobsStorage .
Pré-requisitos
Antes de iniciar este artigo, você deve:
Concluir a [parte 1 do Início Rápido do Visual Studio][./functions-create-first-function-vs-code.md].
Entrar em sua assinatura do Azure por meio do Visual Studio.
using Microsoft.Azure.WebJobs.Extensions.Storage;
O parâmetro msg é um tipo ICollector<T> , que representa uma coleção de mensagens que são gravadas em
uma associação de saída quando a função é concluída. Nesse caso, a saída é uma fila de armazenamento
denominada outqueue . A cadeia de conexão para a Conta de armazenamento é definida pelo
StorageAccountAttribute . Esse atributo indica a configuração que contém a cadeia de conexão da Conta de
armazenamento e pode ser aplicada no nível de classe, método ou parâmetro. Nesse caso, você poderia omitir
StorageAccountAttribute porque já está usando a conta de armazenamento padrão.
[FunctionName("HttpTrigger")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, ILogger log)
if (!string.IsNullOrEmpty(name))
{
// Add a message to the output collection.
msg.Add(string.Format("Name passed to the function: {0}", name));
}
[FunctionName("HttpTrigger")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
if (!string.IsNullOrEmpty(name))
{
// Add a message to the output collection.
msg.Add(string.Format("Name passed to the function: {0}", name));
}
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
Limpar recursos
Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja trabalhar com inícios rápidos
subsequentes, tutoriais ou com qualquer serviço criado por você nesse início rápido, não limpe os recursos.
Os Recursos no Azure se referem a aplicativos de funções, funções, contas de armazenamento e assim por diante.
Eles são agrupados em grupos de recursos, e você pode excluir tudo junto ao excluir o grupo.
Você criou recursos para concluir esses guias de início rápido. Você pode ser cobrado por esses recursos,
dependendo do status de conta e preços do serviço. Caso não precise mais dos recursos, é possível excluí-los
desta maneira:
1. No portal do Azure, vá até a página Grupo de recursos.
Para ir até essa página a partir da página de aplicativo de funções, selecione a guia Visão geral e depois
selecione o link em Grupo de recursos.
Para ir até essa página a partir do painel, selecione Grupos de recursos e depois selecione o grupo de
recursos que você usou para esse guia de início rápido.
2. Na página Grupo de recursos, examine a lista de recursos incluídos e verifique se eles são aqueles que
deseja excluir.
3. Selecione Excluir grupo de recursos e siga as instruções.
A exclusão poderá levar alguns minutos. Ao ser concluída, uma notificação será exibida por alguns
segundos. Também é possível selecionar o ícone de sino na parte superior da página para exibir a
notificação.
Próximas etapas
Você atualizou sua função disparada por HTTP para gravar dados em uma Fila de armazenamento. Para saber
mais sobre o desenvolvimento do Functions, confira Desenvolver o Azure Functions usando o Visual Studio.
Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções:
Habilitar a integração do Application Insights
Usar o Azure Functions para conectar a um banco de
dados SQL do Azure
25/05/2018 • 10 minutes to read • Edit Online
Este artigo mostra como usar Azure Functions para criar um trabalho agendado que se conecta a um banco de
dados SQL do Azure ou Instância Gerenciada SQL do Azure. O código de função limpa as linhas em uma tabela
no banco de dados. A nova C# função é criada com base em um modelo de gatilho de temporizador predefinido
no Visual Studio 2019. Para dar suporte a esse cenário, você também precisa definir uma cadeia de conexão de
banco de dados como uma configuração de aplicativo no aplicativo de funções. Para o Azure SQL Instância
Gerenciada você precisa habilitar o ponto de extremidade público para poder se conectar de Azure functions. Esse
cenário usa uma operação em massa no banco de dados.
Se esta for sua primeira experiência trabalhando com funções C#, você deverá ler a Referência do desenvolvedor
de C# do Azure Functions.
Pré-requisitos
Conclua as etapas no artigo Criar sua primeira função usando o Visual Studio para criar um aplicativo de
funções local destinado ao tempo de execução versão 2.x. Você também precisa ter publicado seu projeto
em um aplicativo de funções no Azure.
Este artigo demonstra um comando Transact-SQL que executa uma operação de limpeza em massa na
tabela SalesOrderHeader no banco de dados de amostra AdventureWorksLT. Para criar o banco de dados
de amostra AdventureWorksLT, conclua as etapas no artigo Criar um Banco de Dados SQL do Azure no
portal do Azure.
Você precisa adicionar uma regra de firewall no nível do servidor para o endereço IP público do
computador que usou para este início rápido. Essa regra é necessária para que seja possível acessar a
instância do Banco de Dados SQL do seu computador local.
3. Na caixa de diálogo Nova função do Azure, escolha Gatilho de temporizador e, em seguida, OK. Essa
caixa de diálogo cria um arquivo de código para a função disparada por temporizador.
4. Abra o novo arquivo de código e adicione o seguinte, usando as instruções na parte superior do arquivo:
using System.Data.SqlClient;
using System.Threading.Tasks;
Esta função é executada a cada 15 segundos para atualizar a coluna Status com base na data de envio.
Para saber mais sobre o Gatilho de temporizador, veja Gatilho de temporizador para o Azure Functions.
6. Pressione F5 para iniciar o aplicativo de funções. A janela de execução das Azure Functions Core Tools é
aberta atrás do Visual Studio.
7. Passados 15 segundos da inicialização, a função é executada. Inspecione a saída e anote o número de linhas
atualizadas na tabela SalesOrderHeader.
Na primeira execução, você deve atualizar 32 linhas de dados. As execuções seguintes não atualizam
nenhuma linha de dados, a menos que você faça alterações aos dados da tabela SalesOrderHeader para
que mais linhas sejam selecionadas pela instrução UPDATE .
Se você planeja publicar essa função, lembre-se de alterar o atributo TimerTrigger para uma agenda de Cron mais
razoável do que a cada 15 segundos.
Próximas etapas
Em seguida, aprenda como usar. Functions com Aplicativos Lógicos para integração com outros serviços.
Criar uma função que se integra nos Aplicativos Lógicos
Para obter mais informações sobre o Functions, veja os seguintes artigos:
Referência do desenvolvedor do Azure Functions
Referência do programador para codificação de funções e definição de gatilhos e de associações.
Testando o Azure Functions
Descreve várias ferramentas e técnicas para testar suas funções.
2 minutes to read
2 minutes to read
Exportando uma API hospedada no Azure para o
PowerApps e o Microsoft Flow
24/10/2019 • 16 minutes to read • Edit Online
O PowerApps é um serviço para a criação e utilização de aplicativos comerciais personalizados que se conectam
aos seus dados e trabalham entre plataformas. O Microsoft Flow facilita a automação de fluxos de trabalho e
processos de negócios entre seus aplicativos e serviços favoritos. O PowerApps e o Microsoft Flow vêm com uma
variedade de conectores integrados para fontes de dados como Office 365, Dynamics 365, Salesforce e muito
mais. Em alguns casos, construtores de aplicativo e fluxo também querem se conectar a fontes de dados e APIs
criados por sua organização.
Da mesma forma, os desenvolvedores que desejam expor suas APIs mais amplamente dentro da organização
podem querer disponibilizá-las para construtores de aplicativos e fluxos. Este tópico mostra como exportar uma
API criada com o Azure Functions ou o Serviço de Aplicativo do Azure. A API exportada torna-se um conector
personalizado, usado no PowerApps e no Microsoft Flow, assim como um conector interno.
IMPORTANT
A funcionalidade de definição de API mostrada neste artigo só tem suporte para a versão 1. x dos aplicativos de tempo de
execução de Azure Functions e serviços de aplicativos. A versão 2. x das funções integra-se ao gerenciamento de API para
criar e manter definições de OpenAPI. Para saber mais, confira criar uma definição de openapi para uma função com o
gerenciamento de API do Azure.
NOTE
Também é possível criar conectores personalizados no PowerApps e no Microsoft Flow UI, sem o uso de uma definição
OpenAPI. Para obter mais informações, consulte Registrar e usar conectores personalizados no PowerApps e Registrar e usar
conectores personalizados no Microsoft Flow.
2. O botão Exportar para o PowerApps e para o Microsoft Flow deve estar disponível (se não estiver, crie
uma definição de OpenAPI primeiro). Clique neste botão para iniciar o processo de exportação.
CONFIGURAÇÃO DESCRIÇÃO
Nome da API personalizada Insira um nome, que será exibido para os construtores do
PowerApps e do Microsoft Flow na lista de conectores.
Este exemplo mostra a definição de segurança da chave de API incluída na definição de OpenAPI.
Agora que você exportou a definição de API, importe-a para criar um conector personalizado no PowerApps e no
Microsoft Flow. Os conectores personalizados são compartilhados entre os dois serviços, portanto, você só precisa
importar a definição uma vez.
Para importar a definição de API para o PowerApps e o Microsoft Flow, siga estas etapas:
1. Vá para powerapps.com ou flow.microsoft.com.
2. No canto superior direito, clique no ícone de engrenagem e clique em Conectores personalizados.
4. Insira um nome para o conector personalizado, navegue para a definição de OpenAPI que você exportou e
clique em Continuar.
5. Na guia Geral, revise as informações provenientes da definição de OpenAPI.
6. Na guia Segurança, se for solicitado que você forneça detalhes de autenticação, insira os valores corretos
para o tipo de autenticação. Clique em Continue.
Este exemplo mostra os campos obrigatórios para a autenticação da chave de API. Os campos são
diferentes dependendo do tipo de autenticação.
7. Na guia Definições, todas as operações definidas no arquivo OpenAPI são populadas automaticamente. Se
todas as suas operações necessárias forem definidas, você poderá ir para a próxima etapa. Caso contrário,
você pode adicionar e modificar as operações aqui.
Este exemplo tem uma operação, denominada CalculateCosts . Os metadados, como Descrição, vêm do
arquivo OpenAPI.
8. Clique em Criar conector na parte superior da página.
Agora, é possível se conectar ao conector personalizado no PowerApps e no Microsoft Flow. Para obter mais
informações sobre a criação de conectores nos portais do PowerApps e do Microsoft Flow, consulte Registrar o
conector personalizado no PowerApps e Registrar o conector personalizado no Microsoft Flow.
"securityDefinitions": {
"AAD": {
"type": "oauth2",
"flow": "accessCode",
"authorizationUrl": "https://login.windows.net/common/oauth2/authorize",
"scopes": {}
}
}
Durante a exportação, será necessário fornecer valores de configuração que permitem ao PowerApps e ao
Microsoft Flow autenticar usuários.
Esta seção aborda os tipos de autenticação com suporte no modo Expresso: Chave de API, Azure Active Directory
e OAuth 2.0 Genérico. O PowerApps e o Microsoft Flow também oferecem suporte à Autenticação Básica e ao
OAuth 2.0 para serviços específicos, como SalesForce, Facebook e Dropbox.
Chave de API
Ao utilizar uma chave de API, os usuários do conector deverão fornecer a chave ao criar uma conexão. Você
especifica um nome de chave de API para ajudá-los a reconhecer qual chave é necessária. No exemplo anterior,
usamos o nome API Key (contact meganb@contoso.com) para que as pessoas saibam onde obter informações sobre
a chave de API. No Azure Functions, a chave geralmente será uma das chaves de host que abrangem várias
funções dentro do aplicativo de funções.
Active Directory do Azure (Azure AD)
Ao usar o Azure AD, são necessários dois registros de aplicativo do Azure AD: um para a própria API e outro para
o conector personalizado:
Para configurar o registro da API, use o recurso de Autenticação/Autorização do Serviço de Aplicativo.
Para configurar o registro do conector, siga as etapas em Como adicionar um aplicativo do Azure AD. O
registro deve ter acesso delegado à sua API e um URL de resposta de
https://msmanaged-na.consent.azure-apim.net/redirect .
Para obter mais informações, consulte os exemplos de registro do Azure AD para PowerApps e Microsoft Flow.
Esses exemplos usam o Azure Resource Manager como a API. Se você seguir as etapas, substitua sua API.
Os valores de configuração a seguir são necessários:
ID do cliente – a ID do cliente do seu registro do Azure AD do conector
Segredo do cliente – o segredo do cliente do seu registro do Azure AD do conector
URL de logon – URL básica para o Azure AD. No Azure, isso é normalmente https://login.windows.net .
ID do locatário - o ID do locatário a ser usado para o logon. Isso deve ser "comum" ou a ID do locatário em
que o conector é criado.
URL de recurso – URL de recurso do seu registro do Azure AD da sua API
IMPORTANT
Caso outro indivíduo importe a definição de API para o PowerApps e o Microsoft Flow como parte do fluxo manual, será
necessário fornecer a ID do cliente e o segredo do cliente do registro do conector, assim como o URL de recurso da sua API.
Certifique-se de que esses segredos sejam gerenciados com segurança. Não compartilhe as credenciais de segurança da
API, propriamente dita.
IMPORTANT
Identidades gerenciadas para Serviço de Aplicativo e Azure Functions não se comportarão conforme o esperado se seu
aplicativo for migrado entre assinaturas/locatários. O aplicativo precisará obter uma nova identidade, que pode ser feita ao
desabilitar e reabilitar o recurso. Consulte removendo uma identidade abaixo. Recursos de downstream também precisará
ter políticas de acesso atualizadas para usar a nova identidade.
Este tópico mostra como criar uma identidade gerenciada para aplicativos do Serviço de Aplicativo e do Azure
Functions e como usá-la para acessar outros recursos. Uma identidade gerenciada do Azure Active Directory
permite que seu aplicativo acesse com facilidade outros recursos protegidos pelo AAD, como o Azure Key Vault. A
identidade é gerenciada pela plataforma do Azure e não exige provisionamento ou giro de nenhum segredo. Para
obter mais informações sobre identidades gerenciadas no AAD, veja Identidades gerenciadas para recursos do
Azure.
Seu aplicativo pode receber dois tipos de identidades:
Uma identidade atribuída pelo sistema é vinculada ao seu aplicativo e é excluída se o seu aplicativo for
excluído. Um aplicativo só pode ter uma identidade atribuída pelo sistema.
Uma identidade atribuída pelo usuário é um recurso do Azure independente que pode ser atribuído ao seu
aplicativo. Um aplicativo pode ter várias identidades atribuídas pelo usuário.
az login
2. Crie um aplicativo Web usando a CLI. Para ver mais exemplos de como usar a CLI com o Serviço de
Aplicativo, consulte Exemplos de CLI do Serviço de Aplicativo:
3. Execute o comando identity assign para criar a identidade para este aplicativo:
As etapas a seguir guiarão você pela criação de um aplicativo da Web e pela atribuição de uma identidade usando
o Azure PowerShell:
1. Se necessário, instale o Azure PowerShell usando a instrução encontrada no guia do Azure PowerShell e,
em seguida, execute Login-AzAccount para criar uma conexão com o Azure.
2. Crie um aplicativo da Web usando o Azure PowerShell. Para obter mais exemplos de como usar o Azure
PowerShell com o Serviço de Aplicativo, consulte Amostras do PowerShell do Serviço de Aplicativo :
3. Execute o comando Set-AzWebApp -AssignIdentity para criar a identidade para este aplicativo:
"identity": {
"type": "SystemAssigned"
}
NOTE
Um aplicativo pode ter identidades atribuídas pelo sistema e atribuídas pelo usuário ao mesmo tempo. Nesse caso, a type
propriedade seria SystemAssigned,UserAssigned
Adicionar o tipo atribuído pelo sistema diz ao Azure para criar e gerenciar a identidade do seu aplicativo.
Por exemplo, um aplicativo Web pode ser semelhante ao seguinte:
{
"apiVersion": "2016-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('appName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "SystemAssigned"
},
"properties": {
"name": "[variables('appName')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"hostingEnvironment": "",
"clientAffinityEnabled": false,
"alwaysOn": true
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
]
}
"identity": {
"type": "SystemAssigned",
"tenantId": "<TENANTID>",
"principalId": "<PRINCIPALID>"
}
No qual <TENANTID> e <PRINCIPALID> são substituídos por GUIDs. A propriedade tenantId identifica a qual
locatário do AAD a identidade pertence. O principalId é um identificador exclusivo para a nova identidade do
aplicativo. No AAD, a entidade de serviço tem o mesmo nome que você deu à sua instância do Serviço de
Aplicativo ou das Funções do Azure.
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {}
}
}
NOTE
Um aplicativo pode ter identidades atribuídas pelo sistema e atribuídas pelo usuário ao mesmo tempo. Nesse caso, a type
propriedade seria SystemAssigned,UserAssigned
Adicionando o tipo atribuído pelo usuário e um cotells do Azure para criar e gerenciar a identidade do seu
aplicativo.
Por exemplo, um aplicativo Web pode ser semelhante ao seguinte:
{
"apiVersion": "2016-08-01",
"type": "Microsoft.Web/sites",
"name": "[variables('appName')]",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
}
},
"properties": {
"name": "[variables('appName')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"hostingEnvironment": "",
"clientAffinityEnabled": false,
"alwaysOn": true
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
]
}
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<RESOURCEID>": {
"principalId": "<PRINCIPALID>",
"clientId": "<CLIENTID>"
}
}
}
No qual <PRINCIPALID> e <CLIENTID> são substituídos por GUIDs. O principalId é um identificador exclusivo para
a identidade que é usada para a administração do AAD. O clientId é um identificador exclusivo para a nova
identidade do aplicativo que é usado para especificar qual identidade usar durante as chamadas de runtime.
IMPORTANT
Talvez seja necessário configurar o recurso de destino para permitir o acesso do aplicativo. Por exemplo, se você solicitar um
token para o Key Vault, será necessário se certificar de que uma política de acesso que inclui a identidade do aplicativo foi
adicionada. Caso contrário, as chamadas para o Key Vault serão rejeitadas, mesmo se elas incluírem o token. Para saber mais
sobre os recursos que oferecem suporte a tokens do Azure Active Directory, veja Serviços do Azure que dão suporte à
autenticação do Azure AD.
Há um protocolo REST simples para obter um token no Serviço de Aplicativo e no Azure Functions. Isso pode ser
usado para todos os aplicativos e linguagens. Para alguns .NET e Java, o SDK do Azure fornece uma abstração
sobre esse protocolo e facilita uma experiência de desenvolvimento local.
Usar o protocolo REST
Um aplicativo com uma identidade gerenciada tem duas variáveis de ambiente definidas:
MSI_ENDPOINT: a URL para o serviço de token local.
MSI_SECRET: um cabeçalho usado para ajudar a reduzir os ataques de falsificação da solicitação do lado do
servidor (SSRF ). O valor é trocado pela plataforma.
A MSI_ENDPOINT é uma URL local da qual o aplicativo pode solicitar tokens. Para obter um token para um
recurso, solicite uma HTTP GET para esse ponto de extremidade, incluindo os seguintes parâmetros:
IMPORTANT
Se você estiver tentando obter tokens para identidades atribuídas pelo usuário, deverá incluir a propriedade clientid .
Caso contrário, o serviço de token tentará obter um token para uma identidade atribuída pelo sistema, que pode ou não
existir.
Uma resposta bem-sucedida de 200 OK inclui um corpo JSON com as seguintes propriedades:
Essa resposta é igual a resposta à solicitação do AAD de token de acesso de serviço para serviço.
NOTE
Variáveis de ambiente são configuradas quando o processo é iniciado pela primeira vez, então após habilitar a identidade
gerenciada para o seu aplicativo, você pode precisar reiniciar o aplicativo ou reimplantar o código dele antes que
MSI_ENDPOINT e MSI_SECRET estejam disponíveis para seu código.
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJ0eXAi…",
"expires_on": "09/14/2017 00:00:00 PM +00:00",
"resource": "https://vault.azure.net",
"token_type": "Bearer"
}
Exemplos de código
.NET
JavaScript
Python
PowerShell
TIP
Para as linguagens .NET, também é possível usar Microsoft.Azure.Services.AppAuthentication em vez de criar essa solicitação
por conta própria.
private readonly HttpClient _client;
// ...
public async Task<HttpResponseMessage> GetToken(string resource) {
var request = new HttpRequestMessage(HttpMethod.Get,
String.Format("{0}/?resource={1}&api-version=2017-09-01",
Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource));
request.Headers.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
return await _client.SendAsync(request);
}
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
// ...
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");
// OR
var kv = new KeyVaultClient(new
KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
Para saber mais sobre o Microsoft.Azure.Services.AppAuthentication e as operações que ele expõe, consulte a
Referência Microsoft.Azure.Services.AppAuthentication e Serviço de Aplicativo e KeyVault com a amostra MSI
.NET.
Usando o SDK do Azure para Java
Para aplicativos e funções Java, a maneira mais simples de trabalhar com uma identidade gerenciada é por meio
do SDK do Azure para Java. Esta seção mostra a você como começar a usar a biblioteca no seu código.
1. Adicione uma referência à biblioteca do SDK do Azure. Para projetos Maven, você pode adicionar esse
trecho à seção dependencies do arquivo POM do projeto:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure</artifactId>
<version>1.23.0</version>
</dependency>
2. Use o objeto AppServiceMSICredentials para autenticação. Este exemplo mostra como esse mecanismo
pode ser usado para trabalhar com Azure Key Vault:
import com.microsoft.azure.AzureEnvironment;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.keyvault.Vault
//...
Azure azure = Azure.authenticate(new AppServiceMSICredentials(AzureEnvironment.AZURE))
.withSubscription(subscriptionId);
Vault myKeyVault = azure.vaults().getByResourceGroup(resourceGroup, keyvaultName);
"identity": {
"type": "None"
}
Remover uma identidade atribuída pelo sistema dessa maneira também a excluirá do AAD. As identidades
atribuídas pelo sistema também são automaticamente removidas do AAD quando o recurso do aplicativo é
excluído.
NOTE
Há também uma configuração de aplicativo que pode ser definida, WEBSITE_DISABLE_MSI, que apenas desativa o serviço de
token local. No entanto, ele deixa a identidade no local e ferramentas ainda mostrará a identidade gerenciada como "ligada"
ou "habilitada". Como resultado, o uso dessa configuração não é recomendado.
Próximos passos
Acesse o Banco de Dados SQL com segurança usando uma identidade gerenciada
Personalizar um ponto de extremidade HTTP no
Azure Functions
24/10/2019 • 14 minutes to read • Edit Online
Neste artigo, você aprende como Azure Functions permite que você crie APIs altamente escalonáveis. O Azure
Functions vem com uma coleção interna de gatilhos e associações HTTP que facilitam a criação de um ponto de
extremidade em várias linguagens, incluindo Node.JS, C# e muito mais. Neste artigo, você personalizará um
gatilho HTTP para manipular ações específicas em seu design de API. Você também preparará a expansão de sua
API integrando-a aos Proxies do Azure Functions e configurando APIs de simulação. Tudo isso é realizado no
ambiente de computação sem servidor do Functions, portanto você não precisa se preocupar com o
dimensionamento de recursos, você pode se concentrar apenas na lógica de sua API.
Pré-requisitos
Este tópico usa como ponto de partida os recursos criados em Criar sua primeira função no portal do Azure. Se
você ainda não fez isso, conclua estas etapas agora para criar seu aplicativo de funções.
A função resultante será usada para o restante deste artigo.
Entrar no Azure
Abra o portal do Azure. Para fazer isso, entre no https://portal.azure.com com sua conta do Azure.
NOTE
Observe que você não incluiu o prefixo de caminho base /api no modelo de rota, pois isso é tratado por uma
configuração global.
3. Clique em Salvar.
Você pode aprender mais sobre a personalização de funções HTTP em Associações de HTTP do Azure Functions.
Testar sua API
Em seguida, teste sua função para vê-la funcionando com a nova superfície de API.
1. Navegue de volta para a página de desenvolvimento clicando no nome da função no painel de navegação
esquerdo.
2. Clique em Obter URL de função e copie a URL. Você verá que agora ela usa a rota /api/hello .
3. Copie a URL em uma nova guia do navegador ou o cliente REST preferencial. Navegadores usarão GET por
padrão.
4. Adicione parâmetros à cadeia de consulta na URL, por exemplo, /api/hello/?name=John
5. Pressione “Enter” para confirmar se ela está funcionando. Você deverá ver a resposta “Hello John”
6. Você também pode tentar chamar o ponto de extremidade com outro método HTTP para confirmar a não
execução da função. Para isso, será necessário usar um cliente REST, como cURL, Postman ou Fiddler.
NOTE
As configurações do aplicativo são recomendadas para a configuração do host a fim de evitar uma dependência do
ambiente embutida no código para o proxy. Usar configurações do aplicativo significa que você pode mover a
configuração do proxy entre ambientes, e as configurações de aplicativo específicas ao ambiente serão aplicadas.
4. Clique em Salvar.
Criar um proxy no front-end
1. Navegue novamente até seu aplicativo de função front-end no portal.
2. No painel de navegação esquerdo, clique no sinal '+' ao lado de "Proxies".
4. Observe que os Proxies não fornecem o prefixo de caminho base /api , e ele deve ser incluído no modelo
de rota.
5. A sintaxe %HELLO_HOST% fará referência a configuração do aplicativo que você criou anteriormente. A URL
resolvida apontará para sua função original.
6. Clique em Criar.
7. Você pode testar seu novo proxy copiando a URL do Proxy e o testando no navegador ou com seu cliente
HTTP favorito.
a. Para uma função anônima, use:
a. https://YOURPROXYAPP.azurewebsites.net/api/remotehello?name="Proxies"
b. Para uma função com autorização, use:
a. https://YOURPROXYAPP.azurewebsites.net/api/remotehello?code=YOURCODE&name="Proxies"
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"HelloProxy": {
"matchCondition": {
"route": "/api/remotehello"
},
"backendUri": "https://%HELLO_HOST%/api/hello"
}
}
}
Em seguida, você adicionará sua API de simulação. Substitua o arquivo proxies.json pelo seguinte:
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"HelloProxy": {
"matchCondition": {
"route": "/api/remotehello"
},
"backendUri": "https://%HELLO_HOST%/api/hello"
},
"GetUserByName" : {
"matchCondition": {
"methods": [ "GET" ],
"route": "/api/users/{username}"
},
"responseOverrides": {
"response.statusCode": "200",
"response.headers.Content-Type" : "application/json",
"response.body": {
"name": "{username}",
"description": "Awesome developer and master of serverless APIs",
"skills": [
"Serverless",
"APIs",
"Azure",
"Cloud"
]
}
}
}
}
}
Isso adiciona um novo proxy "GetUserByName", sem a propriedade backendUri. Em vez de chamar outro recurso,
ele modifica a resposta padrão dos Proxies usando uma substituição de resposta. Substituições de solicitação e
resposta também podem ser usadas em conjunto com uma URL de back-end. Isso é particularmente útil ao
transmitir por proxy para um sistema herdado, quando talvez você precise modificar cabeçalhos, consultar
parâmetros etc. Para saber mais sobre as substituições de solicitação e resposta, Confira Modificar solicitações e
respostas em Proxies.
Teste sua API de simulação chamando o ponto de extremidade
<YourProxyApp>.azurewebsites.net/api/users/{username} usando um navegador ou seu cliente REST favorito. Não
deixe de substituir {username} por um valor de cadeia de caracteres que represente um nome de usuário.
Próximas etapas
Neste artigo, você aprendeu como criar e personalizar uma API no Azure Functions. Você também aprendeu a
unir várias APIs, incluindo objetos fictícios, como uma superfície de API unificada. Use essas técnicas para
compilar APIs de qualquer complexidade durante a execução no modelo de computação sem servidor fornecido
pelo Azure Functions.
As referências a seguir podem ser úteis durante o desenvolvimento de sua API:
Associações de HTTP do Azure Functions
Trabalhar com Proxies do Azure Functions
Documentar uma API do Azure Functions (visualização)
Gerenciando ambientes híbridos com o PowerShell
no Azure Functions e no serviço de aplicativo
Conexões Híbridas
24/10/2019 • 12 minutes to read • Edit Online
O recurso Conexões Híbridas do serviço de Azure App permite o acesso a recursos em outras redes. Você pode
saber mais sobre esse recurso na documentação do conexões híbridas . Este artigo descreve como usar essa
funcionalidade para executar funções do PowerShell direcionadas a um servidor local. Esse servidor pode então
ser usado para gerenciar todos os recursos no ambiente local por meio de uma função Azure PowerShell.
# Create firewall rule for WinRM. The default HTTPS port is 5986.
New-NetFirewallRule -Name "WinRM HTTPS" `
-DisplayName "WinRM HTTPS" `
-Enabled True `
-Profile "Any" `
-Action "Allow" `
-Direction "Inbound" `
-LocalPort 5986 `
-Protocol "TCP"
Nome do aplicativo Nome globalmente exclusivo Nome que identifica seu novo
aplicativo de funções. Os caracteres
válidos são a-z , 0-9 e - .
4. Insira informações sobre a conexão híbrida conforme mostrado logo após a captura de tela a seguir. Você
tem a opção de fazer com que a configuração de host do ponto de extremidade corresponda ao nome do
host do servidor local para facilitar a memorização do servidor mais tarde, quando você estiver executando
comandos remotos. A porta corresponde à porta padrão do serviço de gerenciamento remoto do Windows
que foi definida no servidor anteriormente.
Restart-Service HybridConnectionManager
3. Expanda nova configuração de aplicativo para criar uma nova configuração para a senha.
4. Nomeie a configuração _ContosoUserPassword_e insira a senha.
5. Selecione OK e, em seguida, salvar para armazenar a senha no aplicativo de funções.
Criar um gatilho http de função para teste
1. Crie uma nova função de gatilho HTTP do aplicativo de funções.
$Script = {
Param(
[Parameter(Mandatory=$True)]
[String] $Service
)
Get-Service $Service
}
# The remote server that will be connected to run remote PowerShell commands on
$RemoteServer = "finance2".
Write-Output "Use hybrid connection server as a jump box to connect to a remote machine"
# We are registering an endpoint that runs under credentials ($Credential) that has access to the remote
server.
$SessionName = "HybridSession"
$ScriptCommand = {
param (
[Parameter(Mandatory=$True)]
$SessionName)
# Script to run on the jump box to run against the second machine.
$RemoteScriptCommand = {
param (
[Parameter(Mandatory=$True)]
$ComputerName)
# Write out the hostname of the hybrid connection server.
hostname
# Write out the hostname of the remote server.
Invoke-Command -ComputerName $ComputerName -Credential $Using:Credential -ScriptBlock {hostname} `
-UseSSL -Port 5986 -SessionOption (New-PSSessionOption -SkipCACheck)
}
Write-Output "Running command against remote machine via jumpbox by connecting to the PowerShell configuration
session"
Invoke-Command -ComputerName $HybridEndpoint `
-Credential $Credential `
-Port 5986 `
-UseSSL `
-ScriptBlock $RemoteScriptCommand `
-ArgumentList $RemoteServer `
-SessionOption (New-PSSessionOption -SkipCACheck) `
-ConfigurationName $SessionName
Substitua as seguintes variáveis neste script pelos valores aplicáveis do seu ambiente:
$HybridEndpoint
$RemoteServer
Nos dois cenários anteriores, você pode conectar e gerenciar seus ambientes locais usando o PowerShell em Azure
Functions e Conexões Híbridas. Incentivamos você a aprender mais sobre o conexões híbridas e o PowerShell no
functions.
Você também pode usar redes virtuais do Azure para se conectar ao seu ambiente local por meio de Azure
functions.
Próximas etapas
Saiba mais sobre como trabalhar com funções do PowerShell
Como solucionar o problema "Functions Runtime
inacessível"
24/10/2019 • 6 minutes to read • Edit Online
Texto do erro
Este documento é indicado para solucionar o erro a seguir quando exibido no portal do Functions.
Error: Azure Functions Runtime is unreachable. Click here for details on storage configuration
Resumo
Esse problema ocorre quando o Azure Functions Runtime não pode ser iniciado. O motivo mais comum para que
esse erro ocorra é quando o aplicativo de funções perde o acesso à sua conta de armazenamento. Leia mais sobre
os requisitos da conta de armazenamento aqui
Solução de problemas
Vamos percorrer os quatro casos de erro mais comuns e aprender como identificar e resolver cada caso.
1. Conta de armazenamento excluída
2. Configurações de aplicativo da conta de armazenamento excluídas
3. Credenciais da conta de armazenamento inválidas
4. Conta de armazenamento inacessível
5. Cota de execução diária total
Próximas etapas
Agora que seu aplicativo de funções retornou e está operacional, confira nossos guias de início rápido e nossas
referências para o desenvolvedor para colocá-lo em funcionamento novamente!
Criar sua primeira Função do Azure
Crie diretamente sua primeira função usando o início rápido do Azure Functions.
Referência do desenvolvedor do Azure Functions
Fornece informações mais técnicas sobre o tempo de execução do Azure Functions e uma referência para
funções de codificação e definição de associações e gatilhos.
Testando o Azure Functions
Descreve várias ferramentas e técnicas para testar suas funções.
Como escalar o Azure Functions
Discute os planos de serviço disponíveis com o Azure Functions, incluindo o plano de hospedagem de consumo
e como escolher o plano certo.
Saiba mais sobre o Serviço de Aplicativo do Azure
O Azure Functions aproveita o Serviço de Aplicativo do Azure para a funcionalidade básica como implantações,
variáveis de ambiente e diagnóstico.
Referência de configurações de aplicativo para
Azure Functions
01/11/2019 • 12 minutes to read • Edit Online
As configurações de aplicativo em um aplicativo de funções contém opções de configuração global que afetam
todas as funções desse aplicativo de funções. Quando você executa localmente, essas configurações são
acessadas como variáveis de ambiente. Este artigo lista as configurações de aplicativo disponíveis nos
aplicativos de funções.
Há várias maneiras de adicionar, atualizar e excluir configurações do aplicativo de funções:
No portal do Azure.
Usando a CLI do Azure.
Há outras opções de configuração global no arquivo host.json e no arquivo local.settings.json.
APPINSIGHTS_INSTRUMENTATIONKEY
Chave de instrumentação do Application Insights se você estiver usando o Application Insights. Consulte
Monitorar Azure Functions.
APPINSIGHTS_INSTRUMENTATIONKEY 5dbdd5e9-af77-484b-9032-64f83bb83bb
AZURE_FUNCTIONS_ENVIRONMENT
Na versão 2. x do tempo de execução do functions, o configura o comportamento do aplicativo com base no
ambiente de tempo de execução. Esse valor é lido durante a inicialização. Você pode definir
AZURE_FUNCTIONS_ENVIRONMENT para qualquer valor, mas há suporte para três valores : desenvolvimento,
preparoe produção. Quando AZURE_FUNCTIONS_ENVIRONMENT não é definido, o padrão é Development em um
ambiente local e Production no Azure. Essa configuração deve ser usada em vez de ASPNETCORE_ENVIRONMENT
para definir o ambiente de tempo de execução.
AzureWebJobsDashboard
Cadeia de conexão da conta de armazenamento opcional para armazenar logs e exibi-los na guia Monitor do
portal. A conta de armazenamento deve ser de uso geral, com suporte para blobs, filas e tabelas. Consulte
Conta de armazenamento e Requisitos da conta de armazenamento.
AzureWebJobsDashboard DefaultEndpointsProtocol=https;AccountName=
[name];AccountKey=[key]
TIP
Para desempenho e experiência, é recomendável usar APPINSIGHTS_INSTRUMENTATIONKEY e App Insights para
monitoramento, em vez de AzureWebJobsDashboard
AzureWebJobsDisableHomepage
true significa desabilitar a página de aterrissagem padrão mostrada para a URL raiz de um aplicativo de
funções. O padrão é false .
AzureWebJobsDisableHomepage true
Quando essa configuração de aplicativo é omitida ou definida como false , uma página semelhante ao
exemplo a seguir é exibida na resposta à URL <functionappname>.azurewebsites.net .
AzureWebJobsDotNetReleaseCompilation
true significa usar o modo de versão durante a compilação do código .NET; false significa usar o modo de
depuração. O padrão é true .
AzureWebJobsDotNetReleaseCompilation true
AzureWebJobsFeatureFlags
Uma lista delimitada por vírgulas de recursos beta a habilitar. Os recursos beta habilitados por esses
sinalizadores não estão prontos para produção, mas podem ser habilitados para uso experimental antes de
serem lançados.
AzureWebJobsFeatureFlags feature1,feature2
AzureWebJobsSecretStorageType
Especifica o repositório ou o provedor a ser usado para armazenar chaves. Atualmente, os repositórios com
suporte são o armazenamento de blobs ("Blob") e o sistema de arquivos local ("Arquivos"). O padrão é blob na
versão 2 e sistema de arquivos na versão 1.
AzureWebJobsSecretStorageType Arquivos
AzureWebJobsStorage
O Azure Functions runtime usa essa cadeia de conexão da conta armazenamento para todas as funções, exceto
para as funções disparadas por HTTP. A conta de armazenamento deve ser de uso geral, com suporte para
blobs, filas e tabelas. Consulte Conta de armazenamento e Requisitos da conta de armazenamento.
AzureWebJobsStorage DefaultEndpointsProtocol=https;AccountName=
[name];AccountKey=[key]
AzureWebJobs_TypeScriptPath
Caminho para o compilador usado para TypeScript. Permite substituir o padrão se necessário.
AzureWebJobs_TypeScriptPath %HOME%\typescript
FUNCTION_APP_EDIT_MODE
Determina se a edição no portal do Azure está habilitada. Os valores válidos são "readwrite" e "readonly".
FUNCTION_APP_EDIT_MODE readonly
FUNCTIONS_EXTENSION_VERSION
A versão do runtime do Functions para usar nesse aplicativo de funções. Um til com a versão principal
significa usar a versão mais recente da versão principal (por exemplo, "~2"). Quando novas versões da mesma
versão principal estão disponíveis, elas são instaladas automaticamente no aplicativo de funções. Para fixar o
aplicativo a uma versão específica, use o número de versão completo (por exemplo, "2.0.12345"). O padrão é
"~ 2". Um valor de pinos ~1 seu aplicativo para a versão 1.x do tempo de execução.
CHAVE VALOR DE EXEMPLO
FUNCTIONS_EXTENSION_VERSION ~2
FUNÇÕES_TRABALHADOR_TEMPO DE EXECUÇÃO
O runtime do trabalho de linguagem deve ser carregado no aplicativo de funções. Isso irá corresponder ao
idioma que está sendo usado em seu aplicativo (por exemplo, "dotnet"). Para funções em vários idiomas, você
precisará publicá-las em vários aplicativos, cada um com um valor de runtime de trabalho correspondente. Os
valores válidos são dotnet C#(F#/), node (JavaScript/TypeScript), java (Java), powershell (PowerShell) e
python ( Python).
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
Para consumo & apenas planos Premium. Cadeia de conexão para a conta de armazenamento na qual o
código do aplicativo de funções e a configuração são armazenados. Consulte Criar um aplicativo de funções.
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING DefaultEndpointsProtocol=https;AccountName=
[name];AccountKey=[key]
WEBSITE_CONTENTSHARE
Para consumo & apenas planos Premium. O caminho do arquivo para o código do aplicativo de funções e a
configuração. Usado com WEBSITE_CONTENTAZUREFILECONNECTIONSTRING. O padrão é uma cadeia
única que começa com o nome do aplicativo de funções. Consulte Criar um aplicativo de funções.
WEBSITE_CONTENTSHARE functionapp091999e2
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
O número máximo de instâncias que o aplicativo de funções pode alcançar. O padrão é sem limites.
NOTE
Essa configuração é uma versão prévia do recurso - e só confiável se definido como um valor < = 5
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 5
WEBSITE_NODE_DEFAULT_VERSION
Somente Windows.
Define a versão do node. js a ser usada ao executar seu aplicativo de funções no Windows. Você deve usar um
til (~) para que o tempo de execução use a versão mais recente disponível da versão principal de destino. Por
exemplo, quando definido como ~10 , a versão mais recente do node. js 10 é usada. Quando uma versão
principal é destinada a um til, você não precisa atualizar manualmente a versão secundária.
WEBSITE_NODE_DEFAULT_VERSION ~ 10
SITE_EXECUTAR_DO_PACOTE
Permite que seu aplicativo de funções execute de um arquivo de pacote montado.
SITE_EXECUTAR_DO_PACOTE 1
Os valores válidos são 1 ou uma URL que resolve para o local de um arquivo de pacote de implantação.
Quando definido como 1 , o pacote deve estar na pasta d:\home\data\SitePackages . Ao usar a implantação em
zip com essa configuração, o pacote é automaticamente carregado para esse local. Na versão prévia, essa
configuração foi nomeada WEBSITE_RUN_FROM_ZIP . Para obter mais informações, veja Executar suas funções de
um arquivo de pacote.
AZURE_FUNCTION_PROXY_DISABLE_LOCAL_CALL
Por padrão, os proxies de funções utilizarão um atalho para enviar chamadas à API de proxies diretamente
para funções no mesmo aplicativo de funções, em vez de criar uma nova solicitação HTTP. Essa configuração
permite que você desabilite esse comportamento.
AZURE_FUNCTION_PROXY_BACKEND_URL_DECODE_SLASHES
Essa configuração controla se %2F é decodificado como barras nos parâmetros de rota quando inseridos na
URL de back-end.
Exemplo
Aqui, está um exemplo de proxy.json em um aplicativo de funções no myfunction.com da URL
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"root": {
"matchCondition": {
"route": "/{*all}"
},
"backendUri": "example.com/{all}"
}
}
}
Próximos passos
Saiba como atualizar as configurações do aplicativo
Consulte as configurações globais no arquivo host.json
Consulte outras configurações de aplicativo para aplicativos do Serviço de Aplicativo
Associações de armazenamento do Blob do Azure
para o Azure Functions
08/11/2019 • 58 minutes to read • Edit Online
Este artigo explica como trabalhar com associações de armazenamento de blob do Azure no Azure Functions.
O Azure Functions dá suporte a associações de saída, gatilho e entrada para blobs. O artigo inclui uma seção
para cada associação:
Gatilho de blob
Associação de entrada de blob
Associação de saída de blob
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
NOTE
Use o gatilho de Grade de Eventos em vez do disparador do armazenamento de Blob apenas para contas de
armazenamento de blob, para alta escala ou para reduzir a latência. Para saber mais, veja a seção Gatilho a seguir.
Pacotes - Functions 1. x
As associações de armazenamento de Blob são fornecidas no Microsoft.Azure.WebJobs pacote NuGet,
versão 2. x. O código-fonte do pacote está no repositório GitHub azure-webjobs-sdk.
O suporte para essa associação é fornecido automaticamente em todos os ambientes de desenvolvimento.
Você não precisa instalar o pacote ou registrar a extensão manualmente.
Versão do SDK de Armazenamento do Microsoft Azure em Funções 1. x
Em Funções de 1. x, os gatilhos de armazenamento e associações usam a versão 7.2.1 do SDK de
Armazenamento do Microsoft Azure (windowsazure pacote NuGet). Se você referenciar uma versão
diferente do SDK do armazenamento e associar a um tipo de SDK de armazenamento na sua assinatura de
função, o tempo de execução de funções pode relatar se não é possível associar a esse tipo. A solução é
verificar as referências do projeto windowsazure 7.2.1.
Pacotes - Functions 2. x
As associações de armazenamento de Blobs são fornecidas no pacote NuGet
Microsoft.Azure.WebJobs.Extensions.Storage, versão 3.x. O código-fonte do pacote está no repositório
GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de
desenvolvimento.
PARA ADICIONAR SUPORTE EM
AMBIENTE DE DESENVOLVIMENTO FUNÇÕES 2.X
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto
de aplicativo de funções, consulte Atualizar as extensões.
Disparador
O gatilho de armazenamento de Blob inicia uma função quando é detectado um blob novo ou atualizado. O
conteúdo do blob é fornecido como entrada para a função.
O gatilho de Grade de Eventos tem suporte interno para eventos de blob e também pode ser usado para
iniciar uma função quando um blob novo ou atualizado é detectado. Para obter um exemplo, consulte o
tutorial Redimensionamento de imagem com Grade de Eventos.
Use a Grade de Eventos em vez do disparador de armazenamento de Blobs para os seguintes cenários:
Contas de armazenamento de Blobs
Alta escala
Minimizando a latência
Contas de armazenamento de Blobs
As contas de Armazenamento de Blobs são compatíveis para associações de entrada e saída de blobs, mas
não para gatilhos de blob. Os gatilhos de armazenamento de Blobs requerem uma conta de armazenamento
de uso geral.
Alta escala
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.
Problemas de latência
Se seu aplicativo de funções está no plano de Consumo, pode haver um atraso de até 10 minutos no
processamento de novos blobs se um aplicativo de funções ficar ocioso. Para evitar essa latência, você pode
alternar para um plano do serviço de aplicativo com o Always On habilitado. Você também pode usar um
gatilho da Grade de Eventos com sua conta de armazenamento de Blob. Para obter um exemplo, confira o
tutorial da Grade de Eventos.
Gatilho de armazenamento de filas
Além da Grade de Eventos, outra alternativa para blobs de processamento é o gatilho de armazenamento de
Fila, mas ele não tem suporte interno para eventos de blob. Você precisaria criar mensagens de fila ao criar
ou atualizar blobs. Suponto que você fez isso, consulte o exemplo de associação de entrada de blob mais
adiante neste artigo.
Gatilho - exemplo
C#
C#Prescritiva
JavaScript
Python
Java
O exemplo a seguir mostra uma função C# que grava um log quando um blob é adicionado ou atualizado no
contêiner samples-workitems .
[FunctionName("BlobTriggerCSharp")]
public static void Run([BlobTrigger("samples-workitems/{name}")] Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length}
Bytes");
}
Gatilho – atributos
C#
C#Prescritiva
JavaScript
Python
Java
Em bibliotecas de classe C#, use os seguintes atributos para configurar um gatilho de blob:
BlobTriggerAttribute
O construtor do atributo usa uma cadeia de caracteres de caminho que indica o contêiner para
inspecionar e, opcionalmente, um padrão de nome de blob. Veja um exemplo:
[FunctionName("ResizeImage")]
public static void Run(
[BlobTrigger("sample-images/{name}")] Stream image,
[Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
{
....
}
Você pode definir a Connection propriedade para especificar a conta de armazenamento para usar,
conforme mostrado no exemplo a seguir:
[FunctionName("ResizeImage")]
public static void Run(
[BlobTrigger("sample-images/{name}", Connection = "StorageConnectionAppSetting")] Stream
image,
[Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
{
....
}
[StorageAccount("ClassLevelStorageAppSetting")]
public static class AzureFunctions
{
[FunctionName("BlobTrigger")]
[StorageAccount("FunctionLevelStorageAppSetting")]
public static void Run( //...
{
....
}
Gatilho – configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json e no atributo BlobTrigger .
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Gatilho - uso
C#
C#Prescritiva
JavaScript
Python
Java
Você pode usar os seguintes tipos de parâmetro para o blob de gatilho:
Stream
TextReader
string
Byte[]
Um POCO serializado como JSON
ICloudBlob 1
CloudBlockBlob 1
CloudPageBlob 1
CloudAppendBlob 1
"path": "input/{blobname}.{blobextension}",
"path": "input/original-{name}",
Se o nome do blob for original-Blob1.txt, o valor da name variável no código da função é Blob1 .
Filtre por tipo de arquivo
O exemplo a seguir é disparado apenas em arquivos .png:
"path": "samples/{name}.png",
"path": "images/{{20140101}}-{name}",
Gatilho - metadados
C#
C#Prescritiva
JavaScript
Python
Java
O gatilho de blob fornece várias propriedades de metadados. Essas propriedades podem ser usadas como
parte de expressões de associação em outras associações ou como parâmetros em seu código. Esses valores
têm a mesma semântica que o tipo CloudBlob.
Por exemplo, o script C# e exemplos de JavaScript a seguir registram o caminho para o blob disparando,
incluindo o contêiner:
A função disparada (" <nome do aplicativo de funções> .Functions. <nome da função> ", por exemplo:
"MyFunctionApp.Functions.CopyBlob")
O nome do contêiner
O tipo de blob ("BlockBlob" ou "PageBlob")
O nome do blob
O ETag (um identificador de versão de blob, por exemplo: "0x8D1DC6E70A277EF")
Para forçar o reprocessamento de um blob, exclua manualmente o recebimento desse blob do contêiner
azure-webjobs-hosts. Embora o reprocessamento possa não ocorrer imediatamente, é garantido que ocorra
em um momento posterior.
Disparar - sondagem
Se o contêiner de BLOB que está sendo monitorado contiver mais de 10.000 BLOBs (em todos os
contêineres), o tempo de execução do Functions examinará os arquivos de log para ver se há BLOBs novos
ou alterados. Esse processo pode resultar em atrasos. Uma função não poderá ser disparada até que se
passem vários minutos ou mais tempo depois da criação do blob.
WARNING
Além disso, logs de armazenamento são criados da "melhor forma dentro do possível". Não há nenhuma garantia de
que todos os eventos são capturados. Sob algumas condições, logs poderão ser perdidos.
Se você precisar de um processamento de blob mais rápido ou confiável, crie uma mensagem de fila ao criar o blob. Em
seguida, use um gatilho de fila em vez de um gatilho de blob para processar o blob. Outra opção é usar a Grade de
Eventos; consulte o tutorial Automatize redimensionamento de imagens carregadas usando a Grade de Eventos.
Entrada
Use uma associação de entrada de Armazenamento de Blobs para ler blobs.
Entrada - exemplo
C#
C#Prescritiva
JavaScript
Python
Java
O exemplo a seguir é uma função C# que usa um gatilho de fila e uma associação de blob de entrada. A
mensagem da fila contém o nome do blob e a função registra o tamanho do blob.
[FunctionName("BlobInput")]
public static void Run(
[QueueTrigger("myqueue-items")] string myQueueItem,
[Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
ILogger log)
{
log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}
Entrada – atributos
C#
C#Prescritiva
JavaScript
Python
Java
Em bibliotecas de classes do C#, use o BlobAttribute.
O construtor do atributo usa o caminho para o blob e um parâmetro FileAccess que indica a leitura ou
gravação, conforme mostrado no exemplo a seguir:
[FunctionName("BlobInput")]
public static void Run(
[QueueTrigger("myqueue-items")] string myQueueItem,
[Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
ILogger log)
{
log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}
Você pode definir a Connection propriedade para especificar a conta de armazenamento para usar, conforme
mostrado no exemplo a seguir:
[FunctionName("BlobInput")]
public static void Run(
[QueueTrigger("myqueue-items")] string myQueueItem,
[Blob("samples-workitems/{queueTrigger}", FileAccess.Read, Connection =
"StorageConnectionAppSetting")] Stream myBlob,
ILogger log)
{
log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}
Você pode usar o StorageAccount atributo para especificar a conta de armazenamento no nível de classe,
método ou parâmetro. Para obter mais informações, consulte Gatilho - atributos.
Entrada - configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo
function.json e o Blob atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Entrada - uso
C#
C#Prescritiva
JavaScript
Python
Java
Você pode usar os seguintes tipos de parâmetro para a associação de entrada de blob:
Stream
TextReader
string
Byte[]
CloudBlobContainer
CloudBlobDirectory
ICloudBlob 1
CloudBlockBlob 1
CloudPageBlob 1
CloudAppendBlob 1
Saída
Usar as associações de saída do Armazenamento de Blobs para gravar os blobs.
Saída - exemplo
C#
C#Prescritiva
JavaScript
Python
Java
O exemplo a seguir é uma função C# que usa um gatilho de blob e duas associações de blob de saída. A
função é gatilhada pela criação de um blob de imagem no contêiner imagens de amostra. Isso cria cópias de
pequeno e médio tamanho de blob de imagem.
using System.Collections.Generic;
using System.IO;
using Microsoft.Azure.WebJobs;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
[FunctionName("ResizeImage")]
public static void Run(
[BlobTrigger("sample-images/{name}")] Stream image,
[Blob("sample-images-sm/{name}", FileAccess.Write)] Stream imageSmall,
[Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageMedium)
{
IImageFormat format;
image.Position = 0;
using (Image<Rgba32> input = Image.Load(image, out format))
{
ResizeImage(input, imageMedium, ImageSize.Medium, format);
}
}
public static void ResizeImage(Image<Rgba32> input, Stream output, ImageSize size, IImageFormat format)
{
var dimensions = imageDimensionsTable[size];
Saída - atributos
C#
C#Prescritiva
JavaScript
Python
Java
Em bibliotecas de classes do C#, use o BlobAttribute.
O construtor do atributo usa o caminho para o blob e um parâmetro FileAccess que indica a leitura ou
gravação, conforme mostrado no exemplo a seguir:
[FunctionName("ResizeImage")]
public static void Run(
[BlobTrigger("sample-images/{name}")] Stream image,
[Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
{
...
}
Você pode definir a Connection propriedade para especificar a conta de armazenamento para usar, conforme
mostrado no exemplo a seguir:
[FunctionName("ResizeImage")]
public static void Run(
[BlobTrigger("sample-images/{name}")] Stream image,
[Blob("sample-images-md/{name}", FileAccess.Write, Connection = "StorageConnectionAppSetting")]
Stream imageSmall)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json e no Blob atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
C#
C#Prescritiva
JavaScript
Python
Java
Você pode associar aos seguintes tipos para gravar BLOBs:
TextWriter
out string
out Byte[]
CloudBlobStream
Stream
CloudBlobContainer 1
CloudBlobDirectory
ICloudBlob 2
CloudBlockBlob 2
CloudPageBlob 2
CloudAppendBlob 2
1
1 Requerassociação "in" direction em function.json ou FileAccess.Read em uma biblioteca de classes C#.
No entanto, você pode usar o objeto de contêiner que o tempo de execução fornece para operações de
gravação, como carregar blobs no contêiner.
2 Requer associação "inout" direction em function.json ou FileAccess.ReadWrite em uma biblioteca de
classes C#.
Se você tentar associar a um dos tipos de SDK de armazenamento e obter uma mensagem de erro,
certifique-se de que você tem uma referência a a versão correta do SDK de armazenamento.
Em funções assíncronas, use o valor de retorno ou IAsyncCollector em vez de um parâmetro out .
Associação para string ou Byte[] só é recomendada se o tamanho do blob for pequeno, pois o conteúdo
inteiro do blob é carregado na memória. Geralmente, é preferível usar um tipo Stream ou CloudBlockBlob .
Para obter mais informações, consulte Concorrência e uso de memória mais adiante neste artigo.
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associações do Azure Cosmos DB para Azure
Functions 1.x
08/11/2019 • 49 minutes to read • Edit Online
Este artigo explica como trabalhar com associações do Azure Cosmos DB no Azure Functions. O Azure
Functions dá suporte a associações de gatilho, entrada e saída para o Azure Cosmos DB.
NOTE
Este artigo serve para o Azure Functions 1.x. Para obter informações sobre como usar essas associações em Functions 2.x,
veja Associações do Azure Cosmos DB para Azure Functions 2.x.
Essa associação era originalmente denominada DocumentDB. No Functions versão 1.x, apenas o gatilho foi renomeado
Cosmos DB; a associação de entrada, a associação de saída e o pacote NuGet mantêm o nome DocumentDB.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
NOTE
As associações do Azure Cosmos DB têm suporte apenas para usar com a API do SQL. Para todas as outras APIs do
Azure Cosmos DB, você deve acessar o banco de dados por meio da sua função usando o cliente estático da API,
incluindo a API do Azure Cosmos DB para MongoDB, a API do Cassandra, a API do Gremlin e a API de Tabela.
Pacotes - Functions 1. x
As associações do Azure Cosmos DB para Functions versão 1.x são fornecidas no pacote NuGet
Microsoft.Azure.WebJobs.Extensions.DocumentDB, versão 1.x. O código-fonte para a associação está no
repositório GitHub azure-webjobs-sdk-extensions.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Gatilho
O Gatilho do Azure Cosmos DB usa o Feed de Alterações do Azure Cosmos DB para escutar as inserções e
atualizações nas partições. O feed de alteração publica inserções e atualizações, não exclusões.
Gatilho - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
JavaScript
Ignorar exemplos de gatilho
Gatilho - exemplo C#
O exemplo a seguir mostra uma função C# que é chamada quando há inserções ou atualizações na coleção e no
banco de dados especificados.
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
namespace CosmosDBSamplesV1
{
public static class CosmosTrigger
{
[FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
TraceWriter log)
{
if (documents != null && documents.Count > 0)
{
log.Info($"Documents modified: {documents.Count}");
log.Info($"First document Id: {documents[0].Id}");
}
}
}
}
#r "Microsoft.Azure.Documents.Client"
using System;
using Microsoft.Azure.Documents;
using System.Collections.Generic;
{
"type": "cosmosDBTrigger",
"name": "documents",
"direction": "in",
"leaseCollectionName": "leases",
"connectionStringSetting": "<connection-app-setting>",
"databaseName": "Tasks",
"collectionName": "Items",
"createLeaseCollectionIfNotExists": true
}
context.done();
}
Gatilho – atributos
Em bibliotecas de classes de C#, utilize o atributo CosmosDBTrigger.
O construtor do atributo toma o nome do banco de dados e o nome da coleção. Para obter informações sobre
essas configurações e outras propriedades que podem ser configuradas, consulte Gatilho – configurações. Aqui
está um exemplo de atributo CosmosDBTrigger em uma assinatura de método:
[FunctionName("DocumentUpdates")]
public static void Run(
[CosmosDBTrigger("database", "collection", ConnectionStringSetting = "myCosmosDB")]
IReadOnlyList<Document> documents,
TraceWriter log)
{
...
}
Gatilho – configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json e no atributo CosmosDBTrigger .
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Gatilho - uso
O gatilho requer uma segunda coleção que ele usa para armazenar concessões sobre as partições. Tanto a
coleção que está sendo monitorada quanto a coleção que contém as concessões devem estar disponíveis para o
gatilho funcionar.
IMPORTANT
Se várias funções estiverem configuradas para usar um gatilho do Cosmos DB para a mesma coleção, cada uma das
funções deverá usar uma coleção de concessões dedicada ou especificar uma diferente LeaseCollectionPrefix para
cada função. Caso contrário, apenas uma das funções será disparada. Para obter informações sobre o prefixo, veja a seção
de Configuração.
O gatilho não indica se um documento foi atualizado ou inserido, ele fornece apenas o documento em si. Se
você precisa lidar com inserções e atualizações de forma diferente, você pode fazer isso com a implementação
de campos de carimbo de hora de inserção ou atualização.
Entrada
A associação de dados de entrada do Azure Cosmos DB usa a API de SQL para recuperar um ou mais
documentos do Azure Cosmos DB e passá-los para o parâmetro de entrada da função. A ID do documento ou
os parâmetros de consulta podem ser determinados com base no gatilho que invoca a função.
Entrada – exemplos
Veja os exemplos específicos a um idioma que lê um documento especificando um valor de ID:
C#
Script do C# (.csx)
JavaScript
F#
Ignorar exemplos de entrada
Entrada – exemplos em C#
Esta seção contém os seguintes exemplos:
Gatilho da fila, pesquisar ID no JSON
Gatilho HTTP, pesquisar ID na cadeia de caracteres de consulta
Gatilho HTTP, pesquisar ID nos dados da rota
Gatilho HTTP, pesquisar ID nos dados da rota, usando SqlQuery
Gatilho HTTP, obter vários documentos, usando SqlQuery
Gatilho HTTP, obter vários documentos, usando DocumentClient
Os exemplos se referem a um tipo ToDoItem simples:
namespace CosmosDBSamplesV1
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
namespace CosmosDBSamplesV1
{
public static class DocByIdFromJSON
{
[FunctionName("DocByIdFromJSON")]
public static void Run(
[QueueTrigger("todoqueueforlookup")] ToDoItemLookup toDoItemLookup,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
Id = "{ToDoItemId}")]ToDoItem toDoItem,
TraceWriter log)
{
log.Info($"C# Queue trigger function processed Id={toDoItemLookup?.ToDoItemId}");
if (toDoItem == null)
{
log.Info($"ToDo item not found");
}
else
{
log.Info($"Found ToDo item, Description={toDoItem.Description}");
}
}
}
}
namespace CosmosDBSamplesV1
{
public static class DocByIdFromQueryString
{
[FunctionName("DocByIdFromQueryString")]
public static HttpResponseMessage Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
Id = "{Query.id}")] ToDoItem toDoItem,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
if (toDoItem == null)
{
log.Info($"ToDo item not found");
}
else
{
log.Info($"Found ToDo item, Description={toDoItem.Description}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
}
}
namespace CosmosDBSamplesV1
{
public static class DocByIdFromRouteData
{
[FunctionName("DocByIdFromRouteData")]
public static HttpResponseMessage Run(
[HttpTrigger(
AuthorizationLevel.Anonymous, "get", "post",
Route = "todoitems/{id}")]HttpRequestMessage req,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
Id = "{id}")] ToDoItem toDoItem,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
if (toDoItem == null)
{
log.Info($"ToDo item not found");
}
else
{
log.Info($"Found ToDo item, Description={toDoItem.Description}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
}
}
namespace CosmosDBSamplesV1
{
public static class DocByIdFromRouteDataUsingSqlQuery
{
[FunctionName("DocByIdFromRouteDataUsingSqlQuery")]
public static HttpResponseMessage Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
Route = "todoitems2/{id}")]HttpRequestMessage req,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
SqlQuery = "select * from ToDoItems r where r.id = {id}")] IEnumerable<ToDoItem> toDoItems,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
foreach (ToDoItem toDoItem in toDoItems)
{
log.Info(toDoItem.Description);
}
return req.CreateResponse(HttpStatusCode.OK);
}
}
}
namespace CosmosDBSamplesV1
{
public static class DocsBySqlQuery
{
[FunctionName("DocsBySqlQuery")]
public static HttpResponseMessage Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
HttpRequestMessage req,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
SqlQuery = "SELECT top 2 * FROM c order by c._ts desc")]
IEnumerable<ToDoItem> toDoItems,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
foreach (ToDoItem toDoItem in toDoItems)
{
log.Info(toDoItem.Description);
}
return req.CreateResponse(HttpStatusCode.OK);
}
}
}
namespace CosmosDBSamplesV1
{
public static class DocsByUsingDocumentClient
{
[FunctionName("DocsByUsingDocumentClient")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")] DocumentClient client,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
if (searchterm == null)
{
return req.CreateResponse(HttpStatusCode.NotFound);
}
while (query.HasMoreResults)
{
foreach (ToDoItem result in await query.ExecuteNextAsync())
{
log.Info(result.Description);
}
}
return req.CreateResponse(HttpStatusCode.OK);
}
}
}
namespace CosmosDBSamplesV1
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
{
"name": "inputDocument",
"type": "documentDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"id" : "{queueTrigger}",
"partitionKey": "{partition key value}",
"connection": "MyAccount_COSMOSDB",
"direction": "in"
}
using System;
using System.Net;
if (toDoItem == null)
{
log.Info($"ToDo item not found");
}
else
{
log.Info($"Found ToDo item, Description={toDoItem.Description}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
using System.Net;
if (toDoItem == null)
{
log.Info($"ToDo item not found");
}
else
{
log.Info($"Found ToDo item, Description={toDoItem.Description}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
using System.Net;
using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
if (searchterm == null)
{
return req.CreateResponse(HttpStatusCode.NotFound);
}
while (query.HasMoreResults)
{
foreach (ToDoItem result in await query.ExecuteNextAsync())
{
log.Info(result.Description);
}
}
return req.CreateResponse(HttpStatusCode.OK);
}
// Change input document contents using Azure Cosmos DB input binding, using
context.bindings.inputDocumentOut
module.exports = function (context) {
context.bindings.inputDocumentOut = context.bindings.inputDocumentIn;
context.bindings.inputDocumentOut.text = "This was updated!";
context.done();
};
context.done();
};
context.done();
};
{
"name": "inputDocument",
"type": "documentDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"id" : "{queueTrigger}",
"connection": "MyAccount_COSMOSDB",
"direction": "in"
}
Entrada – atributos
Em bibliotecas de classes de C#, utilize o atributo DocumentDB.
O construtor do atributo toma o nome do banco de dados e o nome da coleção. Para obter informações sobre
essas configurações e outras propriedades que podem ser configuradas, consulte a seção de configuração a
seguir.
Entrada - configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo
function.json e o DocumentDB atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Entrada - uso
Em funções C# e F#, todas as alterações feitas no documento de entrada por parâmetros de entrada nomeados
são persistidas automaticamente.
Funções de JavaScript, as atualizações não são feitas automaticamente após a saída da função. Em vez disso,
use context.bindings.<documentName>In e context.bindings.<documentName>Out para fazer atualizações. Consulte
o exemplo JavaScript.
Output
Com a associação de saída do Azure Cosmos DB, você pode gravar um novo documento para um banco de
dados do Azure Cosmos DB usando a API de SQL.
Saída – exemplos
Consulte os exemplos específicos a um idioma:
C#
Script do C# (.csx)
JavaScript
F#
Veja também o exemplo de entrada que usa DocumentClient .
Ignorar exemplos de saída
Saída - exemplos C#
Esta seção contém os seguintes exemplos:
Gatilho da fila, gravar um documento
Gatilho da fila, gravar documentos usando IAsyncCollector
Os exemplos se referem a um tipo ToDoItem simples:
namespace CosmosDBSamplesV1
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System;
namespace CosmosDBSamplesV1
{
public static class WriteOneDoc
{
[FunctionName("WriteOneDoc")]
public static void Run(
[QueueTrigger("todoqueueforwrite")] string queueMessage,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")]out dynamic document,
TraceWriter log)
{
document = new { Description = queueMessage, id = Guid.NewGuid() };
namespace CosmosDBSamplesV1
{
public static class WriteDocsIAsyncCollector
{
[FunctionName("WriteDocsIAsyncCollector")]
public static async Task Run(
[QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
[DocumentDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")]
IAsyncCollector<ToDoItem> toDoItemsOut,
TraceWriter log)
{
log.Info($"C# Queue trigger function processed {toDoItemsIn?.Length} items");
{
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
A função cria documentos do Azure Cosmos DB no formato a seguir para cada registro:
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
#r "Newtonsoft.Json"
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json.Linq;
public static void Run(string myQueueItem, out object employeeDocument, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
employeeDocument = new {
id = employee.name + "-" + employee.employeeId,
name = employee.name,
employeeId = employee.employeeId,
address = employee.address
};
}
namespace CosmosDBSamplesV1
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
using System;
{
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
A função cria documentos do Azure Cosmos DB no formato a seguir para cada registro:
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
context.bindings.employeeDocument = JSON.stringify({
id: context.bindings.myQueueItem.name + "-" + context.bindings.myQueueItem.employeeId,
name: context.bindings.myQueueItem.name,
employeeId: context.bindings.myQueueItem.employeeId,
address: context.bindings.myQueueItem.address
});
context.done();
};
{
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
A função cria documentos do Azure Cosmos DB no formato a seguir para cada registro:
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
open FSharp.Interop.Dynamic
open Newtonsoft.Json
type Employee = {
id: string
name: string
employeeId: string
address: string
}
{
"frameworks": {
"net46": {
"dependencies": {
"Dynamitey": "1.0.2",
"FSharp.Interop.Dynamic": "3.0.0"
}
}
}
}
Saída - atributos
Em bibliotecas de classes de C#, utilize o atributo DocumentDB.
O construtor do atributo toma o nome do banco de dados e o nome da coleção. Para obter informações sobre
essas configurações e outras propriedades que podem ser configuradas, consulte Saída – configurações. Aqui
está um exemplo de atributo DocumentDB em uma assinatura de método:
[FunctionName("QueueToDocDB")]
public static void Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem,
[DocumentDB("ToDoList", "Items", Id = "id", ConnectionStringSetting = "myCosmosDB")] out dynamic
document)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json e no DocumentDB atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
Por padrão, quando você grava no parâmetro de saída em sua função, um documento é criado no banco de
dados. Este documento contém um GUID gerado automaticamente como a ID do documento. Você pode
especificar a ID do documento de saída especificando a propriedade id no objeto JSON enviado ao parâmetro
de saída.
NOTE
Ao especificar a ID de um documento existente, ela é substituída pelo novo documento de saída.
Próximas etapas
Saiba mais sobre a computação de banco de dados sem servidor com o Cosmos DB
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associações do Azure Cosmos DB para o Azure
Functions 2.x
08/11/2019 • 72 minutes to read • Edit Online
Este artigo explica como trabalhar com associações do Azure Cosmos DB no Azure Functions 2.x. O Azure
Functions dá suporte a associações de gatilho, entrada e saída para o Azure Cosmos DB.
NOTE
Este artigo destina-se Azure Functions versão 2.x. Para obter informações sobre como usar essas associações em Functions
1. x, consulte Associações do Azure Cosmos DB para Azure Functions 1. x.
Essa associação era originalmente denominada DocumentDB. No Functions versão 2.x, o gatilho, associações e pacote são
chamados de Cosmos DB.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 2. x
As associações do Azure Cosmos DB para Functions versão 2.x são fornecidas no pacote NuGet
Microsoft.Azure.WebJobs.Extensions.CosmosDB, versão 3.x. O código-fonte para a associação está no repositório
GitHub azure-webjobs-sdk-extensions.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
Gatilho
O Gatilho do Azure Cosmos DB usa o Feed de Alterações do Azure Cosmos DB para escutar as inserções e
atualizações nas partições. O feed de alteração publica inserções e atualizações, não exclusões.
Gatilho - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (. CSx)
Java
JavaScript
Python
Ignorar exemplos de gatilho
Gatilho - exemplo C#
O exemplo a seguir mostra uma função C# que é chamada quando há inserções ou atualizações na coleção e no
banco de dados especificados.
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
namespace CosmosDBSamplesV2
{
public static class CosmosTrigger
{
[FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
ILogger log)
{
if (documents != null && documents.Count > 0)
{
log.LogInformation($"Documents modified: {documents.Count}");
log.LogInformation($"First document Id: {documents[0].Id}");
}
}
}
}
#r "Microsoft.Azure.DocumentDB.Core"
using System;
using Microsoft.Azure.Documents;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
{
"type": "cosmosDBTrigger",
"name": "documents",
"direction": "in",
"leaseCollectionName": "leases",
"connectionStringSetting": "<connection-app-setting>",
"databaseName": "Tasks",
"collectionName": "Items",
"createLeaseCollectionIfNotExists": true
}
context.done();
}
@FunctionName("cosmosDBMonitor")
public void cosmosDbProcessor(
@CosmosDBTrigger(name = "items",
databaseName = "ToDoList",
collectionName = "Items",
leaseCollectionName = "leases",
createLeaseCollectionIfNotExists = true,
connectionStringSetting = "AzureCosmosDBConnection") String[] items,
final ExecutionContext context ) {
context.getLogger().info(items.length + "item(s) is/are changed.");
}
Na biblioteca de tempo de execução de funções Java, use a anotação @CosmosDBTrigger nos parâmetros cujo valor
seria proveniente do Cosmos DB. Esta anotação pode ser usada com tipos Java nativos, POJOs ou valores
anuláveis usando > opcional<T.
Ignorar exemplos de gatilho
Gatilho – Exemplo do Python
O exemplo a seguir mostra uma associação de gatilho do Cosmos DB em um arquivo function.json e uma função
Python que usa a associação. A função grava mensagens de log quando registros do Cosmos DB são
modificados.
Aqui estão os dados de associação no arquivo function.json:
{
"name": "documents",
"type": "cosmosDBTrigger",
"direction": "in",
"leaseCollectionName": "leases",
"connectionStringSetting": "<connection-app-setting>",
"databaseName": "Tasks",
"collectionName": "Items",
"createLeaseCollectionIfNotExists": true
}
import logging
import azure.functions as func
[FunctionName("DocumentUpdates")]
public static void Run(
[CosmosDBTrigger("database", "collection", ConnectionStringSetting = "myCosmosDB")]
IReadOnlyList<Document> documents,
ILogger log)
{
...
}
Gatilho – configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo function.json
e o CosmosDBTrigger atributo.
Gatilho - uso
O gatilho requer uma segunda coleção que ele usa para armazenar concessões sobre as partições. Tanto a coleção
que está sendo monitorada quanto a coleção que contém as concessões devem estar disponíveis para o gatilho
funcionar.
IMPORTANT
Se várias funções estiverem configuradas para usar um gatilho do Cosmos DB para a mesma coleção, cada uma das funções
deverá usar uma coleção de concessões dedicada ou especificar uma diferente LeaseCollectionPrefix para cada função.
Caso contrário, apenas uma das funções será disparada. Para obter informações sobre o prefixo, veja a seção de
Configuração.
O gatilho não indica se um documento foi atualizado ou inserido, ele fornece apenas o documento em si. Se você
precisa lidar com inserções e atualizações de forma diferente, você pode fazer isso com a implementação de
campos de carimbo de hora de inserção ou atualização.
Entrada
A associação de dados de entrada do Azure Cosmos DB usa a API de SQL para recuperar um ou mais
documentos do Azure Cosmos DB e passá-los para o parâmetro de entrada da função. A ID do documento ou os
parâmetros de consulta podem ser determinados com base no gatilho que invoca a função.
Entrada – exemplos
Veja os exemplos específicos a um idioma que lê um documento especificando um valor de ID:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Ignorar exemplos de entrada
Entrada – exemplos em C#
Esta seção contém os seguintes exemplos:
Gatilho da fila, pesquisar ID no JSON
Gatilho HTTP, pesquisar ID na cadeia de caracteres de consulta
Gatilho HTTP, pesquisar ID nos dados da rota
Gatilho HTTP, pesquisar ID nos dados da rota, usando SqlQuery
Gatilho HTTP, obter vários documentos, usando SqlQuery
Gatilho HTTP, obter vários documentos, usando DocumentClient
Os exemplos se referem a um tipo ToDoItem simples:
namespace CosmosDBSamplesV2
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
namespace CosmosDBSamplesV2
{
public class ToDoItemLookup
{
public string ToDoItemId { get; set; }
}
}
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace CosmosDBSamplesV2
{
public static class DocByIdFromJSON
{
[FunctionName("DocByIdFromJSON")]
public static void Run(
[QueueTrigger("todoqueueforlookup")] ToDoItemLookup toDoItemLookup,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
Id = "{ToDoItemId}")]ToDoItem toDoItem,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed Id={toDoItemLookup?.ToDoItemId}");
if (toDoItem == null)
{
log.LogInformation($"ToDo item not found");
}
else
{
log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
}
}
}
}
NOTE
O parâmetro de cadeia de caracteres de consulta HTTP diferencia maiusculas de minúsculas.
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace CosmosDBSamplesV2
{
public static class DocByIdFromQueryString
{
[FunctionName("DocByIdFromQueryString")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
HttpRequest req,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
Id = "{Query.id}")] ToDoItem toDoItem,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
if (toDoItem == null)
{
log.LogInformation($"ToDo item not found");
}
else
{
log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
}
return new OkResult();
}
}
}
namespace CosmosDBSamplesV2
{
public static class DocByIdFromRouteData
{
[FunctionName("DocByIdFromRouteData")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
Route = "todoitems/{id}")]HttpRequest req,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
Id = "{id}")] ToDoItem toDoItem,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
if (toDoItem == null)
{
log.LogInformation($"ToDo item not found");
}
else
{
log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
}
return new OkResult();
}
}
}
namespace CosmosDBSamplesV2
{
public static class DocByIdFromRouteDataUsingSqlQuery
{
[FunctionName("DocByIdFromRouteDataUsingSqlQuery")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
Route = "todoitems2/{id}")]HttpRequest req,
[CosmosDB("ToDoItems", "Items",
ConnectionStringSetting = "CosmosDBConnection",
SqlQuery = "select * from ToDoItems r where r.id = {id}")]
IEnumerable<ToDoItem> toDoItems,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
namespace CosmosDBSamplesV2
{
public static class DocsBySqlQuery
{
[FunctionName("DocsBySqlQuery")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
HttpRequest req,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection",
SqlQuery = "SELECT top 2 * FROM c order by c._ts desc")]
IEnumerable<ToDoItem> toDoItems,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
foreach (ToDoItem toDoItem in toDoItems)
{
log.LogInformation(toDoItem.Description);
}
return new OkResult();
}
}
}
NOTE
Você também pode usar a interface IDocumentClient para facilitar o teste.
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace CosmosDBSamplesV2
{
public static class DocsByUsingDocumentClient
{
[FunctionName("DocsByUsingDocumentClient")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
Route = null)]HttpRequest req,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")] DocumentClient client,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
while (query.HasMoreResults)
{
foreach (ToDoItem result in await query.ExecuteNextAsync())
{
log.LogInformation(result.Description);
}
}
return new OkResult();
}
}
}
namespace CosmosDBSamplesV2
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
{
"name": "inputDocument",
"type": "cosmosDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"id" : "{queueTrigger}",
"partitionKey": "{partition key value}",
"connectionStringSetting": "MyAccount_COSMOSDB",
"direction": "in"
}
using System;
using System.Net;
using Microsoft.Extensions.Logging;
if (toDoItem == null)
{
log.LogInformation($"ToDo item not found");
}
else
{
log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
using System.Net;
using Microsoft.Extensions.Logging;
if (toDoItem == null)
{
log.LogInformation($"ToDo item not found");
}
else
{
log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
using System.Net;
using Microsoft.Extensions.Logging;
using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Extensions.Logging;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
if (searchterm == null)
{
return req.CreateResponse(HttpStatusCode.NotFound);
}
while (query.HasMoreResults)
{
foreach (ToDoItem result in await query.ExecuteNextAsync())
{
log.LogInformation(result.Description);
}
}
return req.CreateResponse(HttpStatusCode.OK);
}
// Change input document contents using Azure Cosmos DB input binding, using
context.bindings.inputDocumentOut
module.exports = function (context) {
context.bindings.inputDocumentOut = context.bindings.inputDocumentIn;
context.bindings.inputDocumentOut.text = "This was updated!";
context.done();
};
context.done();
};
context.done();
};
import logging
import azure.functions as func
return 'OK'
import logging
import azure.functions as func
{
"name": "inputDocument",
"type": "cosmosDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"id" : "{queueTrigger}",
"connectionStringSetting": "MyAccount_COSMOSDB",
"direction": "in"
}
@Override
public String toString() {
return "ToDoItem={id=" + id + ",description=" + description + "}";
}
}
Gatilho HTTP, pesquisar ID na cadeia de caracteres de consulta - parâmetro cadeia de caracteres (Java)
O exemplo a seguir mostra uma função Java que recupera um único documento. A função é disparada por uma
solicitação HTTP que usa uma cadeia de caracteres de consulta para especificar a ID a ser pesquisada. Essa ID é
usada para recuperar um documento no banco de dados e na coleção especificados, no formulário de cadeia de
caracteres.
public class DocByIdFromQueryString {
@FunctionName("DocByIdFromQueryString")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@CosmosDBInput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
id = "{Query.id}",
partitionKey = "{Query.id}",
connectionStringSetting = "Cosmos_DB_Connection_String")
Optional<String> item,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
context.getLogger().info("String from the database is " + (item.isPresent() ? item.get() : null));
Na biblioteca de tempo de execução de funções Java, use a anotação @CosmosDBInput em parâmetros de função
cujo valor seria proveniente do Cosmos DB. Esta anotação pode ser usada com tipos Java nativos, POJOs ou
valores anuláveis usando > opcional<T.
Gatilho HTTP, pesquisar ID na cadeia de caracteres de consulta - parâmetro POJO (Java)
O exemplo a seguir mostra uma função Java que recupera um único documento. A função é disparada por uma
solicitação HTTP que usa uma cadeia de caracteres de consulta para especificar a ID a ser pesquisada. Essa ID é
usada para recuperar um documento no banco de dados e na coleção especificados. O documento é então
convertido em uma instância de ToDoItem POJO criado anteriormente e passada como um argumento para a
função.
public class DocByIdFromQueryStringPojo {
@FunctionName("DocByIdFromQueryStringPojo")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@CosmosDBInput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
id = "{Query.id}",
partitionKey = "{Query.id}",
connectionStringSetting = "Cosmos_DB_Connection_String")
ToDoItem item,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
context.getLogger().info("Item from the database is " + item);
@FunctionName("DocByIdFromRoute")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "todoitems/{id}")
HttpRequestMessage<Optional<String>> request,
@CosmosDBInput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
id = "{id}",
partitionKey = "{id}",
connectionStringSetting = "Cosmos_DB_Connection_String")
Optional<String> item,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
context.getLogger().info("String from the database is " + (item.isPresent() ? item.get() : null));
@FunctionName("DocByIdFromRouteSqlQuery")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "todoitems2/{id}")
HttpRequestMessage<Optional<String>> request,
@CosmosDBInput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
sqlQuery = "select * from Items r where r.id = {id}",
connectionStringSetting = "Cosmos_DB_Connection_String")
ToDoItem[] item,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
context.getLogger().info("Items from the database are " + item);
Gatilho HTTP, obter vários documentos dos dados da rota, usando SqlQuery (Java)
O exemplo a seguir mostra uma função Java para vários documentos. A função é disparada por uma solicitação
HTTP que usa um parâmetro de rota desc para especificar a cadeia de caracteres a ser pesquisada no campo
description . O termo de pesquisa é usado para recuperar uma coleção de documentos do banco de dados e
coleção especificados, convertendo o conjunto de resultados para um ToDoItem[] e passando-o como um
argumento para a função.
public class DocsFromRouteSqlQuery {
@FunctionName("DocsFromRouteSqlQuery")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "todoitems3/{desc}")
HttpRequestMessage<Optional<String>> request,
@CosmosDBInput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
sqlQuery = "select * from Items r where contains(r.description, {desc})",
connectionStringSetting = "Cosmos_DB_Connection_String")
ToDoItem[] items,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
context.getLogger().info("Number of items from the database is " + (items == null ? 0 :
items.length));
Entrada – atributos
Em Bibliotecas de classes C#, utilize o atributo CosmosDB.
O construtor do atributo toma o nome do banco de dados e o nome da coleção. Para obter informações sobre
essas configurações e outras propriedades que podem ser configuradas, consulte a seção de configuração a
seguir.
Entrada - configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo function.json
e o CosmosDB atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Entrada - uso
Em funções C# e F#, todas as alterações feitas no documento de entrada por parâmetros de entrada nomeados
são persistidas automaticamente.
Funções de JavaScript, as atualizações não são feitas automaticamente após a saída da função. Em vez disso, use
context.bindings.<documentName>In e context.bindings.<documentName>Out para fazer atualizações. Confira o
exemplo de JavaScript.
Saída
Com a associação de saída do Azure Cosmos DB, você pode gravar um novo documento para um banco de
dados do Azure Cosmos DB usando a API de SQL.
Saída – exemplos
Consulte os exemplos específicos a um idioma:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Consulte também o exemplo de entrada que usa DocumentClient .
Ignorar exemplos de saída
Saída - exemplos C#
Esta seção contém os seguintes exemplos:
Gatilho da fila, gravar um documento
Gatilho da fila, gravar documentos usando IAsyncCollector
Os exemplos se referem a um tipo ToDoItem simples:
namespace CosmosDBSamplesV2
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using System;
namespace CosmosDBSamplesV2
{
public static class WriteOneDoc
{
[FunctionName("WriteOneDoc")]
public static void Run(
[QueueTrigger("todoqueueforwrite")] string queueMessage,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")]out dynamic document,
ILogger log)
{
document = new { Description = queueMessage, id = Guid.NewGuid() };
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
namespace CosmosDBSamplesV2
{
public static class WriteDocsIAsyncCollector
{
[FunctionName("WriteDocsIAsyncCollector")]
public static async Task Run(
[QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")]
IAsyncCollector<ToDoItem> toDoItemsOut,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");
{
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
A função cria documentos do Azure Cosmos DB no formato a seguir para cada registro:
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
{
"name": "employeeDocument",
"type": "cosmosDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"createIfNotExists": true,
"connectionStringSetting": "MyAccount_COSMOSDB",
"direction": "out"
}
#r "Newtonsoft.Json"
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json.Linq;
using Microsoft.Extensions.Logging;
public static void Run(string myQueueItem, out object employeeDocument, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
employeeDocument = new {
id = employee.name + "-" + employee.employeeId,
name = employee.name,
employeeId = employee.employeeId,
address = employee.address
};
}
namespace CosmosDBSamplesV2
{
public class ToDoItem
{
public string Id { get; set; }
public string Description { get; set; }
}
}
using System;
using Microsoft.Extensions.Logging;
public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");
{
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
A função cria documentos do Azure Cosmos DB no formato a seguir para cada registro:
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
context.bindings.employeeDocument = JSON.stringify({
id: context.bindings.myQueueItem.name + "-" + context.bindings.myQueueItem.employeeId,
name: context.bindings.myQueueItem.name,
employeeId: context.bindings.myQueueItem.employeeId,
address: context.bindings.myQueueItem.address
});
context.done();
};
{
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
A função cria documentos do Azure Cosmos DB no formato a seguir para cada registro:
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
open FSharp.Interop.Dynamic
open Newtonsoft.Json
open Microsoft.Extensions.Logging
type Employee = {
id: string
name: string
employeeId: string
address: string
}
{
"frameworks": {
"net46": {
"dependencies": {
"Dynamitey": "1.0.2",
"FSharp.Interop.Dynamic": "3.0.0"
}
}
}
}
Gatilho HTTP, salva um documento ao banco de dados por meio do valor de retorno (Java)
O exemplo a seguir mostra uma função de Java cuja assinatura é anotada com @CosmosDBOutput e tem o valor
retornado do tipo String . O documento JSON retornado pela função será gravado automaticamente à coleção
do CosmosDB correspondente.
@FunctionName("WriteOneDoc")
@CosmosDBOutput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
connectionStringSetting = "Cosmos_DB_Connection_String")
public String run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
// Generate random ID
final int id = Math.abs(new Random().nextInt());
// Generate document
final String jsonDocument = "{\"id\":\"" + id + "\", " +
"\"description\": \"" + name + "\"}";
return jsonDocument;
}
Gatilho HTTP, salva um documento ao banco de dados por meio do valor de OutputBinding (Java)
O exemplo a seguir mostra uma função de Java que grava um documento do CosmosDB por meio de um
parâmetro de saída OutputBinding<T> . Observe que, nessa configuração, é o parâmetro outputItem que precisa
ser anotado com @CosmosDBOutput , não a assinatura de função. Usando OutputBinding<T> permite que sua função
tire proveito da associação para gravar o documento para CosmosDB, permitindo também retornar um valor
diferente para o chamador da função, como um documento XML ou JSON.
@FunctionName("WriteOneDocOutputBinding")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@CosmosDBOutput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
connectionStringSetting = "Cosmos_DB_Connection_String")
OutputBinding<String> outputItem,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
// Generate random ID
final int id = Math.abs(new Random().nextInt());
// Generate document
final String jsonDocument = "{\"id\":\"" + id + "\", " +
"\"description\": \"" + name + "\"}";
Gatilho HTTP, salva vários documentos ao banco de dados por meio do valor de OutputBinding (Java)
O exemplo a seguir mostra uma função de Java que grava vários documentos do CosmosDB por meio de um
parâmetro de saída OutputBinding<T> . Observe que, nessa configuração, é o parâmetro outputItem que precisa
ser anotado com @CosmosDBOutput , não a assinatura de função. O parâmetro de saída outputItem tem uma lista
de objetos ToDoItem como seu tipo de parâmetro de modelo. Usando OutputBinding<T> permite que sua função
tire proveito da associação para gravar os documentos para CosmosDB, permitindo também retornar um valor
diferente para o chamador da função, como um documento XML ou JSON.
@FunctionName("WriteMultipleDocsOutputBinding")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@CosmosDBOutput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
connectionStringSetting = "Cosmos_DB_Connection_String")
OutputBinding<List<ToDoItem>> outputItem,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
// Generate documents
List<ToDoItem> items = new ArrayList<>();
// Create ToDoItem
ToDoItem item = new ToDoItem(String.valueOf(id), name);
items.add(item);
}
Na biblioteca de tempo de execução das funções Java, use a anotação @CosmosDBOutput nos parâmetros que serão
gravados no Cosmos DB. O tipo de parâmetro de anotação deve ser OutputBinding<T> , em que T é um tipo Java
nativo ou um POJO.
Saída-exemplos do Python
O exemplo a seguir demonstra como gravar um documento em um banco de dados CosmosDB do Azure como a
saída de uma função.
A definição de associação é definida em Function. JSON , em que Type é definido como cosmosDB .
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "cosmosDB",
"direction": "out",
"name": "doc",
"databaseName": "demodb",
"collectionName": "data",
"createIfNotExists": "true",
"connectionStringSetting": "AzureCosmosDBConnectionString"
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
Para gravar no banco de dados, passe um objeto Document para o método set do parâmetro Database.
request_body = req.get_body()
doc.set(func.Document.from_json(request_body))
return 'OK'
Saída - atributos
Em Bibliotecas de classes C#, utilize o atributo CosmosDB.
O construtor do atributo toma o nome do banco de dados e o nome da coleção. Para obter informações sobre
essas configurações e outras propriedades que podem ser configuradas, consulte Saída – configurações. Aqui
está um exemplo de atributo CosmosDB em uma assinatura de método:
[FunctionName("QueueToDocDB")]
public static void Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem,
[CosmosDB("ToDoList", "Items", Id = "id", ConnectionStringSetting = "myCosmosDB")] out dynamic
document)
{
...
}
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
Por padrão, quando você grava no parâmetro de saída em sua função, um documento é criado no banco de
dados. Este documento contém um GUID gerado automaticamente como a ID do documento. Você pode
especificar a ID do documento de saída especificando a propriedade id no objeto JSON enviado ao parâmetro
de saída.
NOTE
Ao especificar a ID de um documento existente, ela é substituída pelo novo documento de saída.
Exceções e códigos de retorno
ASSOCIAÇÃO REFERÊNCIA
configurações de host.json
Esta seção descreve as definições de configuração globais disponíveis para esta associação na versão 2.x. Para
obter mais informações sobre as configurações globais na versão 2.x, confira a referência de host.json para o
Azure Functions versão 2.x.
{
"version": "2.0",
"extensions": {
"cosmosDB": {
"connectionMode": "Gateway",
"protocol": "Https",
"leaseOptions": {
"leasePrefix": "prefix1"
}
}
}
}
Próximas etapas
Saiba mais sobre a computação de banco de dados sem servidor com o Cosmos DB
Aprenda mais sobre gatilhos e de associações do Azure Functions
Gatilho de Grade de Eventos para o Azure
Functions
08/11/2019 • 31 minutes to read • Edit Online
Este artigo explica como manipular com eventos de Grade de Eventos no Azure Functions.
A Grade de Eventos é um serviço do Azure que envia solicitações HTTP para notificá-lo sobre eventos que
acontecem nos publicadores. Um publicador é o serviço ou recurso que origina o evento. Por exemplo, uma
conta de armazenamento de Blobs do Azure é um publicador, e uma exclusão ou upload de blob é um evento.
Alguns serviços do Azure têm suporte interno para publicar eventos na Grade de Eventos .
Os manipuladores de eventos recebem e processam eventos. O Azure Functions é um dos vários serviços
doAzure que possuem suporte interno para manipular eventos da Grande de Eventos. Neste artigo, você
aprende a usar um gatilho de Grade de Eventos para invocar uma função quando um evento é recebido da
Grade de Eventos.
Se você preferir, é possível utilizar um gatilho HTTP para manipular eventos da Grade de Eventos, consultado
Usar um gatilho HTTP como um gatilho de Grade de Eventos, posteriormente neste artigo. No momento, não é
possível usar um gatilho da Grade de Eventos para um aplicativo do Azure Functions quando o evento é
entregue no esquema CloudEvents. Em vez disso, use um gatilho HTTP.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 2. x
O gatilho de grade de eventos é fornecido no Microsoft.Azure.WebJobs.Extensions.EventGrid pacote NuGet,
versão 2. x. O código-fonte do pacote está no repositório GitHub azure-functions-eventgrid-extension.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
Pacotes – Functions 1.x
O gatilho de grade de eventos é fornecido no Microsoft.Azure.WebJobs.Extensions.EventGrid pacote NuGet,
versão 1. x. O código-fonte do pacote está no repositório GitHub azure-functions-eventgrid-extension.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Exemplo
Consulte o exemplo específico do idioma para um gatilho de Grade de Eventos:
C#
Script do C# (. CSx)
Java
JavaScript
Python
Para um exemplo de gatilho HTTP, consulte Como usar o gatilho HTTP, posteriormente neste artigo.
C# (2.x)
O exemplo a seguir mostra um funções 2. x função C# que associa a EventGridEvent :
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace Company.Function
{
public static class EventGridTriggerCSharp
{
[FunctionName("EventGridTest")]
public static void EventGridTest([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
{
log.LogInformation(eventGridEvent.Data.ToString());
}
}
}
namespace Company.Function
{
public static class EventGridTriggerCSharp
{
[FunctionName("EventGridTriggerCSharp")]
public static void Run([EventGridTrigger]JObject eventGridEvent, ILogger log)
{
log.LogInformation(eventGridEvent.ToString(Formatting.Indented));
}
}
}
Exemplo 2 de C# script
O exemplo a seguir mostra uma associação de gatilho em um arquivo function.json e uma função de script de
C# que usa a associação.
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"type": "eventGridTrigger",
"name": "eventGridEvent",
"direction": "in"
}
],
"disabled": false
}
#r "Microsoft.Azure.EventGrid"
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
Exemplo de JavaScript
O exemplo a seguir mostra uma associação de gatilho em um arquivo function.json e uma função JavaScript
que usa a associação.
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"type": "eventGridTrigger",
"name": "eventGridEvent",
"direction": "in"
}
],
"disabled": false
}
Exemplo de Python
O exemplo a seguir mostra uma associação de gatilho em um arquivo function.json e uma função Python que
usa a associação.
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"type": "eventGridTrigger",
"name": "event",
"direction": "in"
}
],
"disabled": false,
"scriptFile": "__init__.py"
}
{
"bindings": [
{
"type": "eventGridTrigger",
"name": "eventGridEvent",
"direction": "in"
}
]
}
@FunctionName("eventGridMonitorString")
public void logEvent(
@EventGridTrigger(
name = "event"
)
String content,
final ExecutionContext context) {
context.getLogger().info("Event content: " + content);
}
import java.util.Date;
import java.util.Map;
}
Na chegada, o conteúdo JSON do evento fica sem serialização no POJO EventSchema para uso pela função.
Isso permite que a função acesse as propriedades do evento de forma orientada a objeto.
@FunctionName("eventGridMonitor")
public void logEvent(
@EventGridTrigger(
name = "event"
)
EventSchema event,
final ExecutionContext context) {
context.getLogger().info("Event content: ");
context.getLogger().info("Subject: " + event.subject);
context.getLogger().info("Time: " + event.eventTime); // automatically converted to Date by the
runtime
context.getLogger().info("Id: " + event.id);
context.getLogger().info("Data: " + event.data);
}
No biblioteca de tempo de execução de funções Java, use o EventGridTrigger anotação em parâmetros cujo
valor virá do EventGrid. Parâmetros com essas anotações fazem com que a função seja executada quando um
evento é recebido. Essa anotação pode ser usada com tipos nativos do Java, POJOs ou valores que permitem
valor nulos usando Optional<T> .
Atributos
Em bibliotecas de classes de C#, utilize o atributo EventGridTrigger.
Aqui está um atributo EventGridTrigger em uma assinatura de método:
[FunctionName("EventGridTest")]
public static void EventGridTest([EventGridTrigger] JObject eventGridEvent, ILogger log)
{
...
}
Configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json. Não há parâmetros ou propriedades do construtor para definir o atributo EventGridTrigger .
Uso
Para C# e F# funções no Azure funciona 1. x, você pode usar os seguintes tipos de parâmetro para o disparador
de grade de eventos:
JObject
string
Para C# e F# funções nas funções do Azure 2. x, você também tem a opção de usar o seguinte tipo de
parâmetro para o disparador de grade de eventos:
Microsoft.Azure.EventGrid.Models.EventGridEvent - Define propriedades para os campos comuns a todos os
tipos de eventos.
NOTE
Em funções v1 se você tentar associar ao Microsoft.Azure.WebJobs.Extensions.EventGrid.EventGridEvent , o
compilador exibirá uma mensagem "substituído" e avisá-lo para usar
Microsoft.Azure.EventGrid.Models.EventGridEvent em vez disso. Para usar o tipo mais recente, fazer referência a
Microsoft.Azure.EventGrid NuGet empacotar e qualificar totalmente o EventGridEvent nome do tipo, prefixando-o com
Microsoft.Azure.EventGrid.Models . Para obter informações sobre como fazer referência a pacotes do NuGet em uma
função de script C#, consulte pacotes usando o NuGet
Para funções JavaScript, o parâmetro nomeado pela propriedade function.json name tem uma referência ao
objeto de evento.
Esquema do evento
Os dados de uma Grade de Eventos são recebidos como um objeto JSON no corpo de uma solicitação HTTP. O
JSON é semelhante ao exemplo a seguir:
[{
"topic":
"/subscriptions/{subscriptionid}/resourceGroups/eg0122/providers/Microsoft.Storage/storageAccounts/egblobsto
re",
"subject": "/blobServices/default/containers/{containername}/blobs/blobname.jpg",
"eventType": "Microsoft.Storage.BlobCreated",
"eventTime": "2018-01-23T17:02:19.6069787Z",
"id": "{guid}",
"data": {
"api": "PutBlockList",
"clientRequestId": "{guid}",
"requestId": "{guid}",
"eTag": "0x8D562831044DDD0",
"contentType": "application/octet-stream",
"contentLength": 2248,
"blobType": "BlockBlob",
"url": "https://egblobstore.blob.core.windows.net/{containername}/blobname.jpg",
"sequencer": "000000000000272D000000000003D60F",
"storageDiagnostics": {
"batchId": "{guid}"
}
},
"dataVersion": "",
"metadataVersion": "1"
}]
O exemplo mostrado é uma matriz de um elemento. A Grade de Eventos envia sempre uma matriz e pode
enviar mais de um evento na matriz. O runtime invoca sua função uma vez para cada elemento da matriz.
As propriedades de nível superior nos dados JSON de evento serão as mesmas entre todos os tipos de eventos,
enquanto os conteúdos da propriedade data estiverem especificados para cada tipo de evento. O exemplo
mostrado é para um evento de armazenamento de Blobs.
Para obter explicações sobre as propriedades comuns e específicas de evento, consulte Propriedades do evento
na documentação da Grade de Eventos.
O tipo EventGridEvent define apenas as propriedades de nível superior; a propriedade Data é um JObject .
Ao selecionar esse link, o portal abrirá a página Criar Assinatura de Evento com a URL do ponto de
extremidade preenchida.
Para obter mais informações sobre como criar assinaturas usando o Portal do Azure, consulte Criar evento
personalizado - Portal do Azure na documentação da Grade de Eventos.
Azure CLI
Para criar uma assinatura usando a CLI do Azure, use o comando az eventgrid event-subscription create.
O comando requer a URL do ponto de extremidade que invoca a função. O exemplo a seguir mostra o padrão
de URL específico da versão:
runtime versão 2.x
https://{functionappname}.azurewebsites.net/runtime/webhooks/eventgrid?functionName={functionname}&code=
{systemkey}
A chave do sistema é uma chave de autorização que deve ser incluída na URL do ponto de extremidade para
um gatilho de Grade de Eventos. A seção a seguir explica como obter a chave do sistema.
Apresentamos aqui um exemplo que assina em uma conta de armazenamento de Blobs (com um espaço
reservado para a chave do sistema):
runtime versão 2.x
Para obter mais informações sobre como criar uma assinatura, consulte o Guia de início rápido do
armazenamento de blobs ou outros guias de início rápido da Grade de Eventos.
Obter a chave do sistema
Você pode obter a chave do sistema usando a seguinte API (HTTP GET):
runtime versão 2.x
http://{functionappname}.azurewebsites.net/admin/host/systemkeys/eventgrid_extension?code={masterkey}
http://{functionappname}.azurewebsites.net/admin/host/systemkeys/eventgridextensionconfig_extension?code=
{masterkey}
Esta é uma API de administração, por isso, requer sua chave mestre do aplicativo. Não confunda a chave do
sistema (para invocar uma função de gatilho de grade de eventos) com a chave mestra (para executar tarefas
administrativas no aplicativo de funções). Ao assinar em um tópico da Grade de Eventos, certifique-se de usar a
chave do sistema.
Aqui, está um exemplo da resposta que fornece a chave do sistema:
{
"name": "eventgridextensionconfig_extension",
"value": "{the system key for the function}",
"links": [
{
"rel": "self",
"href": "{the URL for the function, without the system key}"
}
]
}
Você pode obter a chave mestra para seu aplicativo de função na guia Configurações do aplicativo de
função no portal.
IMPORTANT
A chave mestra fornece acesso de administrador para seu aplicativo de funções. Não compartilhe essa chave com
terceiros ou distribua-a em aplicativos clientes nativos.
Para obter mais informações, consulte Chaves de autorização no artigo de referência de gatilho HTTP.
Como alternativa, você mesmo pode enviar uma HTTP PUT para especificar o valor da chave.
A implantação pode levar alguns minutos para ser concluída. Depois que a implantação for bem-sucedida, exiba
seu aplicativo Web para garantir que ele esteja em execução. Em um navegador da Web, navegue até:
https://<your-site-name>.azurewebsites.net
Para obter mais informações sobre como criar assinaturas usando o portal do Azure, confira Criar um evento
personalizado – portal do Azure na documentação da Grade de Eventos.
Gerar uma solicitação
Dispare um evento que gerará tráfego HTTP para o ponto de extremidade do aplicativo Web. Por exemplo, se
você criou uma assinatura de armazenamento de Blobs, faça upload ou exclua um blob. Quando uma
solicitação for exibida no aplicativo Web, copie o corpo da solicitação.
A solicitação de validação de assinatura será recebida primeiro. Ignore quaisquer solicitações de validação e
copie a solicitação de evento.
http://localhost:7071/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}
Para uso de 1. x:
http://localhost:7071/admin/extensions/EventGridExtensionConfig?functionName={FUNCTION_NAME}
A função de gatilho da Grade de Eventos executa e mostra logs semelhantes ao exemplo a seguir:
Teste local com ngrok
Outra maneira de testar um gatilho de Grade de Eventos localmente é automatizar a conexão HTTP entre a
Internet e o computador de desenvolvimento. Você pode fazer isso com uma ferramenta como ngrok:
1. Criar um ponto de extremidade ngrok.
2. Executar a função de gatilho de Grade de Eventos .
3. Criar uma assinatura na Grade de Eventos que envia eventos para o ponto de extremidade ngrok.
4. Disparar um evento.
Quando terminar de testar, você poderá usar a mesma assinatura para a produção atualizando o ponto de
extremidade. Use o comando da CLI do Azureaz eventgrid event-subscription update.
Criar um ponto de extremidade ngrok
Faça o download do ngrok.exe do ngrok e execute com o seguinte comando:
O parâmetro -host-header é necessário porque o runtime das funções espera solicitações do localhost quando é
executado no localhost. 7071 é o número de porta padrão quando o runtime é executado localmente.
O comando cria saída semelhante à seguinte:
https://{SUBDOMAIN}.ngrok.io/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME}
https://{SUBDOMAIN}.ngrok.io/admin/extensions/EventGridExtensionConfig?functionName={FUNCTION_NAME}
Para obter informações sobre como criar uma assinatura, consulte Criar uma assinatura, posteriormente neste
artigo.
Disparar um evento
Dispare um evento que gerará tráfego HTTP para o ponto de extremidade ngrok. Por exemplo, se você criou
uma assinatura de armazenamento de Blobs, faça upload ou exclua um blob.
A função de gatilho da Grade de Eventos executa e mostra logs semelhantes ao exemplo a seguir:
[FunctionName("HttpTrigger")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequestMessage req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
// If the request is for subscription validation, send back the validation code.
if (messages.Count > 0 && string.Equals((string)messages[0]["eventType"],
"Microsoft.EventGrid.SubscriptionValidationEvent",
System.StringComparison.OrdinalIgnoreCase))
{
log.LogInformation("Validate request received");
return req.CreateResponse<object>(new
{
validationResponse = messages[0]["data"]["validationCode"]
});
}
// The request is not for subscription validation, so it's for one or more events.
foreach (JObject message in messages)
{
// Handle one event.
EventGridEvent eventGridEvent = message.ToObject<EventGridEvent>();
log.LogInformation($"Subject: {eventGridEvent.Subject}");
log.LogInformation($"Time: {eventGridEvent.EventTime}");
log.LogInformation($"Event data: {eventGridEvent.Data.ToString()}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
O código JavaScript de exemplo a seguir para um gatilho HTTP simula o comportamento do gatilho da Grade
de Eventos. Use este exemplo para eventos entregues no esquema da Grade de Eventos.
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
if (message.Type == JTokenType.Array)
{
// If the request is for subscription validation, send back the validation code.
if (string.Equals((string)message[0]["eventType"],
"Microsoft.EventGrid.SubscriptionValidationEvent",
System.StringComparison.OrdinalIgnoreCase))
{
log.LogInformation("Validate request received");
return req.CreateResponse<object>(new
{
validationResponse = message[0]["data"]["validationCode"]
});
}
}
else
{
// The request is not for subscription validation, so it's for an event.
// CloudEvents schema delivers one event at a time.
log.LogInformation($"Source: {message["source"]}");
log.LogInformation($"Time: {message["eventTime"]}");
log.LogInformation($"Event data: {message["data"].ToString()}");
}
return req.CreateResponse(HttpStatusCode.OK);
}
O código JavaScript de exemplo a seguir para um gatilho HTTP simula o comportamento do gatilho da Grade
de Eventos. Use este exemplo para eventos entregues no esquema CloudEvents.
Próximos passos
Aprenda mais sobre gatilhos e de associações do Azure Functions
Saiba mais sobre a Grade de Eventos
Associações de Hubs de Eventos do Azure para o
Azure Functions
25/05/2018 • 32 minutes to read • Edit Online
Este artigo explica como trabalhar com associações de Hubs de Eventos do Azure para o Azure Functions. O
Azure Functions dá suporte a associações de gatilho e de saída para os Hubs de Eventos.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
Para a versão de funções do Azure 1. x, em que as associações de Hubs de eventos são fornecidas a
Microsoft.Azure.WebJobs.ServiceBus pacote NuGet, versão 2. x. O código-fonte do pacote está no repositório
GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Pacotes - Functions 2. x
Para funções 2. x, use o Microsoft.Azure.WebJobs.Extensions.EventHubs pacote, versão 3. x. O código-fonte do
pacote está no repositório GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Gatilho
Use o gatilho de função para responder a um evento enviado a um fluxo de eventos do hub de eventos. Você
deve ter acesso de leitura ao Hub de eventos subjacente para configurar o gatilho. Quando a função é
disparada, a mensagem passada para a função é digitada como uma cadeia de caracteres.
Gatilho - dimensionamento
Cada instância de uma função disparada por evento é apoiada por uma única instância de EventProcessorHost
. O gatilho (da plataforma de hubs de eventos) garante que apenas uma instância EventProcessorHost possa
obter uma concessão em uma determinada partição.
Por exemplo, considere um Hub de eventos da seguinte maneira:
10 partições
1.000 eventos distribuídos uniformemente em todas as partições, com 100 mensagens em cada partição
Quando sua função é habilitada pela primeira vez, há apenas uma instância da função. Vamos chamar a
primeira instância de função Function_0 . A função Function_0 tem uma única instância de
EventProcessorHost que contém uma concessão em todas as dez partições. Esta instância está lendo eventos
das partições 0 a 9. Deste ponto em diante, uma destas opções ocorre:
Novas instâncias de função não são necessárias: Function_0 é capaz de processar todos os eventos
1.000 antes que a lógica de dimensionamento de funções entre em vigor. Nesse caso, todas as
mensagens 1.000 são processadas pelo Function_0 .
Uma instância de função adicional é adicionada: se a lógica de dimensionamento de funções
determinar que Function_0 tem mais mensagens do que pode processar, uma nova instância de
aplicativo de função ( Function_1 ) será criada. Essa nova função também tem uma instância associada
de EventProcessorHost. Como os hubs de eventos subjacentes detectam que uma nova instância do
host está tentando ler mensagens, ele balanceia a carga das partições em suas instâncias de host. Por
exemplo, as partições de 0 a 4 podem ser atribuídas a Function_0 e as partições de 5 a 9 para
Function_1 .
Quando o Functions é dimensionado, N instâncias é um número maior que o número de partições do hub de
eventos. Isso é feito para garantir que as instâncias de EventProcessorHost estejam disponíveis para obter
bloqueios em partições à medida que se tornam disponíveis de outras instâncias. Você é cobrado apenas pelos
recursos usados quando a instância de função é executada. Em outras palavras, você não será cobrado por esse
excesso de provisionamento.
Quando todas as execuções de função são concluídas (com ou sem erros), os pontos de verificação são
adicionados à conta de armazenamento associada. Quando o ponto de verificação for executado com sucesso,
todas as mensagens 1.000 nunca serão recuperadas novamente.
Gatilho - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Gatilho - exemplo C#
O exemplo a seguir mostra uma função C# que registra o corpo da mensagem do gatilho dos hub de eventos.
[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")]
string myEventHubMessage, ILogger log)
{
log.LogInformation($"C# function triggered to process a message: {myEventHubMessage}");
}
Para obter acesso aos metadados no código da função, associe um objeto de EventData (requer o uso de uma
instrução para Microsoft.Azure.EventHubs ). Você também pode acessar as mesmas propriedades usando
expressões de associação na assinatura do método. O exemplo a seguir mostra duas formas de obter os
mesmos dados:
[FunctionName("EventHubTriggerCSharp")]
public static void Run(
[EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")] EventData
myEventHubMessage,
DateTime enqueuedTimeUtc,
Int64 sequenceNumber,
string offset,
ILogger log)
{
log.LogInformation($"Event: {Encoding.UTF8.GetString(myEventHubMessage.Body)}");
// Metadata accessed by binding to EventData
log.LogInformation($"EnqueuedTimeUtc={myEventHubMessage.SystemProperties.EnqueuedTimeUtc}");
log.LogInformation($"SequenceNumber={myEventHubMessage.SystemProperties.SequenceNumber}");
log.LogInformation($"Offset={myEventHubMessage.SystemProperties.Offset}");
// Metadata accessed by using binding expressions in method parameters
log.LogInformation($"EnqueuedTimeUtc={enqueuedTimeUtc}");
log.LogInformation($"SequenceNumber={sequenceNumber}");
log.LogInformation($"Offset={offset}");
}
NOTE
Ao receber em um lote, não é possível associar aos parâmetros do método, como no exemplo acima com
DateTime enqueuedTimeUtc , e deve recebê-los de cada objeto EventData
[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")]
EventData[] eventHubMessages, ILogger log)
{
foreach (var message in eventHubMessages)
{
log.LogInformation($"C# function triggered to process a message:
{Encoding.UTF8.GetString(message.Body)}");
log.LogInformation($"EnqueuedTimeUtc={message.SystemProperties.EnqueuedTimeUtc}");
}
}
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
using System;
Para obter acesso aos metadados no código da função, associe um objeto de EventData (requer o uso de uma
instrução para Microsoft.Azure.EventHubs ). Você também pode acessar as mesmas propriedades usando
expressões de associação na assinatura do método. O exemplo a seguir mostra duas formas de obter os
mesmos dados:
#r "Microsoft.Azure.EventHubs"
using System.Text;
using System;
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.EventHubs;
Gatilho - exemplo F#
O exemplo a seguir mostra uma associação de gatilho de hub de eventos em um arquivo function.json e uma
função F# que usa a associação. A função registra em log o corpo da mensagem do gatilho de hub de eventos.
Os exemplos a seguir mostram dados de associação de Hubs de eventos no function.json arquivo.
Versão 2.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
O código F# é o seguinte:
let Run(myEventHubMessage: string, log: TraceWriter) =
log.Log(sprintf "F# eventhub trigger function processed work item: %s" myEventHubMessage)
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
context.done();
};
Para receber eventos em um lote, defina cardinality para many no arquivo function.json, conforme mostrado
nos exemplos a seguir.
Versão 2.x
{
"type": "eventHubTrigger",
"name": "eventHubMessages",
"direction": "in",
"eventHubName": "MyEventHub",
"cardinality": "many",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "eventHubMessages",
"direction": "in",
"path": "MyEventHub",
"cardinality": "many",
"connection": "myEventHubReadConnectionAppSetting"
}
context.done();
};
{
"type": "eventHubTrigger",
"name": "event",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
import logging
import azure.functions as func
@FunctionName("ehprocessor")
public void eventHubProcessor(
@EventHubTrigger(name = "msg",
eventHubName = "myeventhubname",
connection = "myconnvarname") String message,
final ExecutionContext context )
{
context.getLogger().info(message);
}
No biblioteca de tempo de execução de funções Java, use o EventHubTrigger anotação em parâmetros cujo
valor virá do Hub de eventos. Parâmetros com essas anotações fazem com que a função seja executada quando
um evento chega. Esta anotação pode ser usada com tipos Java nativos, POJOs ou valores anuláveis usando >
opcional<T.
Gatilho - atributos
Em bibliotecas de classes de C#, utilize o atributo EventHubTriggerAttribute.
O construtor do atributo usa os nomes do hub de eventos, do grupo de consumidores e de uma configuração
de aplicativo que contenham a cadeia de caracteres de conexão. Para obter mais informações sobre essas
configurações, consulte a seção sobre configuração do gatilho. Este é um EventHubTriggerAttribute exemplo de
atributo:
[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")]
string myEventHubMessage, ILogger log)
{
...
}
Gatilho – configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo
function.json e o EventHubTrigger atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
{
"eventHub": {
"maxBatchSize": 64,
"prefetchCount": 256,
"batchCheckpointFrequency": 1
}
}
Saída - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Saída - exemplo C#
O exemplo a seguir mostra uma função C# que grava uma mensagem em um hub de eventos, usando o valor
retornado do método como a saída:
[FunctionName("EventHubOutput")]
[return: EventHub("outputEventHubMessage", Connection = "EventHubConnectionAppSetting")]
public static string Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
return $"{DateTime.Now}";
}
O exemplo a seguir mostra como usar a interface IAsyncCollector para enviar um lote de mensagens. Esse
cenário é comum quando você está processando mensagens provenientes de um hub de eventos e enviando o
resultado para outro hub de eventos.
[FunctionName("EH2EH")]
public static async Task Run(
[EventHubTrigger("source", Connection = "EventHubConnectionAppSetting")] EventData[] events,
[EventHub("dest", Connection = "EventHubConnectionAppSetting")]IAsyncCollector<string> outputEvents,
ILogger log)
{
foreach (EventData eventData in events)
{
// do some processing:
var myProcessedEvent = DoSomething(eventData);
{
"type": "eventHub",
"name": "outputEventHubMessage",
"path": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
using System;
using Microsoft.Extensions.Logging;
public static void Run(TimerInfo myTimer, out string outputEventHubMessage, ILogger log)
{
String msg = $"TimerTriggerCSharp1 executed at: {DateTime.Now}";
log.LogInformation(msg);
outputEventHubMessage = msg;
}
Saída - Exemplo #F
O exemplo a seguir mostra uma associação de gatilho de hub de eventos em um arquivo function.json e uma
função F# que usa a associação. A função grava uma mensagem em um hub de eventos.
Os exemplos a seguir mostram dados de associação de Hubs de eventos no function.json arquivo. O primeiro
exemplo é para funções de 2.x e a segunda é para funções 1.x.
{
"type": "eventHub",
"name": "outputEventHubMessage",
"eventHubName": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
{
"type": "eventHub",
"name": "outputEventHubMessage",
"path": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
O código F# é o seguinte:
{
"type": "eventHub",
"name": "outputEventHubMessage",
"eventHubName": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
{
"type": "eventHub",
"name": "outputEventHubMessage",
"path": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
context.bindings.outputEventHubMessage = [];
{
"type": "eventHub",
"name": "$return",
"eventHubName": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
import datetime
import logging
import azure.functions as func
@FunctionName("sendTime")
@EventHubOutput(name = "event", eventHubName = "samples-workitems", connection = "AzureEventHubConnection")
public String sendTime(
@TimerTrigger(name = "sendTimeTrigger", schedule = "0 */5 * * * *") String timerInfo) {
return LocalDateTime.now().toString();
}
Na biblioteca de tempo de execução de funções Java, use a anotação @EventHubOutput em parâmetros cujo
valor seria publicado no Hub de Eventos. O parâmetro deve ser do tipo OutputBinding<T> , em que T é um
POJO ou qualquer tipo Java nativo.
Saída - atributos
Para bibliotecas de classes de C#, utilize o atributo EventHubAttribute.
O construtor do atributo usa os nomes do hub de eventos e de uma configuração de aplicativo que contenham
a cadeia de caracteres de conexão. Para obter mais informações sobre essas configurações, consulte Saída -
configuração. Este é um EventHub exemplo de atributo:
[FunctionName("EventHubOutput")]
[return: EventHub("outputEventHubMessage", Connection = "EventHubConnectionAppSetting")]
public static string Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo
function.json e o EventHub atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
Em C# e C# script, envie mensagens usando um parâmetro de método, como out string paramName . No script
do C#, paramName é o valor especificado na propriedade name de function.json. Para gravar várias mensagens,
você pode usar ICollector<string> ou IAsyncCollector<string> no lugar de out string .
Em JavaScript, acesse o evento de saída usando context.bindings.<name> . <name> é o valor especificado na
propriedade name de function.json.
configurações de host.json
Esta seção descreve as definições de configuração globais disponíveis para esta associação na versão 2.x. O
arquivo host.json de exemplo abaixo contém apenas as configurações da versão 2.x para essa associação. Para
obter mais informações sobre as configurações globais na versão 2.x, confira a referência de host.json para o
Azure Functions versão 2.x.
NOTE
Para obter uma referência de host.json no Functions 1.x, confira Referência de host.json para o Azure Functions 1.x.
{
"version": "2.0",
"extensions": {
"eventHubs": {
"batchCheckpointFrequency": 5,
"eventProcessorOptions": {
"maxBatchSize": 256,
"prefetchCount": 512
}
}
}
}
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associações do Hub IoT do Azure para Azure
Functions
08/11/2019 • 32 minutes to read • Edit Online
Este artigo explica como trabalhar com associações de Azure Functions para o Hub IoT. O suporte ao Hub IoT é
baseado na Associação de hubs de eventos do Azure.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
Para Azure Functions versão 1. x, as associações do Hub IoT são fornecidas no pacote NuGet Microsoft. Azure.
webjobs. ServiceBus , versão 2. x. O código-fonte do pacote está no repositório GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Pacotes - Functions 2. x
Para funções 2. x, use o Microsoft.Azure.WebJobs.Extensions.EventHubs pacote, versão 3. x. O código-fonte do
pacote está no repositório GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
IMPORTANT
Embora os exemplos de código a seguir usem a API do hub de eventos, a sintaxe fornecida é aplicável a funções do Hub
IoT.
Gatilho
Use o gatilho de função para responder a um evento enviado a um fluxo de eventos do hub de eventos. Você
deve ter acesso de leitura ao Hub de eventos subjacente para configurar o gatilho. Quando a função é disparada,
a mensagem passada para a função é digitada como uma cadeia de caracteres.
Gatilho - dimensionamento
Cada instância de uma função disparada por evento é apoiada por uma única instância de EventProcessorHost .
O gatilho (da plataforma de hubs de eventos) garante que apenas uma instância EventProcessorHost possa obter
uma concessão em uma determinada partição.
Por exemplo, considere um Hub de eventos da seguinte maneira:
10 partições
1.000 eventos distribuídos uniformemente em todas as partições, com 100 mensagens em cada partição
Quando sua função é habilitada pela primeira vez, há apenas uma instância da função. Vamos chamar a primeira
instância de função Function_0 . A função Function_0 tem uma única instância de EventProcessorHost que
contém uma concessão em todas as dez partições. Esta instância está lendo eventos das partições 0 a 9. Deste
ponto em diante, uma destas opções ocorre:
Novas instâncias de função não são necessárias: Function_0 é capaz de processar todos os eventos
1.000 antes que a lógica de dimensionamento de funções entre em vigor. Nesse caso, todas as mensagens
1.000 são processadas pelo Function_0 .
Uma instância de função adicional é adicionada: se a lógica de dimensionamento de funções
determinar que Function_0 tem mais mensagens do que pode processar, uma nova instância de aplicativo
de função ( Function_1 ) será criada. Essa nova função também tem uma instância associada de
EventProcessorHost. Como os hubs de eventos subjacentes detectam que uma nova instância do host está
tentando ler mensagens, ele balanceia a carga das partições em suas instâncias de host. Por exemplo, as
partições de 0 a 4 podem ser atribuídas a Function_0 e as partições de 5 a 9 para Function_1 .
N mais instâncias de função são adicionadas: se a lógica de dimensionamento de funções determinar
que tanto Function_0 quanto Function_1 têm mais mensagens do que podem ser processadas, novas
instâncias de aplicativo de função Functions_N são criadas. Os aplicativos são criados para o ponto em que
N é maior que o número de partições do hub de eventos. Em nosso exemplo, os Hubs de Eventos
balanceiam a carga das partições novamente e, nesse caso, entre as instâncias Function_0 e Functions_9 .
Quando o Functions é dimensionado, N instâncias é um número maior que o número de partições do hub de
eventos. Isso é feito para garantir que as instâncias de EventProcessorHost estejam disponíveis para obter
bloqueios em partições à medida que se tornam disponíveis de outras instâncias. Você é cobrado apenas pelos
recursos usados quando a instância de função é executada. Em outras palavras, você não será cobrado por esse
excesso de provisionamento.
Quando todas as execuções de função são concluídas (com ou sem erros), os pontos de verificação são
adicionados à conta de armazenamento associada. Quando o ponto de verificação for executado com sucesso,
todas as mensagens 1.000 nunca serão recuperadas novamente.
Gatilho - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Gatilho - exemplo C#
O exemplo a seguir mostra uma função C# que registra o corpo da mensagem do gatilho dos hub de eventos.
[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")]
string myEventHubMessage, ILogger log)
{
log.LogInformation($"C# function triggered to process a message: {myEventHubMessage}");
}
Para obter acesso aos metadados no código da função, associe um objeto de EventData (requer o uso de uma
instrução para Microsoft.Azure.EventHubs ). Você também pode acessar as mesmas propriedades usando
expressões de associação na assinatura do método. O exemplo a seguir mostra duas formas de obter os mesmos
dados:
[FunctionName("EventHubTriggerCSharp")]
public static void Run(
[EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")] EventData
myEventHubMessage,
DateTime enqueuedTimeUtc,
Int64 sequenceNumber,
string offset,
ILogger log)
{
log.LogInformation($"Event: {Encoding.UTF8.GetString(myEventHubMessage.Body)}");
// Metadata accessed by binding to EventData
log.LogInformation($"EnqueuedTimeUtc={myEventHubMessage.SystemProperties.EnqueuedTimeUtc}");
log.LogInformation($"SequenceNumber={myEventHubMessage.SystemProperties.SequenceNumber}");
log.LogInformation($"Offset={myEventHubMessage.SystemProperties.Offset}");
// Metadata accessed by using binding expressions in method parameters
log.LogInformation($"EnqueuedTimeUtc={enqueuedTimeUtc}");
log.LogInformation($"SequenceNumber={sequenceNumber}");
log.LogInformation($"Offset={offset}");
}
NOTE
Ao receber em um lote, não é possível associar aos parâmetros do método, como no exemplo acima com
DateTime enqueuedTimeUtc , e deve recebê-los de cada objeto EventData
[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")]
EventData[] eventHubMessages, ILogger log)
{
foreach (var message in eventHubMessages)
{
log.LogInformation($"C# function triggered to process a message:
{Encoding.UTF8.GetString(message.Body)}");
log.LogInformation($"EnqueuedTimeUtc={message.SystemProperties.EnqueuedTimeUtc}");
}
}
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
using System;
Para obter acesso aos metadados no código da função, associe um objeto de EventData (requer o uso de uma
instrução para Microsoft.Azure.EventHubs ). Você também pode acessar as mesmas propriedades usando
expressões de associação na assinatura do método. O exemplo a seguir mostra duas formas de obter os mesmos
dados:
#r "Microsoft.Azure.EventHubs"
using System.Text;
using System;
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.EventHubs;
Gatilho - exemplo F#
O exemplo a seguir mostra uma associação de gatilho de hub de eventos em um arquivo function.json e uma
função F# que usa a associação. A função registra em log o corpo da mensagem do gatilho de hub de eventos.
Os exemplos a seguir mostram dados de associação de Hubs de eventos no function.json arquivo.
Versão 2.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
O código F# é o seguinte:
let Run(myEventHubMessage: string, log: TraceWriter) =
log.Log(sprintf "F# eventhub trigger function processed work item: %s" myEventHubMessage)
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "myEventHubMessage",
"direction": "in",
"path": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
context.done();
};
Para receber eventos em um lote, defina cardinality para many no arquivo function.json, conforme mostrado
nos exemplos a seguir.
Versão 2.x
{
"type": "eventHubTrigger",
"name": "eventHubMessages",
"direction": "in",
"eventHubName": "MyEventHub",
"cardinality": "many",
"connection": "myEventHubReadConnectionAppSetting"
}
Versão 1.x
{
"type": "eventHubTrigger",
"name": "eventHubMessages",
"direction": "in",
"path": "MyEventHub",
"cardinality": "many",
"connection": "myEventHubReadConnectionAppSetting"
}
context.done();
};
{
"type": "eventHubTrigger",
"name": "event",
"direction": "in",
"eventHubName": "MyEventHub",
"connection": "myEventHubReadConnectionAppSetting"
}
import logging
import azure.functions as func
@FunctionName("ehprocessor")
public void eventHubProcessor(
@EventHubTrigger(name = "msg",
eventHubName = "myeventhubname",
connection = "myconnvarname") String message,
final ExecutionContext context )
{
context.getLogger().info(message);
}
No biblioteca de tempo de execução de funções Java, use o EventHubTrigger anotação em parâmetros cujo valor
virá do Hub de eventos. Parâmetros com essas anotações fazem com que a função seja executada quando um
evento chega. Esta anotação pode ser usada com tipos Java nativos, POJOs ou valores anuláveis usando >
opcional<T.
Gatilho - atributos
Em bibliotecas de classes de C#, utilize o atributo EventHubTriggerAttribute.
O construtor do atributo usa os nomes do hub de eventos, do grupo de consumidores e de uma configuração de
aplicativo que contenham a cadeia de caracteres de conexão. Para obter mais informações sobre essas
configurações, consulte a seção sobre configuração do gatilho. Este é um EventHubTriggerAttribute exemplo de
atributo:
[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("samples-workitems", Connection = "EventHubConnectionAppSetting")]
string myEventHubMessage, ILogger log)
{
...
}
Gatilho – configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo function.json
e o EventHubTrigger atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
{
"eventHub": {
"maxBatchSize": 64,
"prefetchCount": 256,
"batchCheckpointFrequency": 1
}
}
Saída - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Saída - exemplo C#
O exemplo a seguir mostra uma função C# que grava uma mensagem em um hub de eventos, usando o valor
retornado do método como a saída:
[FunctionName("EventHubOutput")]
[return: EventHub("outputEventHubMessage", Connection = "EventHubConnectionAppSetting")]
public static string Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
return $"{DateTime.Now}";
}
O exemplo a seguir mostra como usar a interface IAsyncCollector para enviar um lote de mensagens. Esse
cenário é comum quando você está processando mensagens provenientes de um hub de eventos e enviando o
resultado para outro hub de eventos.
[FunctionName("EH2EH")]
public static async Task Run(
[EventHubTrigger("source", Connection = "EventHubConnectionAppSetting")] EventData[] events,
[EventHub("dest", Connection = "EventHubConnectionAppSetting")]IAsyncCollector<string> outputEvents,
ILogger log)
{
foreach (EventData eventData in events)
{
// do some processing:
var myProcessedEvent = DoSomething(eventData);
{
"type": "eventHub",
"name": "outputEventHubMessage",
"path": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
using System;
using Microsoft.Extensions.Logging;
public static void Run(TimerInfo myTimer, out string outputEventHubMessage, ILogger log)
{
String msg = $"TimerTriggerCSharp1 executed at: {DateTime.Now}";
log.LogInformation(msg);
outputEventHubMessage = msg;
}
Saída - Exemplo #F
O exemplo a seguir mostra uma associação de gatilho de hub de eventos em um arquivo function.json e uma
função F# que usa a associação. A função grava uma mensagem em um hub de eventos.
Os exemplos a seguir mostram dados de associação de Hubs de eventos no function.json arquivo. O primeiro
exemplo é para funções de 2.x e a segunda é para funções 1.x.
{
"type": "eventHub",
"name": "outputEventHubMessage",
"eventHubName": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
{
"type": "eventHub",
"name": "outputEventHubMessage",
"path": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
O código F# é o seguinte:
{
"type": "eventHub",
"name": "outputEventHubMessage",
"eventHubName": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
{
"type": "eventHub",
"name": "outputEventHubMessage",
"path": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
context.bindings.outputEventHubMessage = [];
{
"type": "eventHub",
"name": "$return",
"eventHubName": "myeventhub",
"connection": "MyEventHubSendAppSetting",
"direction": "out"
}
import datetime
import logging
import azure.functions as func
@FunctionName("sendTime")
@EventHubOutput(name = "event", eventHubName = "samples-workitems", connection = "AzureEventHubConnection")
public String sendTime(
@TimerTrigger(name = "sendTimeTrigger", schedule = "0 */5 * * * *") String timerInfo) {
return LocalDateTime.now().toString();
}
Na biblioteca de tempo de execução de funções Java, use a anotação @EventHubOutput em parâmetros cujo valor
seria publicado no Hub de Eventos. O parâmetro deve ser do tipo OutputBinding<T> , em que T é um POJO ou
qualquer tipo Java nativo.
Saída - atributos
Para bibliotecas de classes de C#, utilize o atributo EventHubAttribute.
O construtor do atributo usa os nomes do hub de eventos e de uma configuração de aplicativo que contenham a
cadeia de caracteres de conexão. Para obter mais informações sobre essas configurações, consulte Saída -
configuração. Este é um EventHub exemplo de atributo:
[FunctionName("EventHubOutput")]
[return: EventHub("outputEventHubMessage", Connection = "EventHubConnectionAppSetting")]
public static string Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo function.json
e o EventHub atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
Em C# e C# script, envie mensagens usando um parâmetro de método, como out string paramName . No script do
C#, paramName é o valor especificado na propriedade name de function.json. Para gravar várias mensagens, você
pode usar ICollector<string> ou IAsyncCollector<string> no lugar de out string .
Em JavaScript, acesse o evento de saída usando context.bindings.<name> . <name> é o valor especificado na
propriedade name de function.json.
configurações de host.json
Esta seção descreve as definições de configuração globais disponíveis para esta associação na versão 2.x. O
arquivo host.json de exemplo abaixo contém apenas as configurações da versão 2.x para essa associação. Para
obter mais informações sobre as configurações globais na versão 2.x, confira a referência de host.json para o
Azure Functions versão 2.x.
NOTE
Para obter uma referência de host.json no Functions 1.x, confira Referência de host.json para o Azure Functions 1.x.
{
"version": "2.0",
"extensions": {
"eventHubs": {
"batchCheckpointFrequency": 5,
"eventProcessorOptions": {
"maxBatchSize": 256,
"prefetchCount": 512
}
}
}
}
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Gatilhos e associações HTTP do Azure Functions
25/05/2018 • 41 minutes to read • Edit Online
Este artigo explica como trabalhar com gatilhos e associações de saída HTTP no Azure Functions.
Um gatilho de HTTP pode ser personalizado para responder a webhooks.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
TIP
Se você planeja usar as ligações HTTP ou WebHook, planeje evitar o esgotamento de porta que pode ser causado
pela instanciação incorreta do HttpClient . Para saber mais, confira Como gerenciar conexões no Azure
Functions.
O código nesse artigo tem como padrão a sintaxe Funções 2.x que usa o .NET Core. Para obter
informações sobre a sintaxe 1.x, consulte os modelos de funções 1.x.
Pacotes - Functions 1. x
As associações de HTTP são fornecidas no pacote NuGet, versão 1.x.
Microsoft.Azure.WebJobs.Extensions.Http. O código-fonte do pacote está no repositório GitHub azure-
webjobs-sdk-extensions.
O suporte para essa associação é fornecido automaticamente em todos os ambientes de
desenvolvimento. Você não precisa instalar o pacote ou registrar a extensão manualmente.
Pacotes - Functions 2. x
As associações de HTTP são fornecidas no pacote NuGet, versão 3.x.
Microsoft.Azure.WebJobs.Extensions.Http. O código-fonte do pacote está no repositório GitHub azure-
webjobs-sdk-extensions.
O suporte para essa associação é fornecido automaticamente em todos os ambientes de
desenvolvimento. Você não precisa instalar o pacote ou registrar a extensão manualmente.
Gatilho
Um gatilho de HTTP permite invocar uma função com uma solicitação HTTP. Você pode usar um gatilho
de HTTP para criar APIs sem servidor e responder a webhooks.
Por padrão, um gatilho HTTP retorna HTTP 200 OK com um corpo vazio em funções de 1. x ou HTTP
204 sem conteúdo com um corpo vazio em funções 2. x. Para modificar a resposta, configure uma
associação de saída de HTTP.
Gatilho - exemplo
C#
C#Prescritiva
JavaScript
Python
Java
O exemplo a seguir mostra uma função C# que procura por um parâmetro name na cadeia de caracteres
de consulta ou no corpo da solicitação HTTP. Observe que o valor de retorno é usado para a associação
de saída, mas um atributo de valor de retorno não é necessário.
[FunctionName("HttpTriggerCSharp")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
HttpRequest req, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
Gatilho - atributos
Em C# bibliotecas de classes e Java, o atributo HttpTrigger está disponível para configurar a função.
Você pode definir o nível de autorização e os métodos HTTP permitidos em parâmetros de construtor de
atributo, tipo de webhook e um modelo de rota. Para saber mais informações sobre essas configurações,
consulte Gatilho - configuração.
C#
C#Prescritiva
JavaScript
Python
Java
Este exemplo demonstra como usar o atributo HttpTrigger .
[FunctionName("HttpTriggerCSharp")]
public static Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req)
{
...
}
Gatilho - uso
O tipo de entrada do gatilho é declarado como HttpRequest ou um tipo personalizado. Ao escolher
HttpRequest , você obterá acesso completo ao objeto de solicitação. Para um tipo personalizado, o tempo
de execução tenta analisar o corpo da solicitação JSON para definir as propriedades do objeto.
Personalização do ponto de extremidade HTTP
Por padrão quando você cria uma função para um gatilho HTTP, a função é endereçável com uma rota do
formulário:
http://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>
Você pode personalizar essa rota usando a propriedade route opcional na associação de entrada do
gatilho HTTP. Por exemplo, o seguinte arquivo function.json define uma propriedade route para um
gatilho HTTP:
{
"bindings": [
{
"type": "httpTrigger",
"name": "req",
"direction": "in",
"methods": [ "get" ],
"route": "products/{category:alpha}/{id:int?}"
},
{
"type": "http",
"name": "res",
"direction": "out"
}
]
}
Usando esta configuração, a função é agora endereçável com a seguinte rota em vez da rota original.
http://<APP_NAME>.azurewebsites.net/api/products/electronics/357
Isso permite que o código de função dê suporte a dois parâmetros no endereço, category e id.
C#
C#Prescritiva
JavaScript
Python
Java
Você pode usar qualquer Restrição de rota de API Web com seus parâmetros. O seguinte código de
função em C# faz uso de ambos os parâmetros.
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
public static IActionResult Run(HttpRequest req, string category, int? id, ILogger log)
{
var message = String.Format($"Category: {category}, ID: {id}");
return (ActionResult)new OkObjectResult(message);
}
Por padrão, todas as rotas de função são prefixadas com api. Você também pode personalizar ou remover
o prefixo usando a propriedade http.routePrefix em seu arquivo host.json. O exemplo a seguir remove
o prefixo de rota api usando uma cadeia de caracteres vazia para o prefixo no arquivo host.json.
{
"http": {
"routePrefix": ""
}
}
using System.Net;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
Como alternativa, o ClaimsPrincipal pode ser simplesmente incluído como um parâmetro adicional na
assinatura da função:
using System.Net;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
using Newtonsoft.Json.Linq;
Chaves de autorização
As funções permitem o uso de chaves para dificultar o acesso aos pontos de extremidade de função
HTTP durante o desenvolvimento. Um gatilho HTTP padrão pode exigir que uma chave de API esteja
presente na solicitação.
IMPORTANT
Embora as chaves possam ajudar o ofuscar seus pontos de extremidade HTTP durante o desenvolvimento, elas
não foram projetadas como uma maneira de proteger um gatilho HTTP em produção. Para obter mais
informações, confira Proteger um ponto de extremidade HTTP em produção.
NOTE
No tempo de execução 1.x do Functions, os provedores de webhook podem usar chaves para autorizar solicitações
de várias maneiras, dependendo do suporte do provedor. Isso é abordado em Webhooks e chaves. A versão 2.x do
tempo de execução não inclui suporte interno para provedores de webhook.
Há dois tipos de chave:
Chaves de host: essas chaves são compartilhadas por todas as funções do aplicativo de funções.
Quando usadas como uma chave de API, elas permitem acesso a qualquer função no aplicativo de
funções.
Chaves de função: essas chaves se aplicam apenas às funções específicas sob as quais elas foram
definidas. Quando usadas como uma chave de API, elas permitem acesso apenas às funções em
questão.
Cada chave é nomeada para referência e há uma chave padrão (chamada "default") no nível de função e
de host. As chaves de função têm precedência sobre as chaves de host. Quando duas chaves forem
definidas com o mesmo nome, a chave de função sempre será usada.
Cada aplicativo de funções também tem uma chave mestra especial. Essa chave é uma chave de host
chamada _master , que fornece acesso administrativo às APIs de tempo de execução. Não é possível
revogar essa chave. Quando você define o nível de autorização como admin , as solicitações precisam
usar a chave mestra. Nesse caso, o uso de outra chave resulta em falha na autorização.
Cau t i on
Devido às permissões elevadas no aplicativo de funções concedidas pela chave mestra, você não deve
compartilhar essa chave com terceiros nem distribuí-la em aplicativos cliente nativos. Tenha cuidado ao
escolher o nível de autorização do administrador.
Obtendo chaves
As chaves são armazenadas como parte do seu aplicativo de funções no Azure e criptografadas em
repouso. Para exibir suas chaves, criar chaves ou gerar novos valores para as chaves, navegue até uma
das funções disparadas por HTTP no portal do Azure e selecione Gerenciar.
Você pode obter as chaves de função programaticamente usando APIs de gerenciamento de chaves.
Autorização da chave de API
A maioria dos modelos de gatilho HTTP exigem uma chave de API na solicitação. Portanto, a solicitação
HTTP geralmente será como a seguinte URL:
https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?code=<API_KEY>
A chave pode ser incluída em uma variável de cadeia de consulta chamada code , como acima. Ela
também pode ser incluída em um cabeçalho HTTP x-functions-key . O valor da chave pode ser qualquer
chave de função definida para a função ou qualquer chave de host.
Você pode permitir solicitações anônimas, o que não exige chaves. Você também pode exigir que a chave
mestra seja usada. Altere o nível de autorização padrão usando a propriedade authLevel no JSON de
associação. Para saber mais informações, consulte Gatilho - configuração.
NOTE
Durante a execução local de funções, a autorização fica desabilitada, independentemente da configuração de nível
de autenticação especificada. Após a publicação no Azure, a configuração authLevel no gatilho é imposta. As
chaves ainda são necessárias ao executar localmente em um contêiner.
NOTE
O modo de webhook só está disponível para a versão 1.x do tempo de execução do Functions. Essa alteração foi
feita para melhorar o desempenho de gatilhos HTTP na versão 2.x.
Na versão 1.x, os modelos de webhook fornecem validação adicional para conteúdo de webhook. Na
versão 2.x, o gatilho HTTP base ainda funciona e é a abordagem recomendada para webhooks.
Webhooks do GitHub
Para responder a webhooks do GitHub, primeiramente crie sua função com um Gatilho HTTP e defina a
propriedade webHookType como github . Em seguida, copie a URL e a chave de API na página
Adicionar webhook do seu repositório GitHub.
Webhooks do Slack
O webhook do Slack gera um token em vez de permitir que você o especifique, de modo que é preciso
configurar uma chave específica de função com o token do Slack. Consulte Chaves de autorização.
Webhooks e chaves
A autorização de webhook é tratada pelo componente receptor do webhook, parte do gatilho HTTP e o
mecanismo varia com base no tipo de webhook. Cada mecanismo conta com uma chave. Por padrão, a
chave de função chamada "default" será usada. Para usar uma chave diferente, configure o provedor do
webhook para enviar o nome da chave com a solicitação de uma das seguintes maneiras:
Cadeia de caracteres de consulta: o provedor passa o nome da chave no parâmetro de cadeia de
caracteres de consulta clientid , como
https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?clientid=<KEY_NAME> .
Cabeçalho da solicitação: o provedor passa o nome da chave no cabeçalho x-functions-clientid .
Gatilho - limites
O tamanho da solicitação HTTP é limitado a 100 MB (104.857.600 bytes) e o tamanho da URL é limitado
a 4 KB (4.096 bytes). Esses limites são especificados pelo httpRuntime elemento do arquivo Web.config
do tempo de execução.
Se uma função que usa o gatilho HTTP não for concluída em aproximadamente 2,5 minutos, o gateway
atingirá o tempo limite e retornará o erro de HTTP 502. A função continuará em execução, mas não
poderá retornar uma resposta HTTP. Para funções de longa execução, é recomendável que você siga os
padrões async e retorna um local onde você pode executar ping do status da solicitação. Para obter
informações sobre o tempo que uma função pode executar, consulte Dimensionamento e hospedagem -
planejar o consumo.
Saída
Use a associação de saída HTTP para responder ao remetente da solicitação HTTP. Essa associação
requer um gatilho HTTP e permite que você personalize a resposta associada à solicitação do gatilho. Se
uma saída HTTP vinculada não é fornecida, um gatilho HTTP retorna HTTP 200 OK com um corpo vazio
em funções de 1. x ou HTTP 204 sem conteúdo com um corpo vazio em funções 2. x.
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json. Para as bibliotecas de classes C#, não há propriedades de atributo que correspondem a
essas propriedades do function.json.
PROPRIEDADE DESCRIÇÃO
Saída - uso
Para enviar uma resposta HTTP, use os padrões de resposta padrão do idioma. Em c# ou script c#, faça o
tipo de retorno da função retorno IActionResult ou Task<IActionResult> . Em c#, um atributo de valor de
retorno não é necessário.
Por ver exemplos de respostas, confira o exemplo de gatilho.
configurações de host.json
Esta seção descreve as definições de configuração globais disponíveis para esta associação na versão 2.x.
O arquivo host.json de exemplo abaixo contém apenas as configurações da versão 2.x para essa
associação. Para obter mais informações sobre as configurações globais na versão 2.x, confira a referência
de host.json para o Azure Functions versão 2.x.
NOTE
Para obter uma referência de host.json no Functions 1.x, confira Referência de host.json para o Azure Functions 1.x.
{
"extensions": {
"http": {
"routePrefix": "api",
"maxOutstandingRequests": 200,
"maxConcurrentRequests": 100,
"dynamicThrottlesEnabled": true,
"hsts": {
"isEnabled": true,
"maxAge": "10"
},
"customHeaders": {
"X-Content-Type-Options": "nosniff"
}
}
}
}
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associações do Microsoft Graph do Azure
Functions
08/11/2019 • 56 minutes to read • Edit Online
Este artigo explica como configurar e trabalhar com gatilhos e associações do Microsoft Graph no Azure
Functions. Com isso, você pode usar o Azure Functions para trabalhar com eventos, percepções e dados do
Microsoft Graph.
A extensão do Microsoft Graph oferece as seguintes associações:
Um associação de entrada do token de autenticação permite que você interaja com qualquer API do
Microsoft Graph.
Uma associação de entrada de tabela do Excel permite que você leia os dados do Excel.
Uma associação de saída de tabela do Excel permite que você modifique os dados do Excel.
Uma associação de entrada de arquivo do OneDrive permite que você leia arquivos no OneDrive.
Uma associação de saída de arquivo do OneDrive permite que você grave arquivos no OneDrive.
Uma associação de saída de mensagem do Outlook permite que você envie email por meio do Outlook.
Uma coleção de gatilhos e associações do Microsoft Graph webhook permite reagir a eventos do
Microsoft Graph.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
NOTE
As associações do Microsoft Graph estão em versão prévia no momento para Azure Functions versão 2.x. Eles não
são suportados no Functions versão 1.x.
Pacotes
A associação de entrada de token de autenticação é fornecida no pacote NuGet
Microsoft.Azure.WebJobs.Extensions.AuthTokens. As outras associações do Microsoft Graph são
fornecidas no pacote Microsoft.Azure.WebJobs.Extensions.MicrosoftGraph. O código-fonte dos pacotes
está no repositório GitHub azure-functions-microsoftgraph-extension.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de
desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto
de aplicativo de funções, consulte Atualizar as extensões.
NOTE
O processo de instalação no portal pode levar até 10 minutos em um plano de consumo.
Se você estiver usando o Visual Studio, poderá obter as extensões instalando os pacotes do NuGet que
estão listados neste artigo.
Configurando a Autenticação/Autorização
As associações descritas neste artigo exigem que uma identidade seja usada. Isso permite que o Microsoft
Graph aplique permissões e interações de auditoria. A identidade pode ser um usuário acessando seu
aplicativo ou o aplicativo em si. Para configurar essa identidade, configure Autenticação/Autorização do
Serviço de Aplicativo com o Azure Active Directory. Você também precisará solicitar quaisquer permissões
de recurso que suas funções exijam.
NOTE
A extensão do Microsoft Graph tem suporte apenas para autenticação do Azure AD. Os usuários precisam fazer
logon com uma conta corporativa ou de estudante.
Se estiver usando o portal do Azure, você verá um aviso abaixo do prompt para instalar a extensão. O
aviso que solicita que você configure a Autenticação/Autorização do Serviço de Aplicativo e solicita
quaisquer permissões de que o modelo ou associação precise. Clique em Configurar Azure AD agora ou
Adicionar permissões agora conforme apropriado.
Token de autenticação
Essas associações de entrada do token de autenticação obtêm um token do Azure AD para um
determinado recurso e fornece-o ao seu código como uma cadeia de caracteres. O recurso pode ser
qualquer um para o qual o aplicativo tenha permissões.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Token de autenticação - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Token de autenticação - exemplo de script C#
O seguinte exemplo obtém informações do perfil do usuário.
O arquivo function.json define um gatilho HTTP com uma associação de entrada do token:
{
"bindings": [
{
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"type": "token",
"direction": "in",
"name": "graphToken",
"resource": "https://graph.microsoft.com",
"identity": "userFromRequest"
},
{
"name": "$return",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
O código do script C# usa o token para fazer uma chamada HTTP para o Microsoft Graph e retorna o
resultado:
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using Microsoft.Extensions.Logging;
{
"bindings": [
{
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"type": "token",
"direction": "in",
"name": "graphToken",
"resource": "https://graph.microsoft.com",
"identity": "userFromRequest"
},
{
"name": "res",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
O código do JavaScript usa o token para fazer uma chamada HTTP para o Microsoft Graph e retorna o
resultado.
const rp = require('request-promise');
let options = {
uri: 'https://graph.microsoft.com/v1.0/me/',
headers: {
'Authorization': token
}
};
rp(options)
.then(function(profile) {
context.res = {
body: profile
};
context.done();
})
.catch(function(err) {
context.res = {
status: 500,
body: err
};
context.done();
});
};
NOTE
Ao desenvolver localmente com qualquer opção de userFromId , userFromToken ou userFromRequest , o token
necessário pode ser obtido manualmente e especificado no cabeçalho de solicitação X-MS-TOKEN-AAD-ID-TOKEN de
um aplicativo de cliente de chamada.
Entrada do Excel
Essa associação de entrada de tabela do Excel lê o conteúdo de uma tabela do Excel armazenada no
OneDrive.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Entrada do Excel - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Entrada do Excel - exemplo de script C#
O arquivo function.json a seguir define um gatilho HTTP com uma associação de entrada do Excel:
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"type": "excel",
"direction": "in",
"name": "excelTableData",
"path": "{query.workbook}",
"identity": "UserFromRequest",
"tableName": "{query.table}"
},
{
"name": "$return",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.Extensions.Logging;
RESOURCE PERMISSÃO
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"name": "newExcelRow",
"type": "excel",
"direction": "out",
"identity": "userFromRequest",
"updateType": "append",
"path": "{query.workbook}",
"tableName": "{query.table}"
},
{
"name": "$return",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
O código do script C# adiciona uma nova linha à tabela (presumidamente de uma única coluna) com base
na entrada da cadeia de caracteres de consulta:
using System.Net;
using System.Text;
using Microsoft.Extensions.Logging;
public static async Task Run(HttpRequest req, IAsyncCollector<object> newExcelRow, ILogger log)
{
string input = req.Query
.FirstOrDefault(q => string.Compare(q.Key, "text", true) == 0)
.Value;
await newExcelRow.AddAsync(new {
Text = input
// Add other properties for additional columns here
});
return;
}
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"name": "newExcelRow",
"type": "excel",
"direction": "out",
"identity": "userFromRequest",
"updateType": "append",
"path": "{query.workbook}",
"tableName": "{query.table}"
},
{
"name": "res",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
O código do JavaScript a seguir adiciona uma nova linha à tabela (presumidamente de uma única coluna)
com base na entrada da cadeia de caracteres de consulta.
RESOURCE PERMISSÃO
Entrada do arquivo
Essa associação de entrada do Arquivo do OneDrive lê o conteúdo de um arquivo armazenado no
OneDrive.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Entrada do Arquivo - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Entrada do Arquivo - exemplo de script C#
O exemplo a seguir lê um arquivo que está armazenado no OneDrive.
O arquivo function.json define um gatilho HTTP com uma associação de entrada do arquivo do OneDrive:
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"name": "myOneDriveFile",
"type": "onedrive",
"direction": "in",
"path": "{query.filename}",
"identity": "userFromRequest"
},
{
"name": "$return",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
using System.Net;
using Microsoft.Extensions.Logging;
O código do JavaScript a seguir lê o arquivo especificado na cadeia de caracteres de consulta e registra seu
comprimento.
RESOURCE PERMISSÃO
Saída do arquivo
Essa associação de saída do arquivo do OneDrive modifica o conteúdo de um arquivo armazenado no
OneDrive.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Saída do arquivo - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Saída do arquivo - exemplo de script C#
O exemplo a seguir grava um arquivo que está armazenado no OneDrive.
O arquivo function.json define um gatilho HTTP com uma associação de saída do OneDrive:
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"name": "myOneDriveFile",
"type": "onedrive",
"direction": "out",
"path": "FunctionsTest.txt",
"identity": "userFromRequest"
},
{
"name": "$return",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
O código do script C# obtém o texto da cadeia de caracteres de consulta e grava-o em um arquivo de texto
(FunctionsTest.txt conforme definido na configuração acima) na raiz do OneDrive do chamador:
using System.Net;
using System.Text;
using Microsoft.Extensions.Logging;
public static async Task Run(HttpRequest req, ILogger log, Stream myOneDriveFile)
{
string data = req.Query
.FirstOrDefault(q => string.Compare(q.Key, "text", true) == 0)
.Value;
await myOneDriveFile.WriteAsync(Encoding.UTF8.GetBytes(data), 0, data.Length);
myOneDriveFile.Close();
return;
}
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"name": "myOneDriveFile",
"type": "onedrive",
"direction": "out",
"path": "FunctionsTest.txt",
"identity": "userFromRequest"
},
{
"name": "res",
"type": "http",
"direction": "out"
}
],
"disabled": false
}
RESOURCE PERMISSÃO
Saída de Outlook
A associação de saída de mensagem do Outlook envia uma mensagem de email por meio do Outlook.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Saída do Outlook - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Saída do Outlook - exemplo de script C#
O exemplo a seguir envia um email pelo Outlook.
O arquivo function.json define um gatilho HTTP com uma associação de saída de mensagem do Outlook:
{
"bindings": [
{
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"name": "message",
"type": "outlook",
"direction": "out",
"identity": "userFromRequest"
}
],
"disabled": false
}
using System.Net;
using Microsoft.Extensions.Logging;
public static void Run(HttpRequest req, out Message message, ILogger log)
{
string emailAddress = req.Query["to"];
message = new Message(){
subject = "Greetings",
body = "Sent from Azure Functions",
recipient = new Recipient() {
address = emailAddress
}
};
}
{
"bindings": [
{
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"name": "message",
"type": "outlook",
"direction": "out",
"identity": "userFromRequest"
}
],
"disabled": false
}
RESOURCE PERMISSÃO
webhooks
Webhooks permitem reagir a eventos no Microsoft Graph. Para dar suporte a webhooks, são necessárias
funções para criar, atualizar e reagir a assinaturas de webhook. Uma solução completa de webhook exige
uma combinação das seguintes associações:
Um gatilho de webhook do Microsoft Graph permite reagir a um webhook de entrada.
Uma associação de entrada de assinatura do webhook do Microsoft Graph permite que você liste as
assinaturas existentes e, opcionalmente, atualize-as.
Uma associação de saída de assinatura de webhook do Microsoft Graph permite que você crie ou
exclua assinaturas do webhook.
As associações em si não exigem permissões do Azure AD, mas você precisa solicitar permissões
relevantes para o tipo de recurso ao qual você deseja reagir. Para obter uma lista de quais permissões são
necessárias para cada tipo de recurso, consulte permissões de assinatura.
Para obter mais informações sobre webhooks, confira Como trabalhar com webhooks no Microsoft Graph.
Gatilho de webhook
O gatilho de webhook do Microsoft Graph permite que uma função reaja a um webhook de entrada do
Microsoft Graph. Cada instância deste gatilho pode reagir a um tipo de recurso do Microsoft Graph.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Gatilho de webhook - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Gatilho de webhook - exemplo de script C#
O exemplo a seguir manipula webhooks de mensagens de entrada do Outlook. Para usar um gatilho de
webhook, crie uma assinatura e poderá atualizar a assinatura para impedir a expiração.
O arquivo function.json define um gatilho de webhook:
{
"bindings": [
{
"name": "msg",
"type": "GraphWebhookTrigger",
"direction": "in",
"resourceType": "#Microsoft.Graph.Message"
}
],
"disabled": false
}
O código do script C# reage a mensagens de email de entrada e registra o corpo daquelas enviadas pelo
destinatário e que contêm "Azure Functions" no assunto:
#r "Microsoft.Graph"
using Microsoft.Graph;
using System.Net;
using Microsoft.Extensions.Logging;
// Testable by sending oneself an email with the subject "Azure Functions" and some text body
if (msg.Subject.Contains("Azure Functions") && msg.From.Equals(msg.Sender)) {
log.LogInformation($"Processed email: {msg.BodyPreview}");
}
}
{
"bindings": [
{
"name": "msg",
"type": "GraphWebhookTrigger",
"direction": "in",
"resourceType": "#Microsoft.Graph.Message"
}
],
"disabled": false
}
O código do JavaScript reage a mensagens de email de entrada e registra o corpo daquelas enviadas pelo
destinatário e que contêm "Azure Functions" no assunto:
#Microsoft.Graph.DriveItem
– alterações feitas aos itens
de raiz do OneDrive.
#Microsoft.Graph.Contact
- as alterações feitas nos
contatos pessoais do
Outlook.
#Microsoft.Graph.Event -
as alterações feitas em itens
de calendário do Outlook.
NOTE
Um aplicativo de funções só pode ter uma função que esteja registrada em relação a um determinado valor de
resourceType .
Entrada do webhook
A associação da entrada do webhook do Microsoft Graph permite recuperar a lista de assinaturas
gerenciadas por este aplicativo de funções. A associação lê do armazenamento do aplicativo de funções e,
assim, não reflete outras assinaturas criadas de fora do aplicativo.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Entrada de webhook - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Entrada de webhook - exemplo de script C#
O exemplo a seguir obtém todas as assinaturas para o usuário que está chamando e as exclui.
O arquivo function.json define um gatilho HTTP com uma associação de entrada de assinatura e uma
associação de saída de assinatura que usa a ação de excluir:
{
"bindings": [
{
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"type": "graphWebhookSubscription",
"name": "existingSubscriptions",
"direction": "in",
"filter": "userFromRequest"
},
{
"type": "graphWebhookSubscription",
"name": "subscriptionsToDelete",
"direction": "out",
"action": "delete",
"identity": "userFromRequest"
},
{
"type": "http",
"name": "res",
"direction": "out"
}
],
"disabled": false
}
using System.Net;
using Microsoft.Extensions.Logging;
{
"bindings": [
{
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"type": "graphWebhookSubscription",
"name": "existingSubscriptions",
"direction": "in",
"filter": "userFromRequest"
},
{
"type": "graphWebhookSubscription",
"name": "subscriptionsToDelete",
"direction": "out",
"action": "delete",
"identity": "userFromRequest"
},
{
"type": "http",
"name": "res",
"direction": "out"
}
],
"disabled": false
}
Saída de webhook
Essa associação de saída de assinatura de webhook permite que você crie, exclua e atualize as assinaturas
de webhook no Microsoft Graph.
Essa seção contém os seguintes procedimentos:
Exemplo
Atributos
Configuração
Uso
Saída de webhook - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Saída de webhook - exemplo de script C#
O exemplo a seguir cria uma assinatura. Você pode atualizar uma assinatura para impedir que ela expire.
O arquivo function.json define um gatilho HTTP com uma associação de saída de assinatura usando a ação
de criar:
{
"bindings": [
{
"name": "req",
"type": "httpTrigger",
"direction": "in"
},
{
"type": "graphWebhookSubscription",
"name": "clientState",
"direction": "out",
"action": "create",
"subscriptionResource": "me/mailFolders('Inbox')/messages",
"changeTypes": [
"created"
],
"identity": "userFromRequest"
},
{
"type": "http",
"name": "$return",
"direction": "out"
}
],
"disabled": false
}
O código do script C# registra um webhook que notificará esse aplicativo de funções quando o usuário que
está chamando receber uma mensagem do Outlook:
using System;
using System.Net;
using Microsoft.Extensions.Logging;
public static HttpResponseMessage run(HttpRequestMessage req, out string clientState, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
clientState = Guid.NewGuid().ToString();
return new HttpResponseMessage(HttpStatusCode.OK);
}
O código do JavaScript registra um webhook que notificará esse aplicativo de funções quando o usuário
que está chamando receber uma mensagem do Outlook:
using System;
using Microsoft.Extensions.Logging;
// This template uses application permissions and requires consent from an Azure Active Directory
admin.
// See https://go.microsoft.com/fwlink/?linkid=858780
O código do script C# atualiza as assinaturas e cria a associação de saída no código usando a identidade de
cada usuário:
using System;
using Microsoft.Extensions.Logging;
}
}
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associações de Aplicativos Móveis para o Azure
Functions
25/05/2018 • 16 minutes to read • Edit Online
NOTE
Associações de aplicativos móveis do Azure só estão disponíveis para o Azure Functions 1.x. Eles não têm suporte no Azure
Functions 2.x.
Este artigo explica como trabalhar com associações dos Aplicativos Móveis do Azure no Azure Functions. O
Azure Functions dá suporte a associações de entrada e saída para os Aplicativos Móveis.
As associações dos Aplicativos Móveis permitem ler e atualizar tabelas de dados em aplicativos móveis.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
As ligações de aplicativos para dispositivos móveis são fornecidas no pacote do
Microsoft.Azure.WebJobs.Extensions.MobileApps NuGet, versão 1.x. O código-fonte do pacote está no
repositório GitHub azure-webjobs-sdk-extensions.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Entrada
A associação de entrada dos Aplicativos Móveis carrega um registro de um ponto de extremidade de tabela
móvel e o passa para a função. Em funções do C# ou do F#, todas as alterações feitas no registro são enviadas
novamente de forma automática para a tabela quando a função é fechada com êxito.
Entrada - exemplo
Consulte o exemplo específico a um idioma:
Script do C# (.csx)
JavaScript
Entrada - exemplo de script C#
O exemplo a seguir mostra uma associação de entrada dos Aplicativos Móveis em um arquivo function.json e
uma função script C# que usa a associação. A função é disparada por uma mensagem da fila que possui um
identificador de registro. A função lê o registro especificado e modifica sua propriedade Text .
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"name": "myQueueItem",
"queueName": "myqueue-items",
"connection":"",
"type": "queueTrigger",
"direction": "in"
},
{
"name": "record",
"type": "mobileTable",
"tableName": "MyTable",
"id" : "{queueTrigger}",
"connection": "My_MobileApp_Url",
"apiKey": "My_MobileApp_Key",
"direction": "in"
}
]
}
#r "Newtonsoft.Json"
using Newtonsoft.Json.Linq;
Entrada - JavaScript
O exemplo a seguir mostra uma associação de entrada dos Aplicativos Móveis em um arquivo function.json e
uma função JavaScript que usa a associação. A função é disparada por uma mensagem da fila que possui um
identificador de registro. A função lê o registro especificado e modifica sua propriedade Text .
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"name": "myQueueItem",
"queueName": "myqueue-items",
"connection":"",
"type": "queueTrigger",
"direction": "in"
},
{
"name": "record",
"type": "mobileTable",
"tableName": "MyTable",
"id" : "{queueTrigger}",
"connection": "My_MobileApp_Url",
"apiKey": "My_MobileApp_Key",
"direction": "in"
}
]
}
Entrada – atributos
Em bibliotecas de classes do C#, use o atributo MobileTable.
Para saber informações sobre propriedades de atributo que podem ser configuradas, consulte a seção de
configuração a seguir.
Entrada - configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo function.json
e o MobileTable atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
IMPORTANT
Não compartilhe a chave de API com seus clientes de aplicativo móvel. Ela só deve ser distribuída com segurança aos
clientes do lado do serviço, como o Azure Functions. O Azure Functions armazena suas informações de conexão e as chaves
de API como configurações de aplicativo, para que elas não sejam inseridas no repositório de controle do código-fonte. Isso
protege as informações confidenciais.
Entrada - uso
Em funções do C#, quando o registro com a ID especificada for encontrado, ele é passado para o parâmetro
chamado JObject. Quando o registro não é encontrado, o valor do parâmetro é null .
Em funções do JavaScript, o registro é passado para o objeto context.bindings.<name> . Quando o registro não é
encontrado, o valor do parâmetro é null .
Nas funções do C# ou do F#, todas as alterações feitas no registro de entrada (parâmetro de entrada) são
enviadas novamente de forma automática para a tabela quando a função é fechada com êxito. Não é possível
modificar um registro em funções do JavaScript.
Saída
Use a associação de saída dos Aplicativos Móveis para gravar um novo registro em um ponto de extremidade da
tabela dos Aplicativos Móveis.
Saída - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
JavaScript
Saída - exemplo C#
O exemplo a seguir mostra uma função C# que é disparada por uma mensagem da fila e cria um registro em
uma tabela do aplicativo móvel.
[FunctionName("MobileAppsOutput")]
[return: MobileTable(ApiKeySetting = "MyMobileAppKey", TableName = "MyTable", MobileAppUriSetting =
"MyMobileAppUri")]
public static object Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem,
TraceWriter log)
{
return new { Text = $"I'm running in a C# function! {myQueueItem}" };
}
{
"bindings": [
{
"name": "myQueueItem",
"queueName": "myqueue-items",
"connection":"",
"type": "queueTrigger",
"direction": "in"
},
{
"name": "record",
"type": "mobileTable",
"tableName": "MyTable",
"connection": "My_MobileApp_Url",
"apiKey": "My_MobileApp_Key",
"direction": "out"
}
]
}
A seção configuração explica essas propriedades.
Aqui está o código de script do C#:
{
"bindings": [
{
"name": "myQueueItem",
"queueName": "myqueue-items",
"connection":"",
"type": "queueTrigger",
"direction": "in"
},
{
"name": "record",
"type": "mobileTable",
"tableName": "MyTable",
"connection": "My_MobileApp_Url",
"apiKey": "My_MobileApp_Key",
"direction": "out"
}
],
"disabled": false
}
context.bindings.record = {
text : "I'm running in a Node function! Data: '" + myQueueItem + "'"
}
context.done();
};
Saída - atributos
Em bibliotecas de classes do C#, use o atributo MobileTable.
Para saber informações sobre propriedades de atributo que podem ser configuradas, consulte Saída -
configuração. Aqui está um exemplo de atributo MobileTable em uma assinatura de método:
[FunctionName("MobileAppsOutput")]
[return: MobileTable(ApiKeySetting = "MyMobileAppKey", TableName = "MyTable", MobileAppUriSetting =
"MyMobileAppUri")]
public static object Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem,
TraceWriter log)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json
e no MobileTable atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
IMPORTANT
Não compartilhe a chave de API com seus clientes de aplicativo móvel. Ela só deve ser distribuída com segurança aos
clientes do lado do serviço, como o Azure Functions. O Azure Functions armazena suas informações de conexão e as chaves
de API como configurações de aplicativo, para que elas não sejam inseridas no repositório de controle do código-fonte. Isso
protege as informações confidenciais.
Saída - uso
Nas funções do script C#, use um parâmetro de saída nomeado do tipo out object para acessar o registro de
saída. Em bibliotecas de classes C#, o atributo MobileTable pode ser usado com qualquer um dos seguintes tipos:
ICollector<T> ou IAsyncCollector<T> , onde T é JObject ou qualquer tipo com uma propriedade
public string Id .
out JObject
out T ou out T[] , onde T é qualquer Tipo com uma propriedade public string Id .
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associação de saída dos Hubs de Notificação para
Azure Functions
25/05/2018 • 14 minutes to read • Edit Online
Este artigo explica como enviar notificações por push usando associações de Hubs de Notificação do Azure no
Azure Functions. O Azure Functions oferece suporte a uma associação de saída para os Hubs de Notificação.
Os Hubs de Notificação do Azure devem ser configurados para os PNS (Serviços de Notificações de Plataforma)
que você deseja usar. Para saber como obter notificações por push em seu aplicativo cliente desde Hubs de
Notificação, veja Introdução aos Hubs de Notificação e selecione a plataforma de cliente de destino na lista
suspensa na parte superior da página.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
IMPORTANT
O Google preteriu Google Cloud Messaging (GCM) em favor do firebase Cloud Messaging (FCM). Esta associação de saída
não dá suporte a FCM. Para enviar notificações usando o FCM, use a API do firebase diretamente em sua função ou use
notificações de modelo.
Pacotes - Functions 2. x
Essa associação não está disponível em funções 2. x.
Exemplo - modelo
As notificações enviadas podem ser notificações nativas ou notificações de modelo. As notificações nativas são
destinadas a uma plataforma específica de cliente, conforme configurado na propriedade platform da associação
de saída. Uma notificação de modelo pode ser usada para ter como destino várias plataformas.
Consulte o exemplo específico a um idioma:
Script do C# - parâmetro out
Script do C# - assíncrono
Script do C# - JSON
Script do C# - tipos de biblioteca
F#
JavaScript
Exemplo de modelo de script do C# - parâmetro out
Este exemplo envia uma notificação para um registro de modelo que contém um espaço reservado message no
modelo.
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
public static void Run(string myQueueItem, out IDictionary<string, string> notification, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
notification = GetTemplateProperties(myQueueItem);
}
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System;
public static void Run(string myQueueItem, out string notification, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
notification = "{\"message\":\"Hello from C#. Processed a queue item!\"}";
}
#r "Microsoft.Azure.NotificationHubs"
using System;
using System.Threading.Tasks;
using Microsoft.Azure.NotificationHubs;
public static void Run(string myQueueItem, out Notification notification, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
notification = GetTemplateNotification(myQueueItem);
}
Exemplo de modelo F#
Este exemplo envia uma notificação para um registro de modelo que contém location e message .
if (myTimer.IsPastDue)
{
context.log('Node.js is running late!');
}
context.log('Node.js timer trigger function ran!', timeStamp);
context.bindings.notification = {
location: "Redmond",
message: "Hello from Node!"
};
context.done();
};
Exemplo - APNS nativo
Este exemplo de script C# mostra como enviar uma notificação nativa do APNS.
#r "Microsoft.Azure.NotificationHubs"
#r "Newtonsoft.Json"
using System;
using Microsoft.Azure.NotificationHubs;
using Newtonsoft.Json;
public static async Task Run(string myQueueItem, IAsyncCollector<Notification> notification, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
// In this example the queue item is a new user to be processed in the form of a JSON string with
// a "name" value.
//
// The JSON format for a native APNS notification is ...
// { "aps": { "alert": "notification message" }}
using System;
using Microsoft.Azure.NotificationHubs;
using Newtonsoft.Json;
public static async Task Run(string myQueueItem, IAsyncCollector<Notification> notification, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
// In this example the queue item is a new user to be processed in the form of a JSON string with
// a "name" value.
//
// The XML format for a native WNS toast notification is ...
// <?xml version="1.0" encoding="utf-8"?>
// <toast>
// <visual>
// <binding template="ToastText01">
// <text id="1">notification message</text>
// </binding>
// </visual>
// </toast>
log.Info($"{wnsNotificationPayload}");
await notification.AddAsync(new WindowsNotification(wnsNotificationPayload));
}
Atributos
Em bibliotecas de classes de C#, utilize o atributo NotificationHub.
Os parâmetros e as propriedades do construtor do atributo são descritos na seção Configuração.
Configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json
e no atributo NotificationHub :
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Exemplo de arquivo function.json
Aqui está um exemplo de uma associação de Hubs de Notificação em um arquivo function.json.
{
"bindings": [
{
"type": "notificationHub",
"direction": "out",
"name": "notification",
"tagExpression": "",
"hubName": "my-notification-hub",
"connection": "MyHubConnectionString",
"platform": "apns"
}
],
"disabled": false
}
2. Navegue até seu aplicativo de funções no portal do Azure, escolha Configurações do aplicativo, adicione
uma chave como MyHubConnectionString, cole o DefaultFullSharedAccessSignature copiado em seu hub
de notificação como o valor e, em seguida, clique em Salvar.
O nome dessa configuração de aplicativo é o que está na configuração de conexão de associação de saída em
function.json ou mo atributo do .NET. Veja a seção Configuração anteriormente neste artigo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Próximos passos
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associações de armazenamento de filas do Azure
Functions
08/11/2019 • 32 minutes to read • Edit Online
Este artigo explica como trabalhar com associações de armazenamento de Fila do Azure no Azure Functions.
O Azure Functions dá suporte a associações de gatilho e de saída para filas.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
As associações de armazenamento Filas são fornecidas no pacote NuGet Microsoft.Azure.WebJobs, versão
2.x. O código-fonte do pacote está no repositório GitHub azure-webjobs-sdk.
O suporte para essa associação é fornecido automaticamente em todos os ambientes de desenvolvimento.
Você não precisa instalar o pacote ou registrar a extensão manualmente.
Versão do SDK de Armazenamento do Microsoft Azure em Funções 1. x
Em Funções de 1. x, os gatilhos de armazenamento e associações usam a versão 7.2.1 do SDK de
Armazenamento do Microsoft Azure (windowsazure pacote NuGet). Se você referenciar uma versão
diferente do SDK do armazenamento e associar a um tipo de SDK de armazenamento na sua assinatura de
função, o tempo de execução de funções pode relatar se não é possível associar a esse tipo. A solução é
verificar as referências do projeto windowsazure 7.2.1.
Pacotes - Functions 2. x
As associações de Armazenamento de Filas são fornecidas no pacote NuGet
Microsoft.Azure.WebJobs.Extensions.Storage, versão 3.x. O código-fonte do pacote está no repositório
GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de
desenvolvimento.
Codificando
O Functions espera uma cadeia de caracteres codificada base64. Todos os ajustes ao tipo de codificação (para
preparar os dados como uma cadeia de caracteres codificada base64) precisam ser implementados no
serviço de chamada.
Disparador
Use o gatilho de fila para iniciar uma função quando um novo item é recebido em uma fila. A mensagem da
fila é fornecida como entrada para a função.
Gatilho - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
JavaScript
Java
Python
Gatilho - exemplo C#
O exemplo a seguir mostra uma função C# que consulta a fila myqueue-items e grava um log cada vez que
um item de fila é processado.
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;
A seção uso explica myQueueItem , que é chamado pela name propriedade function.json. A seção de
metadados de mensagem explica todas as outras variáveis mostradas.
Gatilho - exemplo de JavaScript
O exemplo a seguir mostra uma associação de gatilho de fila em um arquivo function.json e uma função
JavaScript que usa a associação. A função controla a myqueue-items fila e grava um log cada vez que um
item de fila é processado.
Aqui está o arquivo function.json:
{
"disabled": false,
"bindings": [
{
"type": "queueTrigger",
"direction": "in",
"name": "myQueueItem",
"queueName": "myqueue-items",
"connection":"MyStorageConnectionAppSetting"
}
]
}
NOTE
O parâmetro nome é refletido como context.bindings.<name> no código JavaScript que contém a carga útil do
item da fila. Essa carga útil também é passada como o segundo parâmetro para a função.
A seção uso explica myQueueItem , que é chamado pela name propriedade function.json. A seção de
metadados de mensagem explica todas as outras variáveis mostradas.
Gatilho - exemplo Java
O exemplo Java a seguir mostra as funções do acionador da fila de armazenamento que registra a
mensagem acionada colocada na fila myqueuename .
@FunctionName("queueprocessor")
public void run(
@QueueTrigger(name = "msg",
queueName = "myqueuename",
connection = "myconnvarname") String message,
final ExecutionContext context
) {
context.getLogger().info(message);
}
O código _init_.py declara um parâmetro como func.ServiceBusMessage , que permite que você leia a
mensagem da fila em sua função.
import logging
import json
result = json.dumps({
'id': msg.id,
'body': msg.get_body().decode('utf-8'),
'expiration_time': (msg.expiration_time.isoformat()
if msg.expiration_time else None),
'insertion_time': (msg.insertion_time.isoformat()
if msg.insertion_time else None),
'time_next_visible': (msg.time_next_visible.isoformat()
if msg.time_next_visible else None),
'pop_receipt': msg.pop_receipt,
'dequeue_count': msg.dequeue_count
})
logging.info(result)
Gatilho – atributos
Em bibliotecas de classes C#, use os seguintes atributos para configurar um gatilho de fila:
QueueTriggerAttribute
O construtor do atributo usa o nome da fila para monitorar, conforme mostrado no exemplo a seguir:
[FunctionName("QueueTrigger")]
public static void Run(
[QueueTrigger("myqueue-items")] string myQueueItem,
ILogger log)
{
...
}
Você pode definir a Connection propriedade para especificar a conta de armazenamento para usar,
conforme mostrado no exemplo a seguir:
[FunctionName("QueueTrigger")]
public static void Run(
[QueueTrigger("myqueue-items", Connection = "StorageConnectionAppSetting")] string
myQueueItem,
ILogger log)
{
....
}
[StorageAccount("ClassLevelStorageAppSetting")]
public static class AzureFunctions
{
[FunctionName("QueueTrigger")]
[StorageAccount("FunctionLevelStorageAppSetting")]
public static void Run( //...
{
...
}
Gatilho – configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json e no atributo QueueTrigger .
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Gatilho - uso
Em C# e script C#, acesse os dados da mensagem usando um parâmetro de método, como
string paramName . No script do C#, paramName é o valor especificado na propriedade name de function.json.
É possível associar a qualquer um dos seguintes tipos:
Objeto - o tempo de execução do Functions desserializa um conteúdo JSON em uma instância de uma
classe arbitrária definida em seu código.
string
byte[]
CloudQueueMessage
Se você tentar associar CloudQueueMessage e receber uma mensagem de erro, certifique-se de ter uma
referência para a versão correta do SDK do Armazenamento.
Em JavaScript, use context.bindings.<name> para acessar o conteúdo de item de fila. Se o conteúdo for
JSON, ele é desserializado em um objeto.
Gatilho - simultaneidade
Quando há várias mensagens de fila aguardando, o gatilho de fila recupera um lote de mensagens e invoca
as instâncias de função ao mesmo tempo para processá-las. Por padrão, o tamanho do lote é 16. Quando o
número que está sendo processado chega até 8, o tempo de execução obtém outro lote e começa a processar
as mensagens. Portanto, o número máximo de mensagens simultâneas que estão sendo processadas por
função em uma máquina virtual (VM ) é 24. Esse limite se aplica separadamente a cada função acionada por
fila em cada VM. Se aplicativo de função for escalado horizontalmente para várias VMs, cada VM aguardará
gatilhos e tentará executar funções. Por exemplo, se um aplicativo de função for escalado horizontalmente
para 3 VMs, o número de máximo padrão de instâncias simultâneas de uma função acionada por fila será 72.
O tamanho do lote e o limite para obtenção de um novo lote são configuráveis no arquivo host.json. Se
quiser minimizar a execução paralela para funções acionadas por fila em um aplicativo de função, você poder
definir o tamanho do lote para 1. Essa configuração elimina a simultaneidade, desde que seu aplicativo de
função seja executado em uma única máquina virtual (VM ).
O gatilho de fila impede automaticamente que uma função processe uma mensagem da fila várias vezes; as
funções não precisam ser escritas para ser idempotentes.
Saída
Use a associação de saída do armazenamento de Filas do Azure para que você grave mensagens em uma
fila.
Saída - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
JavaScript
Java
Python
Saída - exemplo C#
O exemplo a seguir mostra uma função C# que cria uma mensagem da fila para cada solicitação HTTP
recebida.
[StorageAccount("AzureWebJobsStorage")]
public static class QueueFunctions
{
[FunctionName("QueueOutput")]
[return: Queue("myqueue-items")]
public static string QueueOutput([HttpTrigger] dynamic input, ILogger log)
{
log.LogInformation($"C# function processed: {input.Text}");
return input.Text;
}
}
Você pode enviar várias mensagens ao mesmo tempo usando um parâmetro ICollector ou
IAsyncCollector . Aqui está o código de script C# que envia várias mensagens, uma com os dados da
solicitação HTTP e outra com valores codificados:
Você pode enviar várias mensagens de uma vez com a definição de uma matriz de mensagem para a
myQueueItem associação de saída. O código JavaScript a seguir envia duas mensagens de fila com valores
codificados para cada solicitação HTTP recebida.
module.exports = function(context) {
context.bindings.myQueueItem = ["message 1","message 2"];
context.done();
};
@FunctionName("httpToQueue")
@QueueOutput(name = "item", queueName = "myqueue-items", connection = "AzureWebJobsStorage")
public String pushToQueue(
@HttpTrigger(name = "request", methods = {HttpMethod.POST}, authLevel =
AuthorizationLevel.ANONYMOUS)
final String message,
@HttpOutput(name = "response") final OutputBinding<String> result) {
result.setValue(message + " has been added.");
return message;
}
No biblioteca de tempo de execução de funções Java, use o @QueueOutput anotação em parâmetros cujo
valor seria gravado no armazenamento de fila. O tipo de parâmetro deve ser OutputBinding<T> , onde T é
qualquer tipo Java nativo de um POJO.
Saída – exemplo do Python
O exemplo a seguir demonstra como gerar valores únicos e múltiplos para filas de armazenamento. A
configuração necessária para Function. JSON é a mesma de qualquer forma.
Uma associação de fila de armazenamento é definida em Function. JSON , em que Type é definido como
queue .
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureStorageQueuesConnectionString"
}
]
}
Para definir uma mensagem individual na fila, você passa um único valor para o método set .
input_msg = req.params.get('message')
msg.set(input_msg)
return 'OK'
Para criar várias mensagens na fila, declare um parâmetro como o tipo de lista apropriado e passe uma
matriz de valores (que correspondam ao tipo de lista) para o método set .
msg.set(['one', 'two'])
return 'OK'
Saída - atributos
Em bibliotecas de classes do C#, use o QueueAttribute.
O atributo se aplica a um out parâmetro ou o valor de retorno da função. O construtor do atributo usa o
nome da fila, conforme mostrado no exemplo a seguir:
[FunctionName("QueueOutput")]
[return: Queue("myqueue-items")]
public static string Run([HttpTrigger] dynamic input, ILogger log)
{
...
}
Você pode definir a Connection propriedade para especificar a conta de armazenamento para usar, conforme
mostrado no exemplo a seguir:
[FunctionName("QueueOutput")]
[return: Queue("myqueue-items", Connection = "StorageConnectionAppSetting")]
public static string Run([HttpTrigger] dynamic input, ILogger log)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json e no Queue atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
Em C# e script C#, grave uma mensagem de fila única usando um parâmetro de método como o
out T paramName . No script do C#, paramName é o valor especificado na propriedade name de function.json.
Você pode usar o tipo de retorno de método em vez de um out parâmetro, e T pode ser qualquer um dos
seguintes tipos:
Um objeto serializado como JSON
string
byte[]
CloudQueueMessage
Se você tentar associar CloudQueueMessage e receber uma mensagem de erro, certifique-se de ter uma
referência para a versão correta do SDK do Armazenamento.
Em C# e script C#, grave várias mensagens de fila usando um dos seguintes tipos:
ICollector<T> ou IAsyncCollector<T>
CloudQueue
Em funções em JavaScript, use context.bindings.<name> para acessar a mensagem de fila de saída. Você
pode usar uma cadeia de caracteres ou um objeto serializável em JSON para o conteúdo de item de fila.
configurações de host.json
Esta seção descreve as definições de configuração globais disponíveis para esta associação na versão 2.x. O
arquivo host.json de exemplo abaixo contém apenas as configurações da versão 2.x para essa associação.
Para obter mais informações sobre as configurações globais na versão 2.x, confira a referência de host.json
para o Azure Functions versão 2.x.
NOTE
Para obter uma referência de host.json no Functions 1.x, confira Referência de host.json para o Azure Functions 1.x.
{
"version": "2.0",
"extensions": {
"queues": {
"maxPollingInterval": "00:00:02",
"visibilityTimeout" : "00:00:30",
"batchSize": 16,
"maxDequeueCount": 5,
"newBatchThreshold": 8
}
}
}
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Vá para um tutorial que usa uma associação de saída de armazenamento de Fila
Associações do SendGrid no Azure Functions
08/11/2019 • 9 minutes to read • Edit Online
Este artigo explica como enviar emails usando as associações de SendGrid no Azure Functions. O Azure
Functions suporta uma associação de saída para o SendGrid.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
As associações SendGrid são fornecidas no Pacote NuGet Microsoft.Azure.WebJobs.Extensions.SendGrid, versão
2.x. O código-fonte do pacote está no repositório GitHub azure-webjobs-sdk-extensions.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Pacotes - Functions 2. x
As associações SendGrid são fornecidas no Pacote NuGet Microsoft.Azure.WebJobs.Extensions.SendGrid, versão
3.x. O código-fonte do pacote está no repositório GitHub azure-webjobs-sdk-extensions.
NOTE
A versão 2. x não cria o tópico ou a assinatura configurada na ServiceBusTrigger instância. A versão 2. x é baseada em
Microsoft. Azure. ServiceBus e não lida com o gerenciamento de filas.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
Exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
JavaScript
Java
Exemplo de C#
O exemplo a seguir mostra uma função C# que usa um gatilho de fila do Barramento de Serviço e uma
associação de saída de SendGrid.
Exemplo de C# síncrono:
[FunctionName("SendEmail")]
public static void Run(
[ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] Message email,
[SendGrid(ApiKey = "CustomSendGridKeyAppSettingName")] out SendGridMessage message)
{
var emailObject = JsonConvert.DeserializeObject<OutgoingEmail>(Encoding.UTF8.GetString(email.Body));
Exemplo de C# assíncrono:
[FunctionName("SendEmail")]
public static async void Run(
[ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] Message email,
[SendGrid(ApiKey = "CustomSendGridKeyAppSettingName")] IAsyncCollector<SendGridMessage> messageCollector)
{
var emailObject = JsonConvert.DeserializeObject<OutgoingEmail>(Encoding.UTF8.GetString(email.Body));
await messageCollector.AddAsync(message);
}
Poderá omitir a propriedade ApiKey do atributo se você tiver sua chave de API em uma configuração de
aplicativo denominada "AzureWebJobsSendGridApiKey".
Exemplo 2 de C# script
O exemplo a seguir mostra uma associação de saída de SendGrid em um arquivo function.json e uma função
script C# que usa a associação.
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"type": "queueTrigger",
"name": "mymsg",
"queueName": "myqueue",
"connection": "AzureWebJobsStorage",
"direction": "in"
},
{
"type": "sendGrid",
"name": "$return",
"direction": "out",
"apiKey": "SendGridAPIKeyAsAppSetting",
"from": "{FromEmail}",
"to": "{ToEmail}"
}
]
}
using System;
using SendGrid.Helpers.Mail;
using Microsoft.Azure.WebJobs.Host;
message.AddContent("text/plain", $"{mymsg.Content}");
return message;
}
public class Message
{
public string ToEmail { get; set; }
public string FromEmail { get; set; }
public string Subject { get; set; }
public string Content { get; set; }
}
Exemplo do Java
O exemplo a seguir usa @SendGridOutput a anotação da biblioteca de tempo de execução de funções Java para
enviar um email usando a associação de saída SendGrid.
@FunctionName("SendEmail")
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel =
AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
@SendGridOutput(
name = "email", dataType = "String", apiKey = "SendGridConnection", to = "test@example.com",
from = "test@example.com",
subject= "Sending with SendGrid", text = "Hello from Azure Functions"
) OutputBinding<String> email
)
{
String name = request.getBody().orElse("World");
email.setValue(emailBody);
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
Exemplo de JavaScript
O exemplo a seguir mostra uma associação de saída de SendGrid em um arquivo function.json e uma função
JavaScript que usa a associação.
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"name": "$return",
"type": "sendGrid",
"direction": "out",
"apiKey" : "MySendGridKey",
"to": "{ToEmail}",
"from": "{FromEmail}",
"subject": "SendGrid output bindings"
}
]
}
context.done(null, message);
};
Atributos
Em bibliotecas de classes do C#, use o atributo SendGrid.
Para obter informações sobre as propriedades de atributo que você pode configurar, consulte Configuração. Aqui
está um exemplo de atributo SendGrid em uma assinatura de método:
[FunctionName("SendEmail")]
public static void Run(
[ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] OutgoingEmail email,
[SendGrid(ApiKey = "CustomSendGridKeyAppSettingName")] out SendGridMessage message)
{
...
}
Configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json
e no atributo SendGrid .
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
configurações de host.json
Esta seção descreve as definições de configuração globais disponíveis para esta associação na versão 2.x. O
arquivo host.json de exemplo abaixo contém apenas as configurações da versão 2.x para essa associação. Para
obter mais informações sobre as configurações globais na versão 2.x, confira a referência de host.json para o
Azure Functions versão 2.x.
NOTE
Para obter uma referência de host.json no Functions 1.x, confira Referência de host.json para o Azure Functions 1.x.
{
"version": "2.0",
"extensions": {
"sendGrid": {
"from": "Azure Functions <samples@functions.com>"
}
}
}
Este artigo explica como trabalhar com associações do Barramento de Serviço do Azure no Azure Functions. O
Azure Functions dá suporte a gatilhos e a associações de saída para filas e tópicos do Barramento de Serviço.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
As associações do barramento de serviço são fornecidas no Microsoft.Azure.WebJobs.ServiceBus pacote
NuGet, versão 2. x.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de
desenvolvimento.
Pacotes - Functions 2. x
As associações do Barramento de Serviços são fornecidas no pacote NuGet
Microsoft.Azure.WebJobs.Extensions.ServiceBus, versão 3.x. O código-fonte do pacote está no repositório
GitHub Azure-Functions-ServiceBus-Extension .
NOTE
A versão 2. x não cria o tópico ou a assinatura configurada na instância de ServiceBusTrigger . A versão 2. x é baseada
em Microsoft. Azure. ServiceBus e não lida com o gerenciamento de filas.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de
desenvolvimento.
PARA ADICIONAR SUPORTE EM
AMBIENTE DE DESENVOLVIMENTO FUNÇÕES 2.X
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
Gatilho
Use o gatilho do Barramento de Serviço para responder às mensagens de uma fila ou tópico do Barramento
de Serviço.
Gatilho - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Gatilho - exemplo C#
A exemplo a seguir mostra uma função C# que lê metadados de mensagem e registra uma mensagem de fila
do Barramento de Serviço:
[FunctionName("ServiceBusQueueTriggerCSharp")]
public static void Run(
[ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")]
string myQueueItem,
Int32 deliveryCount,
DateTime enqueuedTimeUtc,
string messageId,
ILogger log)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
log.LogInformation($"EnqueuedTimeUtc={enqueuedTimeUtc}");
log.LogInformation($"DeliveryCount={deliveryCount}");
log.LogInformation($"MessageId={messageId}");
}
using System;
log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
log.Info($"DeliveryCount={deliveryCount}");
log.Info($"MessageId={messageId}");
}
Gatilho - exemplo F#
O exemplo a seguir mostra uma associação de gatilho de Barramento de Serviço em um arquivo function.json
e uma função F# que usa a associação. A função registra em log uma mensagem de fila do barramento de
serviço.
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"queueName": "testqueue",
"connection": "MyServiceBusConnection",
"name": "myQueueItem",
"type": "serviceBusTrigger",
"direction": "in"
}
],
"disabled": false
}
@FunctionName("sbprocessor")
public void serviceBusProcess(
@ServiceBusQueueTrigger(name = "msg",
queueName = "myqueuename",
connection = "myconnvarname") String message,
final ExecutionContext context
) {
context.getLogger().info(message);
}
As funções Java também podem ser disparadas quando uma mensagem é adicionada a um tópico do
barramento de serviço. O exemplo a seguir usa a anotação @ServiceBusTopicTrigger para descrever a
configuração do gatilho.
@FunctionName("sbtopicprocessor")
public void run(
@ServiceBusTopicTrigger(
name = "message",
topicName = "mytopicname",
subscriptionName = "mysubscription",
connection = "ServiceBusConnection"
) String message,
final ExecutionContext context
) {
context.getLogger().info(message);
}
{
"bindings": [
{
"queueName": "testqueue",
"connection": "MyServiceBusConnection",
"name": "myQueueItem",
"type": "serviceBusTrigger",
"direction": "in"
}
],
"disabled": false
}
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "msg",
"type": "serviceBusTrigger",
"direction": "in",
"queueName": "inputqueue",
"connection": "AzureServiceBusConnectionString"
}
]
}
O código em _init_. py declara um parâmetro como func.ServiceBusMessage , o que permite que você leia a
mensagem da fila em sua função.
import logging
import json
result = json.dumps({
'message_id': msg.message_id,
'body': msg.get_body().decode('utf-8'),
'content_type': msg.content_type,
'expiration_time': msg.expiration_time,
'label': msg.label,
'partition_key': msg.partition_key,
'reply_to': msg.reply_to,
'reply_to_session_id': msg.reply_to_session_id,
'scheduled_enqueue_time': msg.scheduled_enqueue_time,
'session_id': msg.session_id,
'time_to_live': msg.time_to_live,
'to': msg.to,
'user_properties': msg.user_properties,
})
logging.info(result)
Gatilho - atributos
Em bibliotecas de classes C#, use os seguintes atributos para configurar um gatilho do Barramento de Serviço:
ServiceBusTriggerAttribute
O construtor do atributo usa o nome da fila ou o tópico e a assinatura. In Azure Functions versão 1.x,
você também pode especificar os direitos de acesso da conexão. Se você não especificar os direitos de
acesso, o padrão é Manage . Para obter mais informações, consulte a seção Gatilho - configuração.
Aqui está um exemplo que mostra o atributo usado com um parâmetro de cadeia de caracteres:
[FunctionName("ServiceBusQueueTriggerCSharp")]
public static void Run(
[ServiceBusTrigger("myqueue")] string myQueueItem, ILogger log)
{
...
}
Você pode definir a Connection propriedade para especificar a conta de Barramento de Serviço para
usar, conforme mostrado no exemplo a seguir:
[FunctionName("ServiceBusQueueTriggerCSharp")]
public static void Run(
[ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")]
string myQueueItem, ILogger log)
{
...
}
[ServiceBusAccount("ClassLevelServiceBusAppSetting")]
public static class AzureFunctions
{
[ServiceBusAccount("MethodLevelServiceBusAppSetting")]
[FunctionName("ServiceBusQueueTriggerCSharp")]
public static void Run(
[ServiceBusTrigger("myqueue", AccessRights.Manage)]
string myQueueItem, ILogger log)
{
...
}
Gatilho – configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo
function.json e o ServiceBusTrigger atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Gatilho - uso
Em C# e script C#, você pode usar os tipos de parâmetros a seguir para a mensagem de fila ou tópico:
string -Se a mensagem for de texto.
byte[] - Útil para dados binários.
Um tipo personalizado - Se a mensagem contiver JSON, funções do Azure tentará desserializar os dados
JSON.
BrokeredMessage – fornece a você a mensagem desserializada com o método BrokeredMessage. GetBody<t
> () .
Esses parâmetros são para a versão 1.x do Azure Functions; para 2.x, use Message em vez de BrokeredMessage .
No JavaScript, acesse a mensagem da fila ou do tópico usando context.bindings.<name from function.json> . A
mensagem do Barramento de Serviço é passada em uma função como uma cadeia de caracteres ou um objeto
JSON.
NOTE
Atualmente, o gatilho do barramento de serviço que funciona com filas e assinaturas habilitadas para sessão está em
versão prévia. Acompanhe este item para obter atualizações adicionais sobre isso.
Saída
Use a associação de saída do barramento de serviço do Azure para enviar mensagens de fila ou de tópico.
Saída - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (. CSx)
F#
Java
JavaScript
Python
Saída - exemplo C#
A exemplo a seguir mostra uma função C# que envia uma mensagem de fila do Barramento de Serviço:
[FunctionName("ServiceBusOutput")]
[return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
public static string ServiceBusOutput([HttpTrigger] dynamic input, ILogger log)
{
log.LogInformation($"C# function processed: {input.Text}");
return input.Text;
}
{
"bindings": [
{
"schedule": "0/15 * * * * *",
"name": "myTimer",
"runsOnStartup": true,
"type": "timerTrigger",
"direction": "in"
},
{
"name": "outputSbQueue",
"type": "serviceBus",
"queueName": "testqueue",
"connection": "MyServiceBusConnection",
"direction": "out"
}
],
"disabled": false
}
public static void Run(TimerInfo myTimer, ILogger log, out string outputSbQueue)
{
string message = $"Service Bus queue message created at: {DateTime.Now}";
log.LogInformation(message);
outputSbQueue = message;
}
public static async Task Run(TimerInfo myTimer, ILogger log, IAsyncCollector<string> outputSbQueue)
{
string message = $"Service Bus queue messages created at: {DateTime.Now}";
log.LogInformation(message);
await outputSbQueue.AddAsync("1 " + message);
await outputSbQueue.AddAsync("2 " + message);
}
Saída - Exemplo #F
O exemplo a seguir mostra uma associação de gatilho de Barramento de Serviço em um arquivo function.json
e uma Função script C# que usa a associação. A função usa um gatilho de timer para enviar uma mensagem
da fila a cada 15 segundos.
Aqui estão os dados de associação no arquivo function.json:
{
"bindings": [
{
"schedule": "0/15 * * * * *",
"name": "myTimer",
"runsOnStartup": true,
"type": "timerTrigger",
"direction": "in"
},
{
"name": "outputSbQueue",
"type": "serviceBus",
"queueName": "testqueue",
"connection": "MyServiceBusConnection",
"direction": "out"
}
],
"disabled": false
}
@FunctionName("httpToServiceBusQueue")
@ServiceBusQueueOutput(name = "message", queueName = "myqueue", connection = "AzureServiceBusConnection")
public String pushToQueue(
@HttpTrigger(name = "request", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
final String message,
@HttpOutput(name = "response") final OutputBinding<T> result ) {
result.setValue(message + " has been sent.");
return message;
}
Na biblioteca de tempo de execução das funções Java, use a anotação @QueueOutput nos parâmetros da função
cujo valor poderia ser gravado em uma fila do Barramento de Serviço. O tipo de parâmetro deve ser
OutputBinding<T> , onde T é qualquer tipo Java nativo de um POJO.
As funções Java também podem gravar em um tópico do barramento de serviço. O exemplo a seguir usa a
anotação @ServiceBusTopicOutput para descrever a configuração da Associação de saída.
@FunctionName("sbtopicsend")
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel =
AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
@ServiceBusTopicOutput(name = "message", topicName = "mytopicname", subscriptionName =
"mysubscription", connection = "ServiceBusConnection") OutputBinding<String> message,
final ExecutionContext context) {
message.setValue(name);
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
{
"bindings": [
{
"schedule": "0/15 * * * * *",
"name": "myTimer",
"runsOnStartup": true,
"type": "timerTrigger",
"direction": "in"
},
{
"name": "outputSbQueue",
"type": "serviceBus",
"queueName": "testqueue",
"connection": "MyServiceBusConnection",
"direction": "out"
}
],
"disabled": false
}
Aqui está o código de script JavaScript que cria uma mensagem única:
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "serviceBus",
"direction": "out",
"connection": "AzureServiceBusConnectionString",
"name": "msg",
"queueName": "outqueue"
}
]
}
Em _init_. py, você pode gravar uma mensagem na fila passando um valor para o método set .
input_msg = req.params.get('message')
msg.set(input_msg)
return 'OK'
Saída - atributos
Em bibliotecas de classes do C#, use o ServiceBusAttribute.
O construtor do atributo usa o nome da fila ou o tópico e a assinatura. Você também pode especificar os
direitos de acesso da conexão. Há uma explicação sobre como escolher as configuração de direitos de acesso
na seção Saída - Configuração. Aqui está um exemplo que mostra o atributo aplicado ao valor retornado da
função:
[FunctionName("ServiceBusOutput")]
[return: ServiceBus("myqueue")]
public static string Run([HttpTrigger] dynamic input, ILogger log)
{
...
}
Você pode definir a Connection propriedade para especificar a conta de Barramento de Serviço para usar,
conforme mostrado no exemplo a seguir:
[FunctionName("ServiceBusOutput")]
[return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
public static string Run([HttpTrigger] dynamic input, ILogger log)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você definir no arquivo
function.json e o ServiceBus atributo.
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
No Azure Functions 1. x, o tempo de execução criará a fila se ela não existir e você tiver definido accessRights
como manage . No Functions versão 2. x, a fila ou tópico já deverá existir; se você especificar uma fila ou um
tópico que não existe, a função falhará.
Em C# e script C#, você pode usar os tipos de parâmetros a seguir para a associação de saída:
out T paramName - T pode ser qualquer tipo serializável em JSON. Se o valor do parâmetro for nulo
quando a função existir, o Functions criará a mensagem com um objeto nulo.
out string - Se o valor de parâmetro não for nulo quando a função sair, o Functions criará uma
mensagem.
out byte[] - Se o valor de parâmetro não for nulo quando a função sair, o Functions criará uma
mensagem.
out BrokeredMessage -se o valor do parâmetro for nulo quando a função for encerrada, as funções não
criarão uma mensagem (para as funções 1. x)
out Message -se o valor do parâmetro for nulo quando a função for encerrada, as funções não criarão uma
mensagem (para as funções 2. x)
ICollector<T> ou IAsyncCollector<T> - Para a criação de várias mensagens. Uma mensagem é criada
quando você chama o método Add .
Ao trabalhar com C# funções:
As funções assíncronas precisam de um valor de retorno ou IAsyncCollector em vez de um parâmetro
out .
No JavaScript, acesse a fila ou o tópico usando context.bindings.<name from function.json> . Você pode
atribuir uma cadeia de caracteres, uma matriz de bytes ou um objeto JavaScript (desserializado em JSON )
para context.binding.<name> .
Para enviar uma mensagem para uma fila habilitada para sessão em outrosC# idiomas, use o SDK do
barramento de serviço do Azure em vez da Associação de saída interna.
configurações de host.json
Esta seção descreve as definições de configuração globais disponíveis para esta associação na versão 2.x. O
arquivo host.json de exemplo abaixo contém apenas as configurações da versão 2.x para essa associação. Para
obter mais informações sobre as configurações globais na versão 2.x, confira a referência de host.json para o
Azure Functions versão 2.x.
NOTE
Para obter uma referência de host.json no Functions 1.x, confira Referência de host.json para o Azure Functions 1.x.
{
"version": "2.0",
"extensions": {
"serviceBus": {
"prefetchCount": 100,
"messageHandlerOptions": {
"autoComplete": false,
"maxConcurrentCalls": 32,
"maxAutoRenewDuration": "00:55:00"
}
}
}
}
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associações do Serviço SignalR para o Azure
Functions
08/11/2019 • 21 minutes to read • Edit Online
Este artigo explica como autenticar e enviar mensagens em tempo real para clientes conectados ao Serviço do
Azure SignalR usando associações do Serviço SignalR no Azure Functions. O Azure Functions dá suporte a
associações de entrada e saída para o Serviço SignalR.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 2. x
As associações de serviço Signalr são fornecidas no pacote NuGet Microsoft. Azure. webjobs. Extensions.
SignalRService , versão 1. *. O código-fonte do pacote está no repositório GitHub azure-functions-signalrservice-
extension.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
Anotações de Java
Para usar as anotações do serviço Signalr em funções Java, você precisa adicionar uma dependência ao artefato
do Azure-Functions-Java -library-signalr (versão 1,0 ou superior) para o pom. xml.
<dependency>
<groupId>com.microsoft.azure.functions</groupId>
<artifactId>azure-functions-java-library-signalr</artifactId>
<version>1.0.0</version>
</dependency>
NOTE
Para usar as associações do Serviço do SignalR em Java, verifique se você está usando a versão 2.4.419 ou posterior do
Azure Functions Core Tools (versão do host 2.0.12332).
[FunctionName("negotiate")]
public static SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req,
[SignalRConnectionInfo(HubName = "chat")]SignalRConnectionInfo connectionInfo)
{
return connectionInfo;
}
Tokens autenticados
Se a função for disparada por um cliente autenticado, você poderá adicionar uma declaração de ID de usuário ao
token gerado. Você pode adicionar facilmente a autenticação a um aplicativo de funções usando a autenticação
do serviço de aplicativo.
Autenticação do Serviço de Aplicativo define os cabeçalhos HTTP denominados x-ms-client-principal-id e
x-ms-client-principal-name que contêm a ID e o nome da entidade de segurança do cliente do usuário
autenticado, respectivamente. Você pode definir a propriedade UserId da associação como o valor do cabeçalho
usando uma expressão de associação: {headers.x-ms-client-principal-id} ou
{headers.x-ms-client-principal-name} .
[FunctionName("negotiate")]
public static SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req,
[SignalRConnectionInfo
(HubName = "chat", UserId = "{headers.x-ms-client-principal-id}")]
SignalRConnectionInfo connectionInfo)
{
// connectionInfo contains an access key token with a name identifier claim set to the authenticated user
return connectionInfo;
}
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "chat",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "in"
}
Tokens autenticados
Se a função for disparada por um cliente autenticado, você poderá adicionar uma declaração de ID de usuário ao
token gerado. Você pode adicionar facilmente a autenticação a um aplicativo de funções usando a autenticação
do serviço de aplicativo.
Autenticação do Serviço de Aplicativo define os cabeçalhos HTTP denominados x-ms-client-principal-id e
x-ms-client-principal-name que contêm a ID e o nome da entidade de segurança do cliente do usuário
autenticado, respectivamente. Você pode definir a propriedade userId da associação como o valor do cabeçalho
usando uma expressão de associação: {headers.x-ms-client-principal-id} ou
{headers.x-ms-client-principal-name} .
function.json de exemplo:
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "chat",
"userId": "{headers.x-ms-client-principal-id}",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "in"
}
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
@SignalRConnectionInfoInput(
name = "connectionInfo",
hubName = "chat") SignalRConnectionInfo connectionInfo) {
return connectionInfo;
}
Tokens autenticados
Se a função for disparada por um cliente autenticado, você poderá adicionar uma declaração de ID de usuário ao
token gerado. Você pode adicionar facilmente a autenticação a um aplicativo de funções usando a autenticação
do serviço de aplicativo.
Autenticação do Serviço de Aplicativo define os cabeçalhos HTTP denominados x-ms-client-principal-id e
x-ms-client-principal-name que contêm a ID e o nome da entidade de segurança do cliente do usuário
autenticado, respectivamente. Você pode definir a propriedade UserId da associação como o valor do cabeçalho
usando uma expressão de associação: {headers.x-ms-client-principal-id} ou
{headers.x-ms-client-principal-name} .
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
@SignalRConnectionInfoInput(
name = "connectionInfo",
hubName = "chat",
userId = "{headers.x-ms-client-principal-id}") SignalRConnectionInfo connectionInfo) {
return connectionInfo;
}
[FunctionName("SendMessage")]
public static Task SendMessage(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
[SignalR(HubName = "chat")]IAsyncCollector<SignalRMessage> signalRMessages)
{
return signalRMessages.AddAsync(
new SignalRMessage
{
Target = "newMessage",
Arguments = new [] { message }
});
}
[FunctionName("SendMessage")]
public static Task SendMessage(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
[SignalR(HubName = "chat")]IAsyncCollector<SignalRMessage> signalRMessages)
{
return signalRMessages.AddAsync(
new SignalRMessage
{
// the message will only be sent to this user ID
UserId = "userId1",
Target = "newMessage",
Arguments = new [] { message }
});
}
[FunctionName("SendMessage")]
public static Task SendMessage(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
[SignalR(HubName = "chat")]IAsyncCollector<SignalRMessage> signalRMessages)
{
return signalRMessages.AddAsync(
new SignalRMessage
{
// the message will be sent to the group with this name
GroupName = "myGroup",
Target = "newMessage",
Arguments = new [] { message }
});
}
exemplos de saída C# de gerenciamento de grupo 2. x
O serviço signalr permite que os usuários sejam adicionados a grupos. As mensagens podem ser enviadas a um
grupo. Você pode usar a SignalRGroupAction classe com a SignalR Associação de saída para gerenciar a
associação de grupo de um usuário.
Adicionar usuário a um grupo
O exemplo a seguir adiciona um usuário a um grupo.
[FunctionName("addToGroup")]
public static Task AddToGroup(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequest req,
ClaimsPrincipal claimsPrincipal,
[SignalR(HubName = "chat")]
IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
return signalRGroupActions.AddAsync(
new SignalRGroupAction
{
UserId = userIdClaim.Value,
GroupName = "myGroup",
Action = GroupAction.Add
});
}
[FunctionName("removeFromGroup")]
public static Task RemoveFromGroup(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequest req,
ClaimsPrincipal claimsPrincipal,
[SignalR(HubName = "chat")]
IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
return signalRGroupActions.AddAsync(
new SignalRGroupAction
{
UserId = userIdClaim.Value,
GroupName = "myGroup",
Action = GroupAction.Remove
});
}
NOTE
Para obter os ClaimsPrincipal limites corretos, você deve ter definido as configurações de autenticação no Azure
functions.
{
"type": "signalR",
"name": "signalRMessages",
"hubName": "<hub_name>",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "out"
}
index.js
index.js
@FunctionName("sendMessage")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRMessage sendMessage(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {
@FunctionName("sendMessage")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRMessage sendMessage(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {
@FunctionName("addToGroup")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRGroupAction addToGroup(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req,
@BindingName("userId") String userId) {
Configuração
SignalRConnectionInfo
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json
e no atributo SignalRConnectionInfo .
SignalR
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json
e no atributo SignalR .
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Desenvolvimento de funções do Azure e a configuração com o serviço do Azure SignalR
Associações de armazenamento de tabelas do Azure
Functions
08/11/2019 • 31 minutes to read • Edit Online
Este artigo explica como trabalhar com associações de armazenamento de Tabela do Azure no Azure Functions.
O Azure Functions dá suporte a associações de entrada e saída para armazenamento de Tabelas do Azure.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
As associações de armazenamento de Tabelas são fornecidas no pacote NuGet Microsoft.Azure.WebJobs, versão
2.x. O código-fonte do pacote está no repositório GitHub azure-webjobs-sdk.
O suporte para essa associação é fornecido automaticamente em todos os ambientes de desenvolvimento. Você
não precisa instalar o pacote ou registrar a extensão manualmente.
Versão do SDK de Armazenamento do Microsoft Azure em Funções 1. x
Em Funções de 1. x, os gatilhos de armazenamento e associações usam a versão 7.2.1 do SDK de
Armazenamento do Microsoft Azure (windowsazure pacote NuGet). Se você referenciar uma versão diferente do
SDK do armazenamento e associar a um tipo de SDK de armazenamento na sua assinatura de função, o tempo
de execução de funções pode relatar se não é possível associar a esse tipo. A solução é verificar as referências do
projeto windowsazure 7.2.1.
Pacotes - Functions 2. x
As associações de Armazenamento de Tabelas são fornecidas no pacote NuGet
Microsoft.Azure.WebJobs.Extensions.Storage, versão 3.x. O código-fonte do pacote está no repositório GitHub
azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
Entrada
Use a associação de entrada de armazenamento de Tabela do Azure para ler uma tabela em uma conta de
Armazenamento do Azure.
Entrada - exemplo
Consulte o exemplo específico a um idioma:
Uma entidade de leitura de C#
Associação de C# para IQueryable
Associação de C# para CloudTable
Script de C# ler uma entidade
Associação de script de C# para IQueryable
Associação de script de C# para CloudTable
F#
JavaScript
Java
Entrada - exemplo de C# - uma entidade
O exemplo a seguir mostra uma função C# que lê uma linha da tabela.
O valor de chave de linha “{queueTrigger}” indica que a chave de linha foi obtida da cadeia de caracteres da
mensagem da fila.
[FunctionName("TableInput")]
public static void TableInput(
[QueueTrigger("table-items")] string input,
[Table("MyTable", "MyPartition", "{queueTrigger}")] MyPoco poco,
ILogger log)
{
log.LogInformation($"PK={poco.PartitionKey}, RK={poco.RowKey}, Text={poco.Text}");
}
}
[FunctionName("TableInput")]
public static void TableInput(
[QueueTrigger("table-items")] string input,
[Table("MyTable", "MyPartition")] IQueryable<MyPoco> pocos,
ILogger log)
{
foreach (MyPoco poco in pocos)
{
log.LogInformation($"PK={poco.PartitionKey}, RK={poco.RowKey}, Text={poco.Text}");
}
}
}
namespace FunctionAppCloudTable2
{
public class LogEntity : TableEntity
{
public string OriginalName { get; set; }
}
public static class CloudTableDemo
{
[FunctionName("CloudTableDemo")]
public static async Task Run(
[TimerTrigger("0 */1 * * * *")] TimerInfo myTimer,
[Table("AzureWebJobsHostLogscommon")] CloudTable cloudTable,
ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
Para obter mais informações sobre como usar o CloudTable, consulte Introdução ao Armazenamento de Tabelas
do Azure.
Se você tentar associar CloudTable e receber uma mensagem de erro, certifique-se de ter uma referência para a
versão correta do SDK do Armazenamento.
Entrada - exemplo de script de C# - uma entidade
O exemplo a seguir mostra uma associação de entrada de tabela em um arquivo function.json e código script C#
que usa a associação. A função usa um gatilho de fila para ler uma linha da tabela.
O arquivo function.json especifica um partitionKey e um rowKey . O rowKey valor “{queueTrigger}” indica que a
chave de linha foi obtida da cadeia de caracteres da mensagem da fila.
{
"bindings": [
{
"queueName": "myqueue-items",
"connection": "MyStorageConnectionAppSetting",
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in"
},
{
"name": "personEntity",
"type": "table",
"tableName": "Person",
"partitionKey": "Test",
"rowKey": "{queueTrigger}",
"connection": "MyStorageConnectionAppSetting",
"direction": "in"
}
],
"disabled": false
}
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;
using Microsoft.Extensions.Logging;
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
public static async Task Run(TimerInfo myTimer, CloudTable cloudTable, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
Para obter mais informações sobre como usar o CloudTable, consulte Introdução ao Armazenamento de Tabelas
do Azure.
Se você tentar associar CloudTable e receber uma mensagem de erro, certifique-se de ter uma referência para a
versão correta do SDK do Armazenamento.
Entrada - exemplo #F
O exemplo a seguir mostra uma associação de entrada de tabela em um arquivo function.json e código script F#
que usa a associação. A função usa um gatilho de fila para ler uma linha da tabela.
O arquivo function.json especifica um partitionKey e um rowKey . O rowKey valor “{queueTrigger}” indica que a
chave de linha foi obtida da cadeia de caracteres da mensagem da fila.
{
"bindings": [
{
"queueName": "myqueue-items",
"connection": "MyStorageConnectionAppSetting",
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in"
},
{
"name": "personEntity",
"type": "table",
"tableName": "Person",
"partitionKey": "Test",
"rowKey": "{queueTrigger}",
"connection": "MyStorageConnectionAppSetting",
"direction": "in"
}
],
"disabled": false
}
[<CLIMutable>]
type Person = {
PartitionKey: string
RowKey: string
Name: string
}
@FunctionName("getallcount")
public int run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.ANONYMOUS) Object dummyShouldNotBeUsed,
@TableInput(name = "items",
tableName = "mytablename", partitionKey = "myparkey",
connection = "myconnvarname") MyItem[] items
) {
return items.length;
}
Entrada – atributos
Em bibliotecas de classes C#, use os seguintes atributos para configurar uma associação de entrada da tabela:
TableAttribute
O construtor do atributo usa o nome da tabela, a chave de partição e a chave de linha. Ele pode ser usado
em um parâmetro de saída ou no valor de retorno da função, conforme mostrado no exemplo a seguir:
[FunctionName("TableInput")]
public static void Run(
[QueueTrigger("table-items")] string input,
[Table("MyTable", "Http", "{queueTrigger}")] MyPoco poco,
ILogger log)
{
...
}
Você pode definir a Connection propriedade para especificar a conta de armazenamento para usar,
conforme mostrado no exemplo a seguir:
[FunctionName("TableInput")]
public static void Run(
[QueueTrigger("table-items")] string input,
[Table("MyTable", "Http", "{queueTrigger}", Connection = "StorageConnectionAppSetting")] MyPoco
poco,
ILogger log)
{
...
}
[StorageAccount("ClassLevelStorageAppSetting")]
public static class AzureFunctions
{
[FunctionName("TableInput")]
[StorageAccount("FunctionLevelStorageAppSetting")]
public static void Run( //...
{
...
}
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Entrada - uso
A associação de entrada da Tabela de Armazenamento dá suporte aos seguintes cenários:
Ler uma linha em C# ou o script do C#
Definir e rowKey . Acessar os dados da tabela usando um parâmetro de método
partitionKey
T <paramName> . No script do C#, paramName é o valor especificado na propriedade name de function.json.
T geralmente é um tipo que implementa ITableEntity ou deriva de TableEntity . As propriedades
filter e take não são usadas neste cenário.
NOTE
IQueryable não tem suporte no tempo de execução do Functions v2. Uma alternativa é usar um parâmetro do
método paramName de CloudTable para ler a tabela usando o SDK de Armazenamento do Azure. Se você tentar
associar CloudTable e receber uma mensagem de erro, certifique-se de ter uma referência para a versão correta
do SDK do Armazenamento.
NOTE
Essa associação de saída não dá suporte para atualização de entidades existentes. Use a TableOperation.Replace
operação do SDK do Armazenamento do Microsoft Azure para atualizar uma entidade existente.
Saída - exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
F#
JavaScript
Saída - exemplo C#
O exemplo a seguir mostra uma função C# que usa um gatilho HTTP para gravar uma única linha de tabela.
[FunctionName("TableOutput")]
[return: Table("MyTable")]
public static MyPoco TableOutput([HttpTrigger] dynamic input, ILogger log)
{
log.LogInformation($"C# http trigger function processed: {input.Text}");
return new MyPoco { PartitionKey = "Http", RowKey = Guid.NewGuid().ToString(), Text = input.Text };
}
}
Saída - Exemplo #F
O exemplo a seguir mostra uma associação de saída de tabela em um arquivo function.json e código script C#
que usa a associação. A função escreve múltiplas entidades de tabela.
Aqui está o arquivo function.json:
{
"bindings": [
{
"name": "input",
"type": "manualTrigger",
"direction": "in"
},
{
"tableName": "Person",
"connection": "MyStorageConnectionAppSetting",
"name": "tableBinding",
"type": "table",
"direction": "out"
}
],
"disabled": false
}
[<CLIMutable>]
type Person = {
PartitionKey: string
RowKey: string
Name: string
}
{
"bindings": [
{
"name": "input",
"type": "manualTrigger",
"direction": "in"
},
{
"tableName": "Person",
"connection": "MyStorageConnectionAppSetting",
"name": "tableBinding",
"type": "table",
"direction": "out"
}
],
"disabled": false
}
context.bindings.tableBinding = [];
context.done();
};
Saída - atributos
Em bibliotecas de classes do C#, use o TableAttribute.
O construtor do atributo usa o nome da tabela. Ele pode ser usado em um out parâmetro ou no valor de
retorno da função, conforme mostrado no exemplo a seguir:
[FunctionName("TableOutput")]
[return: Table("MyTable")]
public static MyPoco TableOutput(
[HttpTrigger] dynamic input,
ILogger log)
{
...
}
Você pode definir a Connection propriedade para especificar a conta de armazenamento para usar, conforme
mostrado no exemplo a seguir:
[FunctionName("TableOutput")]
[return: Table("MyTable", Connection = "StorageConnectionAppSetting")]
public static MyPoco TableOutput(
[HttpTrigger] dynamic input,
ILogger log)
{
...
}
Saída - configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json
e no Table atributo.
PROPRIEDADE FUNCTION.JSON PROPRIEDADE DE ATRIBUTO DESCRIÇÃO
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Saída - uso
A associação de entrada de Armazenamento da Tabela dá suporte aos seguintes cenários:
Gravar uma linha em qualquer idioma
Em C# e o script C#, acesse a entidade de tabela de saída usando um parâmetro de método como
out T paramName ou valor de retorno da função. No script do C#, paramName é o valor especificado na
propriedade name de function.json. T pode ser qualquer tipo serializável, se a chave de partição e a chave
de linha forem fornecidos pelo arquivo function.json ou o Table atributo. Caso contrário, T deve ser um
tipo que inclua PartitionKey e RowKey propriedades. Nesse cenário, T normalmente implementa
ITableEntity ou deriva de TableEntity , mas ele não precisa.
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Gatilho de temporizador para o Azure Functions
25/05/2018 • 20 minutes to read • Edit Online
Este artigo explica como trabalhar com gatilhos de temporizador no Azure Functions. Um gatilho de
temporizador permite executar uma função em uma agenda.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
O gatilho de timer é fornecido no Microsoft.Azure.WebJobs.Extensions pacote NuGet, versão 2. x. O código-
fonte do pacote está no repositório GitHub azure-webjobs-sdk-extensions.
O suporte para essa associação é fornecido automaticamente em todos os ambientes de desenvolvimento.
Você não precisa instalar o pacote ou registrar a extensão manualmente.
Pacotes - Functions 2. x
O gatilho de timer é fornecido no Microsoft.Azure.WebJobs.Extensions pacote NuGet, versão 2. x. O código-
fonte do pacote está no repositório GitHub azure-webjobs-sdk-extensions.
O suporte para essa associação é fornecido automaticamente em todos os ambientes de desenvolvimento.
Você não precisa instalar o pacote ou registrar a extensão manualmente.
Exemplo
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
F#
Java
JavaScript
Python
Exemplo de C#
O exemplo a seguir mostra uma C# função que é executada cada vez que os minutos têm um valor divisível
por cinco (por exemplo, se a função começar em 18:57:00, o próximo desempenho será em 19:00:00). O objeto
TimerInfo é passado para a função.
[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
{
if (myTimer.IsPastDue)
{
log.LogInformation("Timer is running late!");
}
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
Exemplo 2 de C# script
O exemplo a seguir mostra uma associação de gatilho de temporizador em um arquivo function.json e uma
função C# script que usa a associação. A função grava um log que indica se esta chamada de função deve-se a
uma ocorrência de agendamento ausente. O objeto TimerInfo é passado para a função.
Aqui estão os dados de associação no arquivo function.json:
{
"schedule": "0 */5 * * * *",
"name": "myTimer",
"type": "timerTrigger",
"direction": "in"
}
Exemplo de F#
O exemplo a seguir mostra uma associação de gatilho de temporizador em um arquivo function.json e uma
função de script F# que usa a associação. A função grava um log que indica se esta chamada de função deve-se
a uma ocorrência de agendamento ausente. O objeto TimerInfo é passado para a função.
Aqui estão os dados de associação no arquivo function.json:
{
"schedule": "0 */5 * * * *",
"name": "myTimer",
"type": "timerTrigger",
"direction": "in"
}
@FunctionName("keepAlive")
public void keepAlive(
@TimerTrigger(name = "keepAliveTrigger", schedule = "0 */5 * * * *") String timerInfo,
ExecutionContext context
) {
// timeInfo is a JSON string, you can deserialize it to an object using your favorite JSON library
context.getLogger().info("Timer is triggered: " + timerInfo);
}
Exemplo de JavaScript
O exemplo a seguir mostra uma associação de gatilho de temporizador em um arquivo function.json e uma
função JavaScript que usa a associação. A função grava um log que indica se esta chamada de função deve-se
a uma ocorrência de agendamento ausente. Um objeto de timer é passado para a função.
Aqui estão os dados de associação no arquivo function.json:
{
"schedule": "0 */5 * * * *",
"name": "myTimer",
"type": "timerTrigger",
"direction": "in"
}
if (myTimer.IsPastDue)
{
context.log('Node is running late!');
}
context.log('Node timer trigger function ran!', timeStamp);
context.done();
};
Exemplo de Python
O exemplo a seguir usa uma associação de gatilho de temporizador cuja configuração é descrita no arquivo
Function. JSON . A função Python real que usa a associação é descrita no arquivo init. py . O objeto passado
para a função é do tipo objeto Azure. Functions. TimerRequest. A lógica de função grava nos logs indicando se
a invocação atual é devido a uma ocorrência de agendamento ausente.
Aqui estão os dados de associação no arquivo function.json:
{
"name": "mytimer",
"type": "timerTrigger",
"direction": "in",
"schedule": "0 */5 * * * *"
}
if mytimer.past_due:
logging.info('The timer is past due!')
Atributos
Em bibliotecas de classes do C#, utilize o atributo TimerTriggerAttribute.
O construtor do atributo usa a expressão CRON ou um TimeSpan . Você poderá usar TimeSpan apenas se o
aplicativo de função estiver em execução em um Plano do Serviço de Aplicativo. O exemplo a seguir mostra
uma expressão CRON:
[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
{
if (myTimer.IsPastDue)
{
log.LogInformation("Timer is running late!");
}
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
Configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo
function.json e no atributo TimerTrigger .
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Cau t i on
Recomendamos a configuração runOnStartup para true em produção. Usar essa configuração faz com que
código seja executado em momentos altamente imprevisíveis. Em determinadas configurações de produção,
essas execuções extras podem resultar em custos significativamente mais altos para aplicativos hospedados
em planos de consumo. Por exemplo, com runOnStartup habilitado, o gatilho é invocado sempre que seu
aplicativo de funções é dimensionado. Verifique se você compreender totalmente o comportamento de
produção de suas funções antes de habilitar runOnStartup em produção.
Uso
Quando uma função de gatilho de temporizador é invocada, um objeto de temporizador é passado para a
função. O JSON a seguir é uma representação de exemplo do objeto timer.
{
"Schedule":{
},
"ScheduleStatus": {
"Last":"2016-10-04T10:15:00+00:00",
"LastUpdated":"2016-10-04T10:16:00+00:00",
"Next":"2016-10-04T10:20:00+00:00"
},
"IsPastDue":false
}
A propriedade IsPastDue é true quando a invocação da função atual é posterior ao agendado. Por exemplo,
uma reinicialização do aplicativo de função pode causar a perda de uma invocação.
Expressões NCRONTAB
Azure Functions usa a biblioteca NCronTab para interpretar as expressões NCronTab. Um NCRONTAB
exppression é semelhante a uma expressão CRON, exceto pelo fato de que ele inclui um sexto campo adicional
no início a ser usado para a precisão de tempo em segundos:
{second} {minute} {hour} {day} {month} {day-of-week}
Para especificar meses ou dias, você pode usar valores numéricos, nomes ou abreviações de nomes:
Por dias, os valores numéricos são 0 a 6, onde 0 começa com o domingo.
Nomes estão em inglês. Por exemplo, Monday , January .
Os nomes não diferenciam maiúsculas de minúsculas.
Os nomes podem ser abreviados. Três letras é o comprimento de abreviação recomendada. Por exemplo,
Mon , Jan .
Exemplos de NCRONTAB
Aqui estão alguns exemplos de expressões NCRONTAB que você pode usar para o gatilho de temporizador no
Azure Functions.
EXEMPLO QUANDO DISPARADO
"0 0 15 * * *"
Ou criar uma configuração de aplicativo para seu aplicativo de funções denominada WEBSITE_TIME_ZONE e
definir o valor como Horário padrão da costa leste dos EUA. Em seguida, usa a seguinte expressão
NCRONTAB:
"0 0 10 * * *"
Quando você usa WEBSITE_TIME_ZONE , o horário é ajustado para as alterações de hora no fuso horário
específico, como o horário de verão.
TimeSpan
É possível usar um TimeSpan somente para um aplicativo de função executado em um Plano do Serviço de
Aplicativo.
Ao contrário de uma expressão CRON, um valor TimeSpan especifica o intervalo de tempo entre cada
invocação de função. Quando uma função é concluída após a execução por mais tempo do que o intervalo
especificado, o temporizador imediatamente chama a função novamente.
Expresso como uma cadeia de caracteres, o formato TimeSpan é hh:mm:ss quando hh é menor que 24.
Quando os dois primeiros dígitos são 24 ou superior, o formato é dd:hh:mm . Estes são alguns exemplos:
EXEMPLO QUANDO DISPARADO
Escalabilidade
Se um aplicativo de funções se expandir para várias instâncias, apenas uma única instância de uma função
disparada por temporizador será executada em todas as instâncias.
Você pode omitir o valor de identificação ou definir manualmente cada aplicativo de função que identifica a
configuração para um valor diferente.
O gatilho de temporizador usa um bloqueio de armazenamento para garantir que haja apenas uma instância
de temporizador quando um aplicativo de funções é dimensionado para várias instâncias. Se dois aplicativos
de funções compartilharem a mesma configuração de identificação e cada um usar um gatilho de
temporizador, apenas um temporizador será executado.
Solução de problemas
Para obter informações sobre o que fazer quando o gatilho de timer não funcionar conforme o esperado,
confira Investigar e relatar problemas com funções disparadas de timer não acionadas.
Próximas etapas
Vá para um guia de início rápido que use um gatilho de temporizador
Aprenda mais sobre gatilhos e de associações do Azure Functions
Associação de Twilio para o Azure Functions
08/11/2019 • 14 minutes to read • Edit Online
Este artigo explica como enviar mensagens de texto usando-se as associações de Twilio no Azure Functions. O
Azure Functions oferece suporte a uma associação de saída para o Twilio.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure
Functions, comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
Pacotes - Functions 1. x
As ligações do Twilio são fornecidas no pacote Microsoft.Azure.WebJobs.Extensions.Twilio NuGet, versão 1.x. O
código-fonte do pacote está no repositório GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Pacotes - Functions 2. x
As ligações do Twilio são fornecidas no pacote Microsoft.Azure.WebJobs.Extensions.Twilio NuGet, versão 3.x. O
código-fonte do pacote está no repositório GitHub azure-webjobs-sdk.
A tabela a seguir informa como adicionar suporte para essa associação em cada ambiente de desenvolvimento.
Para saber como atualizar as extensões de associação existentes no portal sem precisar republicar o projeto de
aplicativo de funções, consulte Atualizar as extensões.
Exemplo - Functions 1.x
Consulte o exemplo específico a um idioma:
C#
Script do C# (.csx)
JavaScript
Exemplo de C#
A exemplo a seguir mostra uma função C# que envia uma mensagem de texto quando é acionada por uma
mensagem de fila.
[FunctionName("QueueTwilio")]
[return: TwilioSms(AccountSidSetting = "TwilioAccountSid", AuthTokenSetting = "TwilioAuthToken", From =
"+1425XXXXXXX" )]
public static SMSMessage Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] JObject order,
TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {order}");
return message;
}
Este exemplo usa o atributo TwilioSms com o valor de retorno do método. Uma alternativa é usar o atributo com
um parâmetro out SMSMessage ou um parâmetro ICollector<SMSMessage> ou IAsyncCollector<SMSMessage> .
Exemplo 2 de C# script
O exemplo a seguir mostra uma associação de saída de Twilio em um arquivo function.json e uma função script
C# que usa a associação. A função usa um parâmetro out para enviar uma mensagem de texto.
Aqui estão os dados de associação no arquivo function.json:
function.json de exemplo:
{
"type": "twilioSms",
"name": "message",
"accountSid": "TwilioAccountSid",
"authToken": "TwilioAuthToken",
"to": "+1704XXXXXXX",
"from": "+1425XXXXXXX",
"direction": "out",
"body": "Azure Functions Testing"
}
using System;
using Newtonsoft.Json;
using Twilio;
public static void Run(string myQueueItem, out SMSMessage message, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
// In this example the queue item is a JSON string representing an order that contains the name of a
// customer and a mobile number to send text updates to.
dynamic order = JsonConvert.DeserializeObject(myQueueItem);
string msg = "Hello " + order.name + ", thank you for your order.";
// Even if you want to use a hard coded message and number in the binding, you must at least
// initialize the SMSMessage variable.
message = new SMSMessage();
// A dynamic message can be set instead of the body in the output binding. In this example, we use
// the order information to personalize a text message to the mobile number provided for
// order status updates.
message.Body = msg;
message.To = order.mobileNumber;
}
Você não pode usar os parâmetros em código assíncrono. Aqui está um exemplo de código de script C#
assíncrono:
#r "Newtonsoft.Json"
#r "Twilio.Api"
using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Twilio;
public static async Task Run(string myQueueItem, IAsyncCollector<SMSMessage> message, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
// In this example the queue item is a JSON string representing an order that contains the name of a
// customer and a mobile number to send text updates to.
dynamic order = JsonConvert.DeserializeObject(myQueueItem);
string msg = "Hello " + order.name + ", thank you for your order.";
// Even if you want to use a hard coded message and number in the binding, you must at least
// initialize the SMSMessage variable.
SMSMessage smsText = new SMSMessage();
// A dynamic message can be set instead of the body in the output binding. In this example, we use
// the order information to personalize a text message to the mobile number provided for
// order status updates.
smsText.Body = msg;
smsText.To = order.mobileNumber;
await message.AddAsync(smsText);
}
Exemplo de JavaScript
O exemplo a seguir mostra uma associação de saída do Twilio em um arquivo function.json e código script C#
que usa a associação.
Aqui estão os dados de associação no arquivo function.json:
function.json de exemplo:
{
"type": "twilioSms",
"name": "message",
"accountSid": "TwilioAccountSid",
"authToken": "TwilioAuthToken",
"to": "+1704XXXXXXX",
"from": "+1425XXXXXXX",
"direction": "out",
"body": "Azure Functions Testing"
}
// In this example the queue item is a JSON string representing an order that contains the name of a
// customer and a mobile number to send text updates to.
var msg = "Hello " + myQueueItem.name + ", thank you for your order.";
// Even if you want to use a hard coded message and number in the binding, you must at least
// initialize the message binding.
context.bindings.message = {};
// A dynamic message can be set instead of the body in the output binding. In this example, we use
// the order information to personalize a text message to the mobile number provided for
// order status updates.
context.bindings.message = {
body : msg,
to : myQueueItem.mobileNumber
};
context.done();
};
return message;
}
}
}
Este exemplo usa o atributo TwilioSms com o valor de retorno do método. Uma alternativa é usar o atributo com
um parâmetro out CreateMessageOptions ou um parâmetro ICollector<CreateMessageOptions> ou
IAsyncCollector<CreateMessageOptions> .
{
"type": "twilioSms",
"name": "message",
"accountSidSetting": "TwilioAccountSid",
"authTokenSetting": "TwilioAuthToken",
"from": "+1425XXXXXXX",
"direction": "out",
"body": "Azure Functions Testing"
}
using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;
public static void Run(string myQueueItem, out CreateMessageOptions message, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
// In this example the queue item is a JSON string representing an order that contains the name of a
// customer and a mobile number to send text updates to.
dynamic order = JsonConvert.DeserializeObject(myQueueItem);
string msg = "Hello " + order.name + ", thank you for your order.";
// You must initialize the CreateMessageOptions variable with the "To" phone number.
message = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));
// A dynamic message can be set instead of the body in the output binding. In this example, we use
// the order information to personalize a text message.
message.Body = msg;
}
Você não pode usar os parâmetros em código assíncrono. Aqui está um exemplo de código de script C#
assíncrono:
#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"
using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;
public static async Task Run(string myQueueItem, IAsyncCollector<CreateMessageOptions> message, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
// In this example the queue item is a JSON string representing an order that contains the name of a
// customer and a mobile number to send text updates to.
dynamic order = JsonConvert.DeserializeObject(myQueueItem);
string msg = "Hello " + order.name + ", thank you for your order.";
// You must initialize the CreateMessageOptions variable with the "To" phone number.
CreateMessageOptions smsText = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));
// A dynamic message can be set instead of the body in the output binding. In this example, we use
// the order information to personalize a text message.
smsText.Body = msg;
await message.AddAsync(smsText);
}
{
"type": "twilioSms",
"name": "message",
"accountSidSetting": "TwilioAccountSid",
"authTokenSetting": "TwilioAuthToken",
"from": "+1425XXXXXXX",
"direction": "out",
"body": "Azure Functions Testing"
}
// In this example the queue item is a JSON string representing an order that contains the name of a
// customer and a mobile number to send text updates to.
var msg = "Hello " + myQueueItem.name + ", thank you for your order.";
// Even if you want to use a hard coded message in the binding, you must at least
// initialize the message binding.
context.bindings.message = {};
// A dynamic message can be set instead of the body in the output binding. The "To" number
// must be specified in code.
context.bindings.message = {
body : msg,
to : myQueueItem.mobileNumber
};
context.done();
};
Atributos
Em bibliotecas de classes do C#, use o atributo TwilioSms.
Para obter informações sobre as propriedades de atributo que você pode configurar, consulte Configuração. Aqui
está um exemplo de atributo TwilioSms em uma assinatura de método:
[FunctionName("QueueTwilio")]
[return: TwilioSms(AccountSidSetting = "TwilioAccountSid", AuthTokenSetting = "TwilioAuthToken", From =
"+1425XXXXXXX")]
public static CreateMessageOptions Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] JObject order, ILogger log)
{
...
}
Configuração
A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json
e no atributo TwilioSms .
PROPRIEDADE PROPRIEDADE
FUNCTION.JSON V1 FUNCTION.JSON V2 PROPRIEDADE DE ATRIBUTO DESCRIÇÃO
Quando você estiver desenvolvendo localmente, as configurações de aplicativo serão adicionadas ao arquivo
local.settings.json.
Próximas etapas
Aprenda mais sobre gatilhos e de associações do Azure Functions
Referência host.json para o Azure
Functions 2.x
07/11/2019 • 9 minutes to read • Edit Online
O arquivo de metadados host.json contém opções de configuração global que afetam todas
as funções de um aplicativo de funções. Este artigo lista as configurações disponíveis para o
tempo de execução v2.
NOTE
Este artigo serve para o Azure Functions 2.x. Para obter uma referência de host.json no Functions
1.x, confira Referência de host.json para o Azure Functions 1.x.
As seções seguintes deste artigo explicam cada propriedade de nível superior. Todas são
opcionais, a menos que seja indicado o contrário.
agregador
Especifica quantas invocações de função são agregadas ao calcular métricas para o
Application Insights.
{
"aggregator": {
"batchSize": 1000,
"flushTimeout": "00:00:30"
}
}
As invocações de função são agregadas quando o primeiro dos dois limites é atingido.
applicationInsights
Essa configuração é a filha de Registro em log.
Controla o recurso de amostragem no Application Insights.
{
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 20
}
}
}
NOTE
A amostragem de log pode fazer com que algumas execuções não apareçam na folha do Monitor
do Application Insights.
durableTask
A definição de configuração pode ser encontrada em Associações para Durable Functions.
eventHub
As definições de configuração podem ser encontradas em Associações e gatilhos do Hub de
Eventos.
extensions
Propriedade que retorna um objeto que contém todas as configurações específicas de
associação, como http e eventHub.
funções
Uma lista de funções que o host de trabalho executa. Uma matriz vazia significa que todas as
funções serão executadas. Para uso somente quando em execução localmente. Em
aplicativos de funções no Azure, você deve seguir as etapas em Como desabilitar funções no
Azure Functions para desabilitar funções específicas em vez de usar essa configuração.
{
"functions": [ "QueueProcessor", "GitHubWebHook" ]
}
functionTimeout
Indica a duração do tempo limite para todas as funções. Ele segue o formato de cadeia de
caracteres TimeSpan. Em um plano de Consumo sem servidor, o intervalo válido é de 1
segundo a 10 minutos e o valor padrão é 5 minutos.
Em um plano dedicado (serviço de aplicativo), não há nenhum limite geral e o valor padrão é
30 minutos. Um valor de -1 indica execução não associada.
{
"functionTimeout": "00:05:00"
}
healthMonitor
Definições de configuração para monitor de integridade de Host.
{
"healthMonitor": {
"enabled": true,
"healthCheckInterval": "00:00:10",
"healthCheckWindow": "00:02:00",
"healthCheckThreshold": 6,
"counterThreshold": 0.80
}
}
http
As definições de configuração podem ser encontradas em Associações e gatilhos HTTP.
registro em log
Controla os comportamentos de registro em log do aplicativo de funções, incluindo o
Application Insights.
"logging": {
"fileLoggingMode": "debugOnly"
"logLevel": {
"Function.MyFunction": "Information",
"default": "None"
},
"console": {
...
},
"applicationInsights": {
...
}
}
PROPRIEDADE PADRÃO DESCRIÇÃO
console
Essa configuração é a filha de Registro em log. Ela controla o log do console quando não
está no modo de depuração.
{
"logging": {
...
"console": {
"isEnabled": "false"
},
...
}
}
managedDependency
A dependência gerenciada é um recurso que atualmente só tem suporte com funções
baseadas no PowerShell. Ele permite que as dependências sejam gerenciadas
automaticamente pelo serviço. Quando a propriedade enabled é definida como true , o
arquivo de requirements.psd1 é processado. As dependências são atualizadas quando
qualquer versão secundária é lançada. Para obter mais informações, consulte dependência
gerenciada no artigo do PowerShell.
{
"managedDependency": {
"enabled": true
}
}
filas
As definições de configuração podem ser encontradas em Associações e gatilhos da fila de
armazenamento.
sendGrid
A definição de configuração pode ser encontrada em Associações e gatilhos do SendGrid.
serviceBus
A definição de configuração pode ser encontrada em Associações e gatilhos do Barramento
de Serviço.
singleton
Parâmetro de configuração para o comportamento de bloqueio de Singleton. Para obter
mais informações, consulte Problema com o GitHub referente ao suporte de singleton.
{
"singleton": {
"lockPeriod": "00:00:15",
"listenerLockPeriod": "00:01:00",
"listenerLockRecoveryPollingInterval": "00:01:00",
"lockAcquisitionTimeout": "00:01:00",
"lockAcquisitionPollingInterval": "00:00:03"
}
}
version
A cadeia de caracteres de versão "version": "2.0" é necessária para um aplicativo de
funções que segmente o tempo de execução v2.
watchDirectories
Um conjunto de diretórios de código compartilhado que devem ser monitorados quanto a
alterações. Garante que, quando o código nesses diretórios é alterado, as alterações sejam
coletadas pelas funções.
{
"watchDirectories": [ "Shared" ]
}
Próximas etapas
Saiba como atualizar o arquivo host.json
Consulte as configurações globais em variáveis de ambiente
Referência de host.json para as funções do Azure
1.x
07/11/2019 • 23 minutes to read • Edit Online
O arquivo de metadados host.json contém opções de configuração global que afetam todas as funções de um
aplicativo de funções. Este artigo lista as configurações disponíveis para o tempo de execução v1. O esquema
JSON está em http://json.schemastore.org/host.
NOTE
Este artigo serve para o Azure Functions 1.x. Para obter uma referência de host.json em Funções 2.x, consulte a
referência host.json para as Funções do Azure 2.x.
Outras opções de configuração de aplicativo de funções são gerenciadas nas configurações de aplicativo.
Algumas configurações host.json são usadas apenas quando executadas localmente no arquivo
local.settings.json.
{
"aggregator": {
"batchSize": 1000,
"flushTimeout": "00:00:30"
},
"applicationInsights": {
"sampling": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 5
}
},
"documentDB": {
"connectionMode": "Gateway",
"protocol": "Https",
"leaseOptions": {
"leasePrefix": "prefix"
}
},
"eventHub": {
"maxBatchSize": 64,
"prefetchCount": 256,
"batchCheckpointFrequency": 1
},
"functions": [ "QueueProcessor", "GitHubWebHook" ],
"functionTimeout": "00:05:00",
"healthMonitor": {
"enabled": true,
"healthCheckInterval": "00:00:10",
"healthCheckWindow": "00:02:00",
"healthCheckThreshold": 6,
"counterThreshold": 0.80
},
"http": {
"routePrefix": "api",
"maxOutstandingRequests": 20,
"maxOutstandingRequests": 20,
"maxConcurrentRequests": 10,
"dynamicThrottlesEnabled": false
},
"id": "9f4ea53c5136457d883d685e57164f08",
"logger": {
"categoryFilter": {
"defaultLevel": "Information",
"categoryLevels": {
"Host": "Error",
"Function": "Error",
"Host.Aggregator": "Information"
}
}
},
"queues": {
"maxPollingInterval": 2000,
"visibilityTimeout" : "00:00:30",
"batchSize": 16,
"maxDequeueCount": 5,
"newBatchThreshold": 8
},
"sendGrid": {
"from": "Contoso Group <admin@contoso.com>"
},
"serviceBus": {
"maxConcurrentCalls": 16,
"prefetchCount": 100,
"autoRenewTimeout": "00:05:00"
},
"singleton": {
"lockPeriod": "00:00:15",
"listenerLockPeriod": "00:01:00",
"listenerLockRecoveryPollingInterval": "00:01:00",
"lockAcquisitionTimeout": "00:01:00",
"lockAcquisitionPollingInterval": "00:00:03"
},
"tracing": {
"consoleLevel": "verbose",
"fileLoggingMode": "debugOnly"
},
"watchDirectories": [ "Shared" ],
}
As seções seguintes deste artigo explicam cada propriedade de nível superior. Todas são opcionais, a menos
que seja indicado o contrário.
agregador
Especifica quantas invocações de função são agregadas ao calcular métricas para o Application Insights.
{
"aggregator": {
"batchSize": 1000,
"flushTimeout": "00:00:30"
}
}
As invocações de função são agregadas quando o primeiro dos dois limites é atingido.
applicationInsights
Controla o recurso de amostragem no Application Insights.
{
"applicationInsights": {
"sampling": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 5
}
}
}
DocumentDB
Definições de configuração para o gatilho Azure Cosmos DB e associações.
{
"documentDB": {
"connectionMode": "Gateway",
"protocol": "Https",
"leaseOptions": {
"leasePrefix": "prefix1"
}
}
}
{
"durableTask": {
"hubName": "MyTaskHub",
"controlQueueBatchSize": 32,
"partitionCount": 4,
"controlQueueVisibilityTimeout": "00:05:00",
"workItemQueueVisibilityTimeout": "00:05:00",
"maxConcurrentActivityFunctions": 10,
"maxConcurrentOrchestratorFunctions": 10,
"maxQueuePollingInterval": "00:00:30",
"azureStorageConnectionStringName": "AzureWebJobsStorage",
"trackingStoreConnectionStringName": "TrackingStorage",
"trackingStoreNamePrefix": "DurableTask",
"traceInputsAndOutputs": false,
"logReplayEvents": false,
"eventGridTopicEndpoint": "https://topic_name.westus2-1.eventgrid.azure.net/api/events",
"eventGridKeySettingName": "EventGridKey",
"eventGridPublishRetryCount": 3,
"eventGridPublishRetryInterval": "00:00:30",
"eventGridPublishEventTypes": ["Started", "Completed", "Failed", "Terminated"]
}
}
Durable Functions 2. x
{
"durableTask": {
"hubName": "MyTaskHub",
"storageProvider": {
"controlQueueBatchSize": 32,
"partitionCount": 4,
"controlQueueVisibilityTimeout": "00:05:00",
"workItemQueueVisibilityTimeout": "00:05:00",
"maxQueuePollingInterval": "00:00:30",
"connectionStringName": "AzureWebJobsStorage",
"trackingStoreConnectionStringName": "TrackingStorage",
"trackingStoreNamePrefix": "DurableTask"
},
"tracing": {
"traceInputsAndOutputs": false,
"traceReplayEvents": false,
},
"notifications": {
"eventGrid": {
"topicEndpoint": "https://topic_name.westus2-1.eventgrid.azure.net/api/events",
"keySettingName": "EventGridKey",
"publishRetryCount": 3,
"publishRetryInterval": "00:00:30",
"publishEventTypes": [
"Started",
"Pending",
"Failed",
"Terminated"
]
}
},
"maxConcurrentActivityFunctions": 10,
"maxConcurrentOrchestratorFunctions": 10,
"extendedSessionsEnabled": false,
"extendedSessionIdleTimeoutInSeconds": 30
}
}
Nomes de hubs de tarefas devem começar com uma letra e devem ser compostos somente por letras e
números. Se não for especificado, o nome do hub de tarefas padrão de um aplicativo de funções será
DurableFunctionsHub. Para obter mais informações, consulte Hubs de tarefas.
Muitas dessas configurações são para otimizar o desempenho. Para obter mais informações, consulte
Desempenho e escala.
eventHub
Definições de configuração para gatilhos e associações de Hub de Eventos.
{
"eventHub": {
"maxBatchSize": 64,
"prefetchCount": 256,
"batchCheckpointFrequency": 1
}
}
funções
Uma lista de funções que o host de trabalho executa. Uma matriz vazia significa que todas as funções serão
executadas. Para uso somente quando em execução localmente. Em aplicativos de funções no Azure, você
deve seguir as etapas em Como desabilitar funções no Azure Functions para desabilitar funções específicas
em vez de usar essa configuração.
{
"functions": [ "QueueProcessor", "GitHubWebHook" ]
}
functionTimeout
Indica a duração do tempo limite para todas as funções. Em um plano de Consumo sem servidor, o intervalo
válido é de 1 segundo a 10 minutos e o valor padrão é 5 minutos. Em um plano do serviço de aplicativo, não
há nenhum limite geral e o padrão é NULL, o que indica que não há tempo limite.
{
"functionTimeout": "00:05:00"
}
healthMonitor
Definições de configuração para monitor de integridade de Host.
{
"healthMonitor": {
"enabled": true,
"healthCheckInterval": "00:00:10",
"healthCheckWindow": "00:02:00",
"healthCheckThreshold": 6,
"counterThreshold": 0.80
}
}
http
Parâmetros de configuração para gatilhos e associações http.
{
"http": {
"routePrefix": "api",
"maxOutstandingRequests": 200,
"maxConcurrentRequests": 100,
"dynamicThrottlesEnabled": true
}
}
ID
A ID exclusiva do host de trabalho. Pode ser uma GUID em letras minúsculas, sem traços. Obrigatório ao
executar localmente. Ao executar no Azure, é recomendável que você não defina um valor de ID. Uma ID é
gerada automaticamente no Azure quando id está omitido.
Se você compartilhar uma conta de Armazenamento em vários aplicativos de funções, verifique se cada
aplicativo de função tem um id diferente. É possível omitir a propriedade id ou definir manualmente cada
aplicativo de funções id para um valor diferente. O gatilho de temporizador usa um bloqueio de
armazenamento para garantir que haverá apenas uma instância de temporizador quando um aplicativo de
funções escalar horizontalmente para várias instâncias. Se dois aplicativos de funções compartilharem o
mesmo id e cada um usar um gatilho de temporizador, somente um temporizador irá executar.
{
"id": "9f4ea53c5136457d883d685e57164f08"
}
agente
Controles de filtragem de logs gravados por um objeto ILogger ou por context.log.
{
"logger": {
"categoryFilter": {
"defaultLevel": "Information",
"categoryLevels": {
"Host": "Error",
"Function": "Error",
"Host.Aggregator": "Information"
}
}
}
}
filas
Parâmetros de configuração para gatilhos e associações de Armazenamento.
{
"queues": {
"maxPollingInterval": 2000,
"visibilityTimeout" : "00:00:30",
"batchSize": 16,
"maxDequeueCount": 5,
"newBatchThreshold": 8
}
}
{
"sendGrid": {
"from": "Contoso Group <admin@contoso.com>"
}
serviceBus
Parâmetro de configuração para gatilhos e associações do Barramento de Serviço.
{
"serviceBus": {
"maxConcurrentCalls": 16,
"prefetchCount": 100,
"autoRenewTimeout": "00:05:00"
}
}
singleton
Parâmetro de configuração para o comportamento de bloqueio de Singleton. Para obter mais informações,
consulte Problema com o GitHub referente ao suporte de singleton.
{
"singleton": {
"lockPeriod": "00:00:15",
"listenerLockPeriod": "00:01:00",
"listenerLockRecoveryPollingInterval": "00:01:00",
"lockAcquisitionTimeout": "00:01:00",
"lockAcquisitionPollingInterval": "00:00:03"
}
}
rastreamento
Versão 1.x
Parâmetros de configuração para logs que você cria usando um objeto TraceWriter . Consulte Registro de
logs em C# e Registro de logs em Node.js.
{
"tracing": {
"consoleLevel": "verbose",
"fileLoggingMode": "debugOnly"
}
}
{
"watchDirectories": [ "Shared" ]
}
Próximas etapas
Saiba como atualizar o arquivo host.json
Consulte as configurações globais em variáveis de ambiente
Perguntas frequentes sobre rede em Azure Functions
24/10/2019 • 7 minutes to read • Edit Online
Este artigo lista as perguntas frequentes sobre a rede em Azure Functions. Para obter uma visão geral mais
abrangente, consulte funções de rededo functions.
Próximas etapas
Para saber mais sobre rede e funções:
Siga o tutorial sobre como começar com a integração de rede virtual
Saiba mais sobre as opções de rede no Azure Functions
Saiba mais sobre a integração de rede virtual com o serviço de aplicativo e as funções
Saiba mais sobre as redes virtuais no Azure
Habilitar mais recursos de rede e controle com ambientes de serviço de aplicativo
Suporte aos metadados de OpenAPI 2.0 no Azure
Functions (versão prévia)
08/11/2019 • 6 minutes to read • Edit Online
O suporte aos metadados de OpenAPI 2.0 (conhecido antes como Swagger) no Azure Functions é um recurso de
visualização que você pode usar para gravar uma definição de OpenAPI 2.0 dentro de um aplicativo de funções.
Depois, você pode hospedar esse arquivo usando o aplicativo de funções.
IMPORTANT
A versão prévia do recurso do OpenAPI só está disponível no tempo de execução 1.x, no momento. Informações de como
criar um aplicativo de funções 1.x podem ser encontradas aqui.
Metadados de OpenAPI permitem que uma função que hospeda uma API REST seja consumida por vários outros
softwares. Entre esses softwares estão as ofertas da Microsoft como o PowerApps e o recurso de Aplicativos de
API do Serviço de Aplicativo do Azure, ferramentas de desenvolvedor de terceiros, como Postman e muitos outros
pacotes.
Essas são as informações de referência para desenvolvedores do Azure Functions. Se for novo no Azure Functions,
comece com os seguintes recursos:
Crie sua primeira função: C#, JavaScript, Java ou Python.
Referência do desenvolvedor do Azure Functions.
Referência específica a uma linguagem: C#, C# script, F#, Java, JavaScript ou Python.
Conceitos de associações e gatilhos do Azure Functions.
Codificar e testar o Azure Functions localmente.
TIP
É recomendável iniciar com o tutorial de introdução e, em seguida, retornar a este documento para saber mais sobre recursos
específicos.
NOTE
O recurso de definição de API de função não tem suporte no tempo de execução beta no momento.
Para habilitar a geração de uma definição de OpenAPI hospedada e uma definição de início rápido, defina Origem
de definição da API para Função (Versão prévia) . URL Externa permite que sua função use uma definição de
OpenAPI que é hospedada em outro lugar.
NOTE
A extensão x-ms-summary fornece um nome de exibição nos Aplicativos Lógicos, PowerApps e Flow.
Para saber mais, confira Personalizar sua definição de Swagger para PowerApps.
Próximas etapas
Tutorial de introdução. Experimente o nosso passo a passo para exibir uma definição de OpenAPI em ação.
Repositório do GitHub do Azure Functions. Confira o repositório Funções para fornecer comentários sobre a
versão prévia de suporte de definição de API. Execute o GitHub para qualquer coisa que você gostaria de ver
atualizada.
Referência do desenvolvedor do Azure Functions. Saiba mais sobre a codificação de funções e definição de
gatilhos e associações.
Escala e hospedagem no Azure Functions
25/05/2018 • 24 minutes to read • Edit Online
NOTE
Você pode alternar entre consumo e planos Premium alterando a propriedade Plan do recurso de
aplicativo de funções.
Windows GA GA GA
Linux GA GA GA
Plano de consumo
Quando você estiver usando o plano de consumo, as instâncias do host Azure Functions
serão adicionadas e removidas dinamicamente com base no número de eventos de entrada.
Esse plano sem servidor escala automaticamente, e você é cobrado pelos recursos de
computação apenas durante a execução de suas funções. Em um plano de consumo, a
execução de uma função expire após um período configurável.
A cobrança baseia-se no número de execuções, no tempo de execução e na memória usada.
A cobrança é agregada entre todas as funções em um aplicativo de funções. Para saber mais,
confira a página de preços do Azure Functions.
O plano de Consumo é o plano de hospedagem padrão e oferece os seguintes benefícios:
Pague apenas quando suas funções forem executadas
Escale horizontalmente de forma automática, mesmo durante períodos de carga alta
Os aplicativos de funções na mesma região podem ser atribuídos ao mesmo plano de
consumo. Não há nenhuma desvantagem ou impacto para ter vários aplicativos em
execução no mesmo plano de consumo. A atribuição de vários aplicativos ao mesmo plano
de consumo não afeta a resiliência, a escalabilidade ou a confiabilidade de cada aplicativo.
Para saber mais sobre como estimar os custos durante a execução em um plano de
consumo, consulte noções básicas sobre custos do plano de consumo.
Plano Premium
Quando você estiver usando o plano Premium, as instâncias do host Azure Functions serão
adicionadas e removidas com base no número de eventos de entrada, assim como o plano
de consumo. O plano Premium dá suporte aos seguintes recursos:
Instâncias passivas perpétuas para evitar qualquer início frio
Conectividade de VNet
Duração de execução ilimitada
Tamanhos de instância Premium (um núcleo, duas principais e quatro instâncias de
núcleo)
Preços mais previsíveis
Alocação de aplicativo de alta densidade para planos com vários aplicativos de funções
Informações sobre como você pode configurar essas opções podem ser encontradas no
documento Azure Functions plano Premium.
Em vez de cobrança por execução e memória consumida, a cobrança pelo plano Premium é
baseada no número de segundos de núcleo e na memória usada nas instâncias necessárias e
pré-configuradas. Pelo menos uma instância deve estar sempre em espera por plano. Isso
significa que há um custo mensal mínimo por plano ativo, independentemente do número
de execuções. Tenha em mente que todos os aplicativos de funções em um plano Premium
compartilham instâncias ativas e pré-configuradas.
Considere o plano Azure Functions Premium nas seguintes situações:
Os aplicativos de funções executam continuamente ou quase continuamente.
Você tem um número alto de execuções pequenas e tem uma cobrança de alta execução,
mas a cobrança de baixo GB por segundo no plano de consumo.
Você precisa de mais opções de CPU ou memória do que o fornecido pelo plano de
consumo.
Seu código precisa ser executado por mais tempo do que o máximo permitido no plano
de consumo.
Você precisa de recursos que estão disponíveis apenas em um plano Premium, como
conectividade VNET/VPN.
Ao executar funções de JavaScript em um plano Premium, você deve escolher uma instância
que tenha menos vCPUs. Para obter mais informações, consulte escolher planos Premium
de núcleo único.
VERSÃO DE TEMPO DE
PLANO EXECUÇÃO OS MÁXIMO
Consumo 1.x 5 10
Consumo 2. x 5 10
VERSÃO DE TEMPO DE
PLANO EXECUÇÃO OS MÁXIMO
Consumo 3. x (visualização) 5 10
NOTE
Independentemente da configuração do tempo limite do aplicativo de funções, 230 segundos é a
quantidade máxima de tempo que uma função disparada por HTTP pode levar para responder a
uma solicitação. Isso ocorre devido ao tempo limite de ociosidade padrão de Azure Load Balancer.
Para tempos de processamento mais longos, considere usar o padrão assíncrono Durable Functions
ou adiar o trabalho real e retornar uma resposta imediata.
Mesmo com Always On habilitado, o tempo limite de execução para funções individuais é
controlado pela configuração functionTimeout no arquivo de projeto host.json.
Também é possível usar a CLI do Azure para determinar o plano, da seguinte maneira:
Quando a saída desse comando for dynamic , o aplicativo de funções estará no plano de
Consumo. Quando a saída desse comando for ElasticPremium , seu aplicativo de funções
estará no plano Premium. Todos os outros valores indicam diferentes camadas de um plano
do serviço de aplicativo.
Requisitos da conta de armazenamento
Em qualquer plano, um aplicativo de funções requer uma conta de armazenamento do
Azure geral, que dá suporte ao blob do Azure, à fila, aos arquivos e ao armazenamento de
tabelas. Isso ocorre porque o Functions depende do Armazenamento do Microsoft Azure
para operações como o gerenciamento de gatilhos e execuções de funções de registro em
log, mas algumas contas de armazenamento não dão suporte a filas e tabelas. Essas contas,
que incluem contas de armazenamento somente blob (incluindo armazenamento Premium)
e contas de armazenamento para uso geral com replicação de armazenamento com
redundância de zona, são filtradas das seleções da Conta de Armazenamento existente
quando você cria um aplicativo de funções.
A mesma conta de armazenamento usada por seu aplicativo de funções também pode ser
usada por seus gatilhos e associações para armazenar os dados do aplicativo. No entanto,
para operações com uso intensivo de armazenamento, você deve usar uma conta de
armazenamento separada.
Para saber mais sobre os tipos de conta de armazenamento, consulte Apresentando os
serviços de armazenamento do Azure.
Limites de serviço
A tabela a seguir indica os limites que se aplicam a aplicativos de funções ao serem
executados em vários planos de hospedagem:
PLANO DE SERVIÇO DE
GRUPOS PLANO DE CONSUMO PLANO PREMIUM APLICATIVO1
Planos do Serviço de 100 por região 100 por grupo de 100 por grupo de
Aplicativo recursos recursos
domínio personalizado conexão SSL SNI não conexões SSL SNI não conexões SSL SNI não
Suporte a SSL vinculada incluída associadas e 1 IP SSL associadas e 1 IP SSL
incluídas incluídas
1
1 para limites específicos para as várias opções do plano do serviço de aplicativo, consulte os
tarifaspadrão.
4 esses limites são definidos no host.
5 o número real de aplicativos de funções que você pode hospedar depende da atividade dos