Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
sem servidor
do Azure
Livro de receitas Segunda Edição
www.packt.com
Praveen Kumar Sreeram
Livro de receitas da computação
sem servidor do Azure
Segunda Edição
BIRMINGHAM – MUMBAI
Livro de receitas da computação sem servidor do Azure
Segunda Edição
Copyright © 2018 Packt Publishing
Todos os direitos reservados. Nenhuma parte deste livro pode ser reproduzida,
armazenada em um sistema de recuperação ou transmitida sob qualquer forma
ou por qualquer meio sem a permissão prévia por escrito da editora, exceto no caso
de breves citações incorporadas em artigos críticos ou comentários.
Não se poupou esforços na preparação deste livro para garantir a precisão das
informações apresentadas. No entanto, as informações contidas neste livro são vendidas
sem garantia, expressa ou implícita. O autor, a Packt Publishing e seus revendedores
e distribuidores não serão responsabilizados por quaisquer danos causados ou
supostamente causados de forma direta ou indireta por este livro.
ISBN 978-1-78961-526-5
www.packtpub.com
Não teria sido possível concluir o livro sem o apoio da minha melhor
metade, minha esposa, Haritha, e do meu lindo anjinho, Rithwika Sreeram
mapt.io
O Mapt é uma biblioteca digital online que lhe oferece acesso total a mais
de 5.000 livros e vídeos, bem como a ferramentas líderes da indústria para
ajudá-lo a planejar seu desenvolvimento pessoal e avançar em sua carreira.
Para obter mais informações, visite nosso site.
PacktPub.com
Você sabia que a Packt oferece versões e-book de todos os livros publicados,
com arquivos disponíveis em ePub e PDF? Você pode fazer um upgrade para
a versão e-book em www.PacktPub.com e, como cliente de livro impresso, você
tem direito a um desconto na cópia do e-book. Entre em contato conosco pelo
e-mail service@packtpub.com para obter mais detalhes.
Sobre o autor
Praveen Kumar Sreeram trabalha como arquiteto do Azure, instrutor em uma
MNC líder. Ele tem mais de 14 anos de experiência no campo de desenvolvimento,
análise, design e entrega de aplicativos, incluindo desenvolvimento personalizado para
Web usando ASP.NET e MVC para a criação de aplicativos móveis usando o Xamarin
para domínios, como seguro, telecomunicações e gerenciamento de despesas em fio.
Ele foi reconhecido duas vezes como MVP por um dos principais sites de comunidade
social, CSharpCorner. Ele é um blogueiro ávido que escreve sobre o seu aprendizado
em seu blog chamado Praveen Kumar Sreeram. Seu foco atual é na análise de
problemas de negócios e no fornecimento de soluções técnicas para vários projetos
relacionados ao Microsoft Azure e .NET Core. Sua ID no twitter é @PrawinSreeram.
[i]
Sumário
[ ii ]
Sumário
[ iii ]
Sumário
[ iv ]
Sumário
[ vii ]
Sumário
[ viii ]
Sumário
[ ix ]
Sumário
[x]
Sumário
[ xi ]
Prefácio
Prefácio
A computação sem servidor é a abstração do gerenciamento de infraestrutura e permite
que os desenvolvedores aumentem o foco na lógica de negócios para que possam oferecer
mais recursos e inovação por ciclo. Ao criar aplicativos sem servidor, você não precisa
investir tempo em provisionamento ou gerenciamento de infraestrutura (por exemplo,
criação de servidores, instalação de atualizações, aplicação de patch do sistema operacional,
gerenciamento de como o aplicativo será escalado). Em vez disso, você usa um conjunto
de serviços de nuvem totalmente gerenciados e altamente escaláveis que cuidam dessa
parte do trabalho.
Ao falar sobre aplicativos sem servidor, podemos identificar alguns padrões de aplicativos
que valem a pena ser mencionados aqui. Enquanto cada um deles compartilha os benefícios
mencionados acima, eles também têm características específicas e benefícios adicionais que
os tornam únicos e uma opção melhor para determinados cenários. Aqui estão os padrões
de aplicativos sem servidor que podemos observar:
[ xiii ]
Prefácio
A Microsoft fornece uma solução para a execução fácil de pequenos segmentos de código
na nuvem com o Azure Functions. O Azure Functions fornece soluções para processamento
de dados, integração de sistemas e criação de APIs e microsserviços simples.
Prosseguindo, você receberá receitas práticas sobre como integrar o DevOps com o Azure
Functions e como fornecer implantação contínua com o Azure DevOps (anteriormente
Visual Studio Team Services). O livro também fornece etapas e tutoriais práticos com base
em casos de uso sem servidor do mundo real para guiá-lo pela configuração e instalação
de ambientes sem servidor com facilidade. Por último, você verá como gerenciar o Azure
Functions, proporcionando segurança e conformidade de nível empresarial para sua
arquitetura de código sem servidor.
Você também aprenderá como criar rapidamente aplicativos que são confiáveis
e duráveis usando Durable Functions, com um exemplo de caso de uso em tempo
real muito comum.
No fim deste livro, você terá todas as habilidades necessárias para trabalhar com
arquiteturas de código sem servidor, fornecendo entrega contínua aos seus usuários.
[ xiv ]
Prefácio
Tópicos abordados
Capítulo 1, Desenvolver aplicativos de nuvem usando associações e gatilhos de função, apresenta
como o tempo de execução do Azure Functions fornece modelos que podem ser usados
para integrar rapidamente diferentes serviços do Azure para as necessidades de seus
aplicativos. Ele reduz todo o código de conexão para que você possa se concentrar apenas
na lógica do aplicativo. Neste capítulo, você aprenderá como criar APIs e associações
da Web relacionadas aos Serviços de Armazenamento do Azure.
Capítulo 2, Trabalhar com notificações usando os serviços SendGrid e Twilio, lida com a forma
como a comunicação é um dos aspectos mais críticos de qualquer requisito de negócios.
Neste capítulo, você aprenderá como é fácil conectar seus requisitos de negócios escritos
no Azure Functions com os serviços de comunicação mais populares, como SendGrid
(para email) e Twilio (para SMS).
Capítulo 3, Integração perfeita do Azure Functions com os Serviços do Azure, discute como o
Azure fornece muitos conectores que você pode aproveitar para integrar seus aplicativos
de negócios com outros sistemas com muita facilidade. Neste capítulo, você aprenderá
como integrar o Azure Functions com serviços cognitivos e Aplicativos Lógicos.
Capítulo 5, Exploração de ferramentas de teste para a validação do Azure Functions, ajuda você
a entender diferentes ferramentas e processos que ajudam a agilizar os processos de
desenvolvimento e controle de qualidade. Você também aprenderá como criar cargas
usando o teste de carga do Azure DevOps (anteriormente, VSTS) e verá como monitorar
a performance do Azure Functions usando os relatórios fornecidos pelo Application
Insights. Por último, você também aprenderá como configurar alertas que notificam
quando os aplicativos não são responsivos.
Capítulo 6, Como monitorar e solucionar problemas de serviços sem servidor no Azure, ensina
como monitorar continuamente os aplicativos, analisar a performance e revisar os logs
para entender se há problemas que os usuários finais estão enfrentando. O Azure fornece
várias ferramentas para atender a todos os requisitos de monitoramento, desde os
estágios de desenvolvimento e manutenção do aplicativo.
Capítulo 7, Como desenvolver aplicativos confiáveis sem servidor usando Durable Functions,
mostra como desenvolver soluções dinâmicas de longa duração em ambientes sem
servidor usando Durable Functions, que tem recursos avançados que foram lançados
como uma extensão para o Azure Functions.
[ xv ]
Prefácio
Capítulo 8, Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB,
ensina como aproveitar o Azure Durable Functions para ler e importar os dados do
armazenamento de Blobs e despejar os dados no Cosmos DB.
Capítulo 9, Implementação de práticas recomendadas para Azure Functions, ensina algumas das
práticas recomendadas que você deve seguir para melhorar a performance e a segurança
enquanto trabalha no Azure Functions.
Capítulo 11, Como implementar e implantar a integração contínua usando o Azure DevOps,
ajuda você a aprender como implementar a integração e entrega contínua do seu
código do Azure Functions com a ajuda do Visual Studio e do Azure DevOps.
Você pode fazer download dos arquivos de código seguindo as seguintes etapas:
[ xvi ]
Prefácio
Convenções usadas
Existem várias convenções de texto usadas ao longo de todo este livro.
[ xvii ]
Prefácio
Quando desejamos chamar a atenção para uma parte específica de um bloco de código,
as linhas ou itens relevantes são definidos em negrito:
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
Negrito: indica um novo termo, uma palavra importante ou palavras que você vê na tela,
por exemplo, em menus ou caixas de diálogo, também aparece em texto como este. Aqui
está um exemplo: "Durante a instalação, escolha Desenvolvimento do Azure na seção
Workloads.»
Seções
Neste livro, você encontrará vários títulos que aparecem com frequência (Preparação,
Como fazer isso..., Como funciona..., Há mais... e Consulte também).
Para fornecer instruções claras sobre como concluir uma receita, use estas seções
da seguinte forma:
Preparação
Esta seção informa o que esperar na receita e descreve como configurar qualquer
software ou configuração preliminar necessária para a receita.
[ xviii ]
Prefácio
Como funciona…
Esta seção geralmente consiste em uma explicação detalhada do que aconteceu na seção
anterior.
E mais...
Esta seção consiste em informações adicionais sobre a receita para que você possa
adquira mais conhecimento sobre ela.
Consulte também
Esta seção fornece links úteis para outras informações úteis para a receita.
Entre em contato
Os comentários dos nossos leitores são sempre bem-vindos.
Pirataria: se você se deparar com cópias ilegais de nossas obras em qualquer forma
na Internet, ficaríamos gratos se você nos enviasse o endereço do local ou nome do site.
Entre em contato conosco pelo e-mail copyright@packtpub.com com um link para
o material.
[ xix ]
Prefácio
Comentários
Por favor, deixe um comentário. Depois de ler e usar este livro, que tal deixar um
comentário sobre o site no qual você o comprou? Potenciais leitores poderão ver e usar
sua opinião imparcial para fazer decisões de compra, a Packt pode entender o que
você acha sobre nossos produtos e nossos autores podem ver seus comentários sobre
seu livro. Obrigado!
[ xx ]
Desenvolver aplicativos
de nuvem usando associações
e gatilhos de função
Neste capítulo, vamos abordar as seguintes receitas:
Introdução
Todo aplicativo de software precisa de componentes de back-end que são responsáveis
por cuidar da lógica de negócios e armazenar os dados em algum tipo de repositório,
como bancos de dados e sistemas de arquivos. Cada um desses componentes de back-
end pode ser desenvolvido usando tecnologias diferentes. A tecnologia sem servidor
do Azure também nos permite desenvolver essas APIs de back-end usando o Azure
Functions.
[1]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
O Azure Functions fornece muitos modelos prontos para uso que resolvem os problemas
mais comuns, como conectar-se ao armazenamento, criar APIs Web e cortar imagens. Neste
capítulo, aprenderemos a usar esses modelos internos. Além de aprender os conceitos
relacionados à computação sem servidor do Azure, também vamos tentar implementar
uma solução para um problema de domínio básico: a criação de componentes necessários
para qualquer organização gerenciar as informações de funcionários internos.
[2]
Capítulo 1
Preparação
Vamos começar nossa jornada de compreensão da computação sem servidor do Azure
usando o Azure Functions, criando uma API Web de back-end básica que responda
a solicitações HTTP:
• Consulte https://azure.microsoft.com/free/?&wt.mc_id=AID607363_
SEM_8y6Q27AS para criar uma conta gratuita do Azure.
• Visite https://docs.microsoft.com/azure/azure-functions/
functions-create-function-app-portal para entender passo a passo o
processo de criação de um aplicativo de função e https://docs.microsoft.
com/azure/azure-functions/functions-create-first-azure-function
para criar uma função. Ao criar uma função, uma Conta de Armazenamento
também é criada para armazenar todos os arquivos. Lembre-se do nome da
Conta de Armazenamento, pois ela será usada posteriormente nos outros
capítulos.
• Depois de criar o Aplicativo de Função, examine os conceitos básicos de Gatilhos
e Associações que são os conceitos fundamentais de como o Azure Functions
funciona. Eu recomendo que você examine o artigo https://docs.microsoft.
com/azure/azure-functions/functions-triggers-bindings antes de
prosseguir.
[3]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
3. Você verá a página Azure Functions para .NET – introdução na qual será
solicitado a escolher o tipo de ferramentas que gostaria de usar. Você pode
escolher o que for do seu interesse. Nos primeiros capítulos, usaremos a opção
No Portal na qual é possível criar Funções do Azure com rapidez diretamente
do portal sem nenhuma ferramenta. Posteriormente, nos outros capítulos,
usaremos o Visual Studio e o Azure Functions Core Tools para criar as Funções:
[4]
Capítulo 1
[5]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
[6]
Capítulo 1
10. Salve as alterações clicando no botão Salvar disponível logo acima do editor
de código.
11. Vamos tentar testar a função RegisterUser usando o console de Testes.
Clique na guia Testar para abrir o console de Testes:
[7]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
Como funciona…
Criamos a primeira Função básica do Azure usando gatilhos HTTP e fizemos
algumas modificações no código padrão. O código apenas aceita os parâmetros
firstname e lastname e imprime o nome do usuário final com uma mensagem
Hello {firstname} {lastname} como resposta. Também aprendemos a testar
a função de gatilho de HTTP diretamente do portal de Gerenciamento do Azure.
Consulte também
A receita Permitir a autorização para aplicativos de função no Capítulo 9, Implementar práticas
recomendadas para o Azure Functions
[8]
Capítulo 1
Preparação
Nesta receita, você verá como é fácil integrar um gatilho de HTTP e o serviço de
armazenamento de Tabelas do Azure usando associações de saída. A função de gatilho
de HTTP do Azure recebe os dados de várias fontes e armazena os dados do perfil
do usuário em uma tabela de armazenamento chamada tblUserProfile. Vamos
seguir os pré-requisitos listados abaixo:
• Nesta receita, vamos usar o mesmo gatilho de HTTP que criamos na receita
anterior.
• Vamos usar o Gerenciador de Armazenamento do Azure, que é uma
ferramenta que nos ajuda a trabalhar com os dados armazenados
na conta de Armazenamento do Azure. Faça download dele em
http://storageexplorer.com/.
• Você pode saber mais sobre como se conectar à Conta de Armazenamento
usando o Gerenciador de Armazenamento do Azure em https://docs.
microsoft.com/azure/vs-azure-tools-storage-manage-with-storage-
explorer.
[9]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Microsoft.WindowsAzure.Storage.Table;
[ 10 ]
Capítulo 1
[ 11 ]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
7. Se tudo correr bem, você receberá uma mensagem Status 200 OK na caixa
Saída, conforme mostrado na captura de tela anterior. Vamos navegar até
o Gerenciador de Armazenamento do Azure e visualizar o armazenamento
de tabelas para ver se a tabela denominada tblUserProfile foi criada
com êxito:
[ 12 ]
Capítulo 1
Como funciona...
O Azure Functions nos permite integrar facilmente a outros serviços do Azure apenas
adicionando uma associação de saída ao gatilho. Para este exemplo, integramos o gatilho
de HTTP à associação de tabelas do Armazenamento do Azure e também configuramos
a conta de Armazenamento do Azure fornecendo a string de conexão de armazenamento
e o nome da tabela de Armazenamento do Azure na qual gostaríamos de criar um
registro para cada uma das solicitações HTTP recebidas pelo gatilho de HTTP.
Também criamos um objeto UserProfile, que foi preenchido com os valores recebidos
no objeto de solicitação e, em seguida, transmitido a uma operação de tabela.
Você pode saber mais sobre como lidar com operações no serviço
de armazenamento de Tabelas do Azure em https://docs.
microsoft.com/en-us/azure/storage/storage-dotnet-
how-to-use-tables.
[ 13 ]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
[ 14 ]
Capítulo 1
E mais...
A seguir, as primeiras linhas do código nesta receita:
#r "Newtonsoft.json"
#r "Microsoft.WindowsAzure.Storage"
[ 15 ]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
Talvez você esteja pensando que o parâmetro de entrada ProfilePicUrl poderia ter
sido usado para fazer download da imagem da Internet na receita anterior, Persistir
detalhes de funcionários usando associações de saída da tabela de Armazenamento do Azure. Não
fizemos isso porque o tamanho das imagens de perfil pode ser enorme com a tecnologia
moderna, portanto, o processamento de imagens em tempo real nas solicitações HTTP
pode prejudicar a performance do aplicativo em geral. Por esse motivo, vamos apenas
pegar a URL da imagem de perfil e armazená-la na Fila. Posteriormente, podemos
processar a imagem e armazená-la no Blob.
Preparação
Vamos atualizar o código da função RegisterUser que usamos nas receitas anteriores.
....
[ 16 ]
Capítulo 1
....
objUserProfileTable.Execute(objTblOperationInsert);
}
8. Se tudo correr bem, você verá a mensagem Status 200 OK, em seguida,
a URL da imagem que você transmitiu como um parâmetro de entrada
no Corpo da solicitação será criada como uma Mensagem da fila no
serviço de Fila de Armazenamento do Azure. Vamos navegar até o
Gerenciador de Armazenamento do Azure e visualizar a Fila chamada
userprofileimagesqueue, que é o Nome da fila que fornecemos na etapa 3.
Veja a seguir uma captura de tela da Mensagem da fila que foi criada:
[ 17 ]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
Como funciona…
Nesta receita, adicionamos a associação de saída da Mensagem da fila e fizemos
as seguintes alterações no código:
Preparação
Na receita anterior, aprendemos a criar Associações de saída de fila. Nesta receita, você
vai pegar a URL da Fila, criar uma matriz de bytes e, em seguida, gravá-la em um Blob.
Esta receita é uma continuação das receitas anteriores. Verifique se você as implementou.
[ 18 ]
Capítulo 1
[ 19 ]
Desenvolver aplicativos de nuvem usando associações e gatilhos de função
{
imageData = wc.DownloadData(myQueueItem);
}
outputBlob.WriteAsync(imageData,0,imageData.Length);
}
11. Você pode exibir a imagem em qualquer ferramenta (como MS Paint ou Internet
Explorer).
Como funciona...
Criamos um gatilho de Fila que é executado conforme e quando uma nova mensagem
chega na Fila. Ao encontrar uma nova Mensagem da fila, ele lê a mensagem e, como
sabemos, ela é uma URL de uma imagem de perfil. A função realiza uma solicitação
de cliente Web, faz download dos dados da imagem na forma de uma matriz de bytes e,
em seguida, grava-os no Blob que é configurado como um Blob de saída.
[ 20 ]
Capítulo 1
E mais...
O parâmetro rand-guid gerará um novo GUID e é atribuído ao Blob que é criado
sempre que o gatilho é acionado.
[ 21 ]
Trabalhar com notificações
usando os serviços
SendGrid e Twilio
Neste capítulo, vamos ver como:
Introdução
Para todos os aplicativos de negócios executarem suas operações comerciais
perfeitamente, um dos recursos fundamentais é ter um sistema de comunicação confiável
entre a empresa e seus clientes. O canal de comunicação pode ser bidirecional, enviando
uma mensagem aos administradores que gerenciam o aplicativo ou enviando alertas aos
clientes por email ou SMS para seus celulares.
[ 23 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
Abaixo está a arquitetura que usaremos para utilizar as associações de saída do SendGrid
e do Twilio com o Gatilho HTTP e o Gatilho de Fila.
Preparação
Vamos executar as seguintes etapas antes de passar para a próxima seção:
[ 24 ]
Capítulo 2
2. Na folha Entrega de Email do SendGrid, clique no botão Criar para navegar até
Criar uma Nova Conta do SendGrid. Selecione gratuito nas opções da Camada
de preços, forneça todos os outros detalhes e, em seguida, clique no botão Criar,
conforme mostrado na captura de tela a seguir:
[ 25 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
3. Depois que a conta for criada com êxito, navegue até Contas do SendGrid.
Você pode usar a caixa de pesquisa disponível na parte superior, conforme
mostrado na captura de tela a seguir:
[ 26 ]
Capítulo 2
[ 27 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
[ 28 ]
Capítulo 2
[ 29 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
query" +
"string or in the request body");
}
2. Na próxima etapa, forneça todo o nome do Gatilho de Fila e o nome da fila que
precisa ser monitorada para enviar as notificações. Depois de fornecer todos
os detalhes, clique no botão Criar para criar a Função.
[ 30 ]
Capítulo 2
Depois de garantir que o Gatilho de Fila está funcionando conforme o esperado, vamos
criar as associações do SendGrid para enviar o email.
[ 31 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
°° Assunto da mensagem: forneça o assunto que você quer que seja exibido
no assunto do email.
°° Texto da Mensagem: forneça o texto que você quer incluir no corpo
do email.
5. A associação de saída do SendGrid (message) deve ser ter esta aparência depois
do fornecimento de todos os campos:
[ 32 ]
Capítulo 2
{myQueueItem}");
message = new SendGridMessage();
}
Como funciona...
O objetivo desta receita é enviar uma notificação via email ao administrador, informando
que um novo registro foi criado com êxito.
[ 33 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
E mais
Ao adicionar as associações do SendGrid, você será solicitado a instalar as Extensões,
como mostrado abaixo.
Se não forem exibidas, exclua a associação de saída e recrie-a. Você também pode
instalar as extensões manualmente seguindo as instruções mencionadas no artigo
https://docs.microsoft.com/azure/azure-functions/install-update-
binding-extensions-manual.
Preparação
Verifique se os seguintes itens estão configurados corretamente:
• A conta do SendGrid foi criada e uma chave de API foi gerada no portal
SendGrid.
• Configurações de aplicativo foram criadas nas Configurações de aplicativo
do aplicativo de função.
• A chave Configurações de aplicativo foi configurada nas associações de saída
do SendGrid (message).
[ 34 ]
Capítulo 2
• RegisterUser
• SendNotifications
[ 35 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
[ 36 ]
Capítulo 2
Como funciona...
Atualizamos o código da função RegisterUser para aceitar outro novo parâmetro,
denominado email.
A função aceita o parâmetro email e envia o email ao usuário final usando a API
do SendGrid. Também configuramos todos os outros parâmetros, como endereço
From, Subject e corpo (conteúdo) no código, de modo que ele seja personalizado
dinamicamente com base nos requisitos.
[ 37 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
E mais...
Você também pode enviar conteúdo HTML no corpo da mensagem para tornar seu email
mais atraente. A seguir, um exemplo simples, em que acabei de aplicar uma marca de
negrito (<b>) ao nome do usuário final:
message.AddContent("text/html", "Thank you <b>" + FirstName + "</b><b>
" + LastName +" </b>so much for getting registered to our site.");
[ 38 ]
Capítulo 2
Pode haver vários motivos pelos quais os usuários não receberam o email. Cada
provedor de serviço de email tem filtros de spam diferentes que podem bloquear
os emails da caixa de entrada do usuário final. Mas esses emails podem ter informações
importantes das quais os usuários podem precisar. Faz sentido armazenar o conteúdo
de todos os emails enviados aos usuários finais, para que possamos recuperar os dados
posteriormente, a fim de solucionar quaisquer problemas imprevistos.
Nesta receita, você aprenderá a criar um novo arquivo de log de email com a extensão
.log para cada novo registro. Esse arquivo de log pode ser usado como uma
redundância para os dados armazenados no Armazenamento de tabelas. Você também
aprenderá a armazenar os arquivos de log de email como um Blob em um contêiner
de armazenamento, juntamente com os dados inseridos pelo usuário final durante
o registro.
[ 39 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
[ 40 ]
Capítulo 2
Como funciona...
Criamos novas associações de saída de Blobs do Azure. Assim que uma nova solicitação
é recebida, o conteúdo do email é criado e gravado em um novo arquivo .log (observe
que você pode usar qualquer outra extensão também) que é armazenado como um Blob
no contêiner especificado no campo Caminho das associações de saída.
[ 41 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
Preparação
Esta é uma continuação da receita anterior. Se você estiver lendo isto primeiro, veja
as receitas anteriores deste capítulo antes.
[ 42 ]
Capítulo 2
4. Vamos executar um teste usando a mesma carga de solicitação que usamos nas
receitas anteriores.
5. Você pode ver o arquivo de log de email que é criado usando o RowKey do novo
registro armazenado no armazenamento de Tabelas do Azure, como mostrado
na captura de tela a seguir:
2. Execute um teste usando a mesma carga de solicitação que usamos nas receitas
anteriores.
[ 43 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
[ 44 ]
Capítulo 2
Preparação
Para usar a associação de saída de SMS do Twilio (objsmsmessage), precisamos fazer
o seguinte:
[ 45 ]
Trabalhar com notificações usando os serviços SendGrid e Twilio
5. Assim que obter seu número, ele será listado da seguinte maneira:
[ 46 ]
Capítulo 2
[ 48 ]
Capítulo 2
Como funciona...
Criamos uma nova conta do Twilio e copiamos a ID da conta e a chave do aplicativo nas
Configurações de aplicativo do aplicativo de Função do Azure. Essas duas configurações
serão usadas pelo tempo de execução do aplicativo de função para se conectar à API do
Twilio a fim de enviar o SMS.
[ 49 ]
Integração perfeita do Azure
Functions com os Serviços
do Azure
Neste capítulo, vamos abordar as seguintes receitas:
Introdução
Um dos principais objetivos do Azure Functions é permitir que os desenvolvedores
se concentrem apenas na lógica e nos requisitos do desenvolvimento de aplicativos
sem se preocupar com o restante.
[ 51 ]
Integração perfeita do Azure Functions com os Serviços do Azure
O Azure fornece muitos conectores que você pode utilizar para integrar seus aplicativos
de negócios com outros sistemas com muita facilidade.
Preparação
Para começar, precisamos criar uma API da Pesquisa Visual Computacional e configurar
suas chaves de API para que o Azure Functions (ou qualquer outro programa) possa
acessá-la de maneira programática.
[ 52 ]
Capítulo 3
1. Crie uma nova função usando um dos modelos padrão chamados de Gatilho
de Armazenamento de Blobs do Azure.
[ 53 ]
Integração perfeita do Azure Functions com os Serviços do Azure
[ 54 ]
Capítulo 3
[ 55 ]
Integração perfeita do Azure Functions com os Serviços do Azure
using Newtonsoft.Json;
using Microsoft.WindowsAzure.Storage.Table;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
public static async Task Run(Stream myBlob,
string name,
IAsyncCollector<FaceRectangle>
outMaleTable,
IAsyncCollector<FaceRectangle>
outFemaleTable,
ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n
Name:{name} \n Size: {myBlob.Length} Bytes");
string result = await CallVisionAPI(myBlob);
log.LogInformation(result);
if (String.IsNullOrEmpty(result))
{
return;
}
ImageData imageData = JsonConvert.DeserializeObject<ImageData>
(result);
foreach (Face face in imageData.Faces)
{
var faceRectangle = face.FaceRectangle;
faceRectangle.RowKey = Guid.NewGuid().ToString();
faceRectangle.PartitionKey = "Functions";
faceRectangle.ImageFile = name + ".jpg";
if(face.Gender=="Female")
{
await outFemaleTable.AddAsync(faceRectangle);
[ 56 ]
Capítulo 3
}
Else
{
await outMaleTable.AddAsync(faceRectangle);
}
}
}
static async Task<string> CallVisionAPI(Stream image)
{
using (var client = new HttpClient())
{
var content = new StreamContent(image);
var url = "https://westeurope.api.cognitive.microsoft.com/
vision/v1.0/analyze?visualFeatures=Faces&language=en";
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-
Key", Environment.GetEnvironmentVariable("Vision_API_Subscription_
Key"));
content.Headers.ContentType = new MediaTypeHeaderValue("ap
plication/octet-stream");
var httpResponse = await client.PostAsync(url, content);
if (httpResponse.StatusCode == HttpStatusCode.OK)
{
return await httpResponse.Content.ReadAsStringAsync();
}
}
return null;
}
public class ImageData
{
public List<Face> Faces { get; set; }
}
public class Face
{
public int Age { get; set; }
public string Gender { get; set; }
public FaceRectangle FaceRectangle { get; set; }
}
public class FaceRectangle : TableEntity
{
public string ImageFile { get; set; }
public int Left { get; set; }
public int Top { get; set; }
public int Width { get; set; }
public int Height { get; set; }}
[ 57 ]
Integração perfeita do Azure Functions com os Serviços do Azure
[ 58 ]
Capítulo 3
10. A função é acionada assim que você carrega uma imagem. Este é o JSON que
foi registrado no console Logs da função:
{
"requestId":"483566bc-7d4d-45c1-87e2-6f894aaa4c29",
"metadata":{ },
"faces":[
{
"age":31,
"gender":"Female",
"faceRectangle":{
"left":535,
"top":182,
"width":165,
"height":165
}
},
{
"age":33,
"gender":"Male",
"faceRectangle":{
"left":373,
"top":182,
"width":161,
"height":161
}
}
]
}
[ 59 ]
Integração perfeita do Azure Functions com os Serviços do Azure
Como funciona...
Primeiro criamos uma associação de saída do Armazenamento de Tabelas para
armazenar detalhes sobre todos os homens nas fotos. Em seguida, criamos outra
associação de saída do Armazenamento de Tabelas para armazenar os detalhes sobre
todas as mulheres.
Usamos todos os códigos padrão que o modelo do Azure Functions fornece para
armazenar todas as coordenadas dos rostos em uma única tabela. Entretanto, acabamos
de fazer uma pequena alteração para verificar se a pessoa na foto é homem ou mulher
e armazenar os dados com base no resultado.
E mais...
Para invocar a API da Pesquisa Visual Computacional, o código padrãoque o modelo
fornece transmite a imagem que carregamos para o armazenamento de blobs.
Para invocar a chamada de API, os modelos de localizador de rostos transmitem
o parâmetro visualFeatures=Faces, que retorna informações sobre:
• Idade
• Gênero
• Coordenadas dos rostos na foto
[ 60 ]
Capítulo 3
Aqui, você aprenderá a utilizar a API ADO.NET para se conectar a um Banco de Dados
SQL e inserir dados JSON em uma tabela chamada EmployeeInfo.
Preparação
Navegue até o Portal do Azure e faça o seguinte:
1. Crie um SQL Server lógico com o nome que você escolher. É recomendável
criá-lo no mesmo grupo de recursos em que você colocou o Azure Functions.
2. Crie um Banco de Dados SQL do Azure chamado Cookbookdatabase. Para
fazer isso, escolha Banco de dados em branco no menu suspenso Selecionar
origem da folha do Banco de Dados SQL ao criar o banco de dados.
[ 61 ]
Integração perfeita do Azure Functions com os Serviços do Azure
3. Crie uma regra de firewall para seu endereço IP clicando no botão Definir regra
de firewall na folha Visão geral. Assim, você poderá se conectar aos Bancos
de Dados SQL do Azure usando o SQL Server Management Studio (SSMS).
Se você não tem o SSMS, instale a versão mais recente. Faça download dele
em https://docs.microsoft.com/sql/ssms/download-sql-server-
management-studio-ssms.
4. Clique no link Mostrar cadeias de conexão de banco de dados na folha do
Essentials do Banco de Dados SQL, como mostrado na captura de tela a seguir:
[ 62 ]
Capítulo 3
6. Abra o SSMS e conecte-se ao SQL Server lógico do Azure que você criou nas
etapas anteriores.
7. Quando estiver conectado, crie uma nova tabela chamada EmployeeInfo
usando o seguinte esquema:
CREATE TABLE [dbo].[EmployeeInfo](
[PKEmployeeId] [bigint] IDENTITY(1,1) NOT NULL,
[firstname] [varchar](50) NOT NULL,
[lastname] [varchar](50) NULL,
[email] [varchar](50) NOT NULL,
[devicelist] [varchar](max) NULL,
CONSTRAINT [PK_EmployeeInfo] PRIMARY KEY CLUSTERED
(
[PKEmployeeId] ASC
)
)
1. Navegue até seu aplicativo de função, crie um novo gatilho HTTP usando
o modelo HttpTrigger-CSharp, escolha o Nível de autorização como Anônimo.
2. Navegue até o editor de código de run.csx na função
SaveJSONToAzureSQLDatabase e substitua o código padrão pelo que será
mostrado a seguir. Este código captura os dados que são transmitidos para
o gatilho HTTP e os insere no banco de dados usando a API ADO.Net:
#r "Newtonsoft.Json"
#r "System.Data"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Data.SqlClient;
using System.Data;
[ 63 ]
Integração perfeita do Azure Functions com os Serviços do Azure
con = new
SqlConnection("Server=tcp:azurecookbooks.database.
windows.net,1433;Initial Catalog=Cookbookdatabase;Persist Security
Info=False;User ID=username;Password=password;MultipleActiveResu
ltSets=False;Encrypt=True;TrustServerCertificate=False;Connection
Timeout=30;");
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.Add("@firstname", SqlDbType.VarChar,
50).Value = firstname;
cmd.Parameters.Add("@lastname", SqlDbType.VarChar,
50)
.Value = lastname;
cmd.Parameters.Add("@email", SqlDbType.VarChar, 50)
.Value = email;
cmd.Parameters.Add("@devicelist", SqlDbType.VarChar)
.Value = devicelist;
con.Open();
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
log.LogInformation(ex.Message);
}
Finally
{
[ 64 ]
Capítulo 3
if(con!=null)
{
con.Close();
}
}
Você precisa validar cada um dos parâmetros de entrada. Para simplificar, o código que
valida os parâmetros de entrada não está incluído. Valide cada um dos parâmetros antes
de salvá-los no seu banco de dados. Também é uma prática recomendada armazenar
a cadeia de conexão nas configurações do aplicativo.
Você precisa validar cada um dos parâmetros de entrada. Para simplificar, o código que
valida os parâmetros de entrada não está incluído. Valide cada um dos parâmetros antes
de salvá-los no seu banco de dados.
[ 65 ]
Integração perfeita do Azure Functions com os Serviços do Azure
4. Um registro foi inserido com êxito, como mostrado na captura de tela a seguir:
Como funciona...
O objetivo aqui era aceitar valores de entrada do usuário e salvá-los em um banco
de dados relacional onde os dados pudessem ser recuperados posteriormente para fins
operacionais. Para isso, usamos o Banco de Dados SQL do Azure, uma oferta de banco
de dados relacional também conhecida como banco de dados como serviço (DBaaS).
Criamos um novo Banco de Dados SQL e regras de firewall com as quais podemos nos
conectar remotamente da estação de trabalho de desenvolvimento local usando o SSMS.
Também criamos uma tabela chamada EmployeeInfo, que pode ser usada para salvar
dados.
[ 66 ]
Capítulo 3
Aqui, você aprenderá a criar um Aplicativo Lógico que se integre com o Twitter
(para monitorar Tweets) e o Gmail (para enviar emails).
Preparação
Para trabalhar com esse método, precisamos de:
[ 67 ]
Integração perfeita do Azure Functions com os Serviços do Azure
[ 68 ]
Capítulo 3
[ 69 ]
Integração perfeita do Azure Functions com os Serviços do Azure
4. Vamos adicionar uma nova condição. Para isso, é necessário clicar em Próxima
etapa, procurar condição e selecionar a ação Condição, como mostrado
na captura de tela a seguir:
5. A partir da instrução anterior, a tela a seguir será exibida, onde você poderá
escolher os valores para a condição e o que gostaria de adicionar quando
a condição for avaliada como true ou false:
[ 70 ]
Capítulo 3
[ 71 ]
Integração perfeita do Azure Functions com os Serviços do Azure
9. Será solicitado que você faça logon, caso ainda não tenha feito. Forneça suas
credenciais e autorize os Aplicativos Lógicos do Azure a acessar sua conta
do Gmail.
10. Após a autorização, você poderá marcar seu email com Adicionar conteúdo
dinâmico com os parâmetros do Twitter, como mostrado na captura de tela
a seguir:
[ 72 ]
Capítulo 3
Se a opção Número de seguidores não
aparecer na tela, clique no link Mostrar mais.
[ 73 ]
Integração perfeita do Azure Functions com os Serviços do Azure
3. Ótimo! Ele foi acionado duas vezes, e eu recebi os emails. Um deles é mostrado
na captura de tela a seguir:
Como funciona...
Você criou um novo Aplicativo Lógico e escolheu o conector do Twitter para monitorar
os Tweets publicados com a hashtag #AzureFunctions uma vez por minuto. Se houver
Tweets com essa hashtag, ele verificará se o número de seguidores é maior ou igual
a 200. Se o número de seguidores atender à condição, uma nova ação será criada com
um novo conector do Gmail que poderá enviar um email com o conteúdo dinâmico
que está sendo moldado usando os parâmetros do conector do Twitter.
[ 74 ]
Capítulo 3
Preparação
Antes de avançar, seguiremos as seguintes etapas:
1. Crie uma conta SendGrid (se já não tiver sido criada), pegue a chave da API
SendGrid e crie uma nova chave nas Configurações do aplicativo de função.
2. Instale o Postman para testar o gatilho HTTP. Você pode fazer download
da ferramenta em https://www.getpostman.com/.
3. Substitua o código padrão pelo que será mostrado a seguir e clique em Salvar.
Este código apenas verifica o número de seguidores . Se for maior que 200,
ele enviará um email:
#r "Newtonsoft.Json"
#r "SendGrid"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
[ 75 ]
Integração perfeita do Azure Functions com os Serviços do Azure
using SendGrid.Helpers.Mail;
public static async Task<IActionResult> Run(HttpRequest req, IAsyn
cCollector<SendGridMessage> messages, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a
request.");
}
Else
{
message = null;
}
await messages.AddAsync(message);
return (ActionResult)new OkObjectResult($"Hello");
}
[ 76 ]
Capítulo 3
[ 77 ]
Integração perfeita do Azure Functions com os Serviços do Azure
[ 78 ]
Capítulo 3
E mais...
Se você não visualizar o parâmetro dinâmico pretendido, clique no botão Ver mais,
como mostrado na captura de tela a seguir:
[ 79 ]
Integração perfeita do Azure Functions com os Serviços do Azure
Consulte também
• Consulte Enviar uma notificação por email para o usuário final de modo dinâmico
no Capítulo 2, Trabalhar com notificações usando os serviços SendGrid e Twilio
Muitas vezes, pode ser necessário manter logs de alterações de campos, atributos,
documentos e muito mais para fins de auditoria. No mundo dos bancos de dados
relacionais, você pode ter visto desenvolvedores usando gatilhos ou procedimentos
armazenados para implementar esse tipo de funcionalidade de auditoria, na qual
você escreve o código para armazenar dados em uma tabela de auditoria separada.
Aqui, veremos como é fácil concretizar o caso de uso anterior e auditar as coleções
do Cosmos DB escrevendo uma função simples que será acionada sempre que houver
uma alteração em um documento de uma coleção do Cosmos DB.
Preparação
Para começar, primeiro precisamos:
[ 80 ]
Capítulo 3
1. Depois de criar a conta, você precisa criar um novo banco de dados e uma
coleção. Podemos criar ambos em uma única etapa diretamente do Portal.
2. Navegue até a guia Visão geral e clique no botão Adicionar coleção para criar
uma nova coleção:
[ 81 ]
Integração perfeita do Azure Functions com os Serviços do Azure
[ 82 ]
Capítulo 3
2. Agora, você será direcionado à folha Adicionar Função do Azure, onde escolherá
o aplicativo de função do Azure no qual gostaria de criar uma nova função
(gatilho do Cosmos DB) para ser acionada sempre que houver uma alteração
na coleção. Veja como isso será feito:
[ 83 ]
Integração perfeita do Azure Functions com os Serviços do Azure
[ 84 ]
Capítulo 3
6. Depois de substituir o JSON padrão (que tem apenas um atributo ID) pelo
JSON que possui os atributos necessários, clique no botão Salvar para salvar
as alterações, navegue rapidamente para a outra guia do navegador, onde
a Função do Azure está aberta, e exiba os logs para ver a saída da função.
Veja a seguir como ficaram meus logs. Acabei de adicionar um valor ao atributo
ID do documento. Ele pode parecer diferente para você, dependendo da
sua estrutura JSON:
[ 85 ]
Integração perfeita do Azure Functions com os Serviços do Azure
Como funciona...
Para integrar o Azure Functions com o Cosmos DB, primeiro criamos uma conta do
Cosmos DB, além de um banco de dados e uma nova coleção nele. Depois que a coleção
foi criada, nós a integramos a partir do Portal do Azure clicando no botão Adicionar
Função do Azure, que está disponível no nível da conta do Cosmos DB. Escolhemos
o aplicativo de função necessário no qual queríamos criar um gatilho do Cosmos DB.
Depois que a integração foi concluída, criamos um exemplo de documento na coleção
do Cosmos DB e, em seguida, verificamos que a função foi acionada automaticamente
para todas as alterações (todas as leituras e gravações, mas não as exclusões) que
fizemos na coleção.
E mais...
Quando você integra o Azure Functions para rastrear alterações do Cosmos DB,
ele cria automaticamente uma nova coleção chamada locações, como mostrado
aqui. Lembre-se de que esse é um custo adicional, pois o custo no Cosmos DB
se baseia nas unidades de solicitação (RUs) alocadas para cada coleção:
É importante observar que o gatilho do Cosmos DB não seria acionado (no momento
da gravação) para nenhuma exclusão na coleção. Ele só é acionado para criações
e atualizações de documentos em uma coleção. Se for importante rastrear as exclusões,
você precisará fazer soft deletes, o que significa definir um atributo como IsDeleted
como true para registros que são excluídos pelo aplicativo e, com base no valor do
atributo isDeleted, implementar sua lógica personalizada no gatilho do Cosmos DB.
Se você não conseguir executar essa Função do Azure ou se receber um erro informando
que as extensões do Cosmos DB não estão instaladas, tente criar um novo gatilho
do Azure Cosmos DB, que deverá solicitar a instalação.
[ 86 ]
Noções básicas sobre
a experiência integrada
de desenvolvedor de
Ferramentas do Visual Studio
Neste capítulo, vamos abordar o seguinte:
• Criação de um aplicativo de função usando o Visual Studio 2017
• Depuração de C# do Azure Functions em um ambiente local de preparação
usando o Visual Studio 2017
• Conexão à nuvem de armazenamento do Azure a partir do ambiente
local do Visual Studio
• Implantação do aplicativo Azure Functions para a Nuvem do Azure usando
o Visual Studio
• Depuração de C# do Azure Functions ao vivo, hospedada no ambiente
de Nuvem do Microsoft Azure, usando o Visual Studio
• Implantação do Azure Functions em um contêiner
Introdução
Nos capítulos anteriores, examinamos como criar o Azure Functions diretamente
do Portal de Gerenciamento do Azure. Aqui estão algumas das características:
• Você pode criar rapidamente uma função apenas selecionando um dos modelos
internos fornecidos pelo Tempo de Execução do Azure Functions
• Os desenvolvedores não precisam se preocupar em escrever o código de conexão
e compreender o funcionamento das estruturas
• As alterações de configuração podem ser feitas diretamente na interface
do usuário usando o editor padrão
[ 87 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
Você conhecerá alguns dos recursos já citados neste capítulo e verá como integrar
o código com o Azure DevOps no capítulo 11, Como implementar e implantar a integração
contínua usando o Azure DevOps.
Preparação
Você precisa fazer download e instalar as seguintes ferramentas e software:
1. Faça download da versão mais recente do Visual Studio 2017. Você pode fazer
download em https://visualstudio.microsoft.com/downloads/.
2. Durante a instalação, escolha desenvolvimento do Azure na seção Workloads,
conforme mostrado na captura de tela a seguir e clique no botão Instalar:
[ 88 ]
Capítulo 4
[ 89 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
[ 90 ]
Capítulo 4
Criamos com êxito um novo aplicativo de função acionado por HTTP usando o Visual
Studio 2017.
[ 91 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
Como funciona...
Ferramentas do Visual Studio para o Azure Functions permitem que os desenvolvedores
utilizem seu IDE favorito, já utilizado há muito tempo. Com as ferramentas do Azure
Function, você pode usar o mesmo conjunto de modelos que o Portal de Gerenciamento
do Azure fornece para criar e integrar rapidamente com os serviços de nuvem sem
escrever códigos de conexão (ou mínimos).
A outra vantagem de usar ferramentas do Visual Studio para funções é que você
não precisa ter uma assinatura do Azure ao vivo. Você pode depurar e testar o Azure
Functions diretamente no ambiente de desenvolvimento local. A CLI do Azure e os
utilitários relacionados nos fornecem a assistência necessária para executar o Azure
Functions.
E mais...
Um dos problemas mais comuns enfrentados pelos desenvolvedores ao desenvolver
qualquer aplicativo no ambiente local é que tudo funciona bem na máquina local, mas não
no ambiente de produção. Os desenvolvedores não precisam se preocupar com isso no
caso do Azure Functions. O tempo de execução do Azure Functions fornecido pelas
ferramentas da CLI do Azure é exatamente igual ao tempo de execução disponível
na Nuvem do Azure.
Nesta receita, você saberá como configurar e depurar o Azure Functions em um ambiente
de desenvolvimento local no Visual Studio.
[ 92 ]
Capítulo 4
Preparação
Faça download e instale a CLI do Azure (caso essas ferramentas não estejam instaladas,
note que o Visual Studio fará download automático delas quando você executar suas
funções a partir do Visual Studio).
[ 93 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
4. Clique em Sim na captura de tela anterior para começar a fazer download das
ferramentas da CLI. O download e a instalação das ferramentas da CLI levarão
alguns minutos.
5. Após a instalação com êxito das ferramentas da CLI do Azure Functions,
um host de trabalho será criado e iniciado. Ele começa a monitorar solicitações
em uma porta específica para todas as funções do nosso aplicativo de função.
Esta é a captura de tela que mostra que o host de trabalho começou a monitorar
as solicitações para o aplicativo de função:
[ 94 ]
Capítulo 4
[ 95 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
7. Algo essencial na URL completa do nosso gatilho HTTP é o navegador. Ela deve
ter esta aparência: http://localhost:7071/api/HttpTriggerCsharpFromV
S?name=Praveen Sreeram.
8. Depois de digitar a URL correta do Azure Functions, assim que pressionarmos
a tecla Enter na barra de endereços do navegador, o depurador do Visual Studio
atingirá o ponto de depuração (se você tiver um), conforme mostrado na seguinte
captura de tela:
10. Depois de concluir a depuração, você pode clicar na tecla F5 para concluir o
processo de execução, após o qual você verá a resposta de saída no navegador,
conforme mostrado na seguinte captura de tela:
[ 96 ]
Capítulo 4
Como funciona...
O host de trabalho funciona como um servidor que escuta uma porta específica.
Se houver solicitações para essa porta específica, ele automaticamente cuidará
da execução das solicitações e enviará uma resposta.
E mais...
Usando o Visual Studio, você pode criar diretamente funções pré-compiladas. Isso
significa que, quando você cria suas funções, o Visual Studio cria um arquivo .dll
que pode ser indicado em outros aplicativos, assim como você faz com suas classes
regulares. Estas são duas das vantagens de usar funções pré-compiladas:
[ 97 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
Preparação
Execute os seguintes pré-requisitos:
[ 98 ]
Capítulo 4
[ 99 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
[ 100 ]
Capítulo 4
[ 101 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
9. Assim que o blob for adicionado ao contêiner especificado (neste caso, ele é
cookbookfiles), que está na nuvem em um local remoto, o host de trabalho em
execução no meu computador local detectará que um novo blob foi adicionado
e o depurador atingiu a função, como mostrado na seguinte captura de tela:
Como funciona...
Nesta classe BlobTriggerCSharp, o método Run tem os atributos WebJobs com uma
cadeia de conexão (neste caso, ela é AzureWebJobsStorage). Isso orienta o tempo
de execução a referenciar a cadeia de conexão do armazenamento do Azure no arquivo
de configuração de configurações locais com a chave nomeada após a cadeia de
conexão AzureWebJobsStorage. Quando o host de trabalho começa a ser executado,
ele usa a cadeia de conexão e observa os contêineres de contas de armazenamento
que especificamos. Sempre que um novo blob é adicionado ou atualizado, ele dispara
automaticamente o gatilho de blob no ambiente atual.
E mais...
Ao criar o Azure Functions no Portal de gerenciamento do Azure, você precisa criar
gatilhos e associações de saída na guia Integrar de cada Azure Function. No entanto,
quando você cria uma função do IDE do Visual Studio 2017, só pode configurar atributos
WebJobs para atingir isso.
[ 102 ]
Capítulo 4
Você pode fornecer todos esses detalhes diretamente do Visual Studio sem abrir o Portal
de gerenciamento do Azure. Nesta receita, você aprenderá a fazer isso.
[ 103 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
[ 104 ]
Capítulo 4
[ 105 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
8. Após alguns segundos, você verá algo semelhante à seguinte captura de tela
na janela de Saída da sua instância do Visual Studio:
[ 106 ]
Capítulo 4
E mais...
Os Azure Functions criados a partir do Visual Studio 2017 são pré-compilados. Isso
significa que você implanta os arquivos .dll do Visual Studio 2017 para o Azure.
Portanto, você não pode editar o código das funções no Azure depois de implantá-los.
No entanto, você pode fazer alterações nas configurações, tais como alterar a cadeia
de conexão do Armazenamento do Azure, o caminho do contêiner e assim por diante.
Veremos como fazer isso na próxima receita.
[ 107 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
Preparação
Crie um contêiner denominado cookbookfiles-live na conta de armazenamento.
Vamos carregar um blob neste contêiner.
[ 108 ]
Capítulo 4
[ 109 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
[ 110 ]
Capítulo 4
[ 111 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
Ao observar o título desta receita, talvez você já esteja se perguntando por que e como
implantar um Azure Functions em um contêiner do Docker ajudaria. Sim, a combinação
do Azure Functions e do Contêiner do Docker talvez não faça sentido, pois você perderia
todos os benefícios da falta de servidor do Azure Functions ao implantar no Docker. No
entanto, pode haver alguns clientes cujos workloads existentes estejam na nuvem (pública
ou privada), mas agora eles desejam aproveitar alguns dos gatilhos do Azure Functions
e dos Serviços do Azure relacionados. Portanto, eles desejam implantar o Azure Functions
como uma imagem do Docker. Esta receita mostra como implementar isso.
Preparação
Estes estão os pré-requisitos para começar com esta receita:
[ 112 ]
Capítulo 4
Criando um ACR
Execute as seguintes etapas:
[ 113 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
2. Depois que o ACR for criado com êxito, navegue até a folha de Chaves de Acesso
e anote o Servidor de login, o Nome de usuário e a senha, que são destacados
na captura de tela a seguir. Você utilizará isso mais adiante nesta receita:
Antes de começar, vamos fazer uma pequena alteração no HTTPTrigger para entender
que o código está sendo executado a partir do Docker, como destacado na imagem
a seguir. Para fazer isso, acabei de adicionar uma mensagem Do Docker para a saída,
da seguinte maneira:
[ 114 ]
Capítulo 4
3. Após a criação da imagem com êxito, a próxima etapa será executar a imagem
do Docker em uma porta específica. Execute o comando para executá-la. Você
deverá ver algo como a seguinte captura de tela:
[ 115 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
4. Verifique se tudo está funcionando bem no ambiente local navegando até o host
local com a porta direita, conforme mostrado na captura de tela a seguir.
1. A primeira etapa é garantir que forneçamos uma marca válida para a imagem
usando o comando docker tag functionsindocker cookbookregistry.
azurecr.io/functionsindocker:v1. A execução deste comando não
fornecerá resultados. No entanto, para exibir nossas alterações, vamos executar
o comando docker images, conforme mostrado na seguinte captura de tela:
2. Para enviar a imagem ao ACR, você precisa autenticar-se no Azure. Para fazer
isso, você pode usar comandos da CLI do Azure. Vamos fazer logon no Azure
usando o comando az login. A execução deste comando abrirá um navegador e
autenticará suas credenciais, conforme mostrado nesta captura de tela:
[ 116 ]
Capítulo 4
5. Vamos navegar para o ACR no portal do Azure e analisar se a nossa imagem foi
enviada para ela corretamente na folha Repositórios, como mostrado na seguinte
captura de tela:
Criamos com êxito uma imagem e a enviamos para o ACR. Agora, precisamos criar
o Azure Functions e referenciar a imagem do Docker que foi enviada para o ACR.
[ 117 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
4. Depois de revisar todos os detalhes, clique no botão Criar para criar o aplicativo
de função.
5. É isso. Criamos um Aplicativo de Função que pode permitir implantar
as imagens do Docker, vinculando-as à imagem hospedada no Registro de
Contêiner do Azure. Vamos testar rapidamente o HttpTrigger navegando até
o ponto de extremidade HTTP no navegador. Veja a seguir o resultado do Azure
Functions.
Como funciona...
Nos três primeiros capítulos, criamos o aplicativo de função e as funções diretamente
no portal. Por outro lado, neste capítulo, criamos o aplicativo de função e as funções
no próprio Visual Studio.
[ 119 ]
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio
1. Crie uma imagem do Docker do aplicativo de função que criamos neste capítulo
usando o Visual Studio.
2. Envie a imagem do Docker para o ACR
3. No portal, crie um novo aplicativo de função, escolhendo publicar
o pacote executável como uma imagem do Docker
4. Anexe a imagem do Docker do ACR (da etapa 2 no guia anterior)
ao Azure Functions (da etapa 3 no guia anterior)
[ 120 ]
Exploração de ferramentas
de testes para a validação do
Azure Functions
Neste capítulo, vamos explorar diferentes maneiras de testar o Azure Functions mais
detalhadamente com as seguintes receitas:
Introdução
Nos capítulos anteriores, você aprendeu a desenvolver o Azure Functions, identificou
onde ele é útil e verificou a validação da funcionalidade dessas funções.
[ 121 ]
Exploração de ferramentas de testes para a validação do Azure Functions
Neste capítulo, vamos começar a verificar maneiras de testar diferentes Azure Functions.
Isso inclui, por exemplo, a execução de testes de funções de gatilho de HTTP usando
o Postman e o Gerenciador de Armazenamento do Microsoft para testar gatilhos de blob
do Azure, gatilhos de fila e outros gatilhos relacionados ao serviço de armazenamento.
Você também aprenderá como executar um teste de carga simples em um gatilho de
HTTP, para ajudá-lo a entender como a arquitetura sem servidor funciona, provisionando
as instâncias no back-end. Os desenvolvedores não precisarão se preocupar com as
configurações de escala em diferentes fatores. O tempo de execução do Azure Functions
cuidará automaticamente da escala das instâncias.
Preparação
Instale as seguintes ferramentas se ainda não tiver feito isso:
[ 122 ]
Capítulo 5
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
string firstname=req.Query["firstname"];
string lastname=req.Query["lastname"];
[ 123 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 124 ]
Capítulo 5
2. Depois de clicar no modelo na captura de tela anterior, ele solicitará que você
forneça uma conta de armazenamento e um contêiner onde você armazenará
o blob, mostrado a seguir:
[ 125 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 126 ]
Capítulo 5
[ 127 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 128 ]
Capítulo 5
3. Na folha Serviço de fila, clique em Fila para adicionar uma nova fila:
[ 129 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 130 ]
Capítulo 5
E mais...
Para todos os seus gatilhos HTTP, se você desejar permitir que os consumidores de
API usem apenas o método POST, poderá restringi-lo como tal, escolhendo Métodos
selecionados e apenas POST em Métodos HTTP selecionados, conforme mostrado
nesta captura de tela:
[ 131 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 132 ]
Capítulo 5
10. Ele solicita que você digite um nome para o novo slot. Forneça um nome
significativo, algo como Preparação, como mostrado na seguinte captura
de tela:
[ 133 ]
Exploração de ferramentas de testes para a validação do Azure Functions
11. Após você clicar em Criar, um novo slot será criado, como mostrado na captura
de tela a seguir. No caso, se você ver as funções como somente leitura, poderá
torná-las leitura-gravação nas configurações do aplicativo de função.
[ 134 ]
Capítulo 5
[ 135 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 136 ]
Capítulo 5
18. Se você não vir alterações, clique no botão Atualizar do aplicativo de função ,
conforme mostrado nesta captura de tela:
[ 137 ]
Exploração de ferramentas de testes para a validação do Azure Functions
Todas as funções encontradas na receita são gatilhos HTTP; note que você
pode ter qualquer tipo de gatilho no aplicativo de função. Os slots de
implantação não se limitam aos gatilhos HTTP.
Você pode ter vários slots para cada um dos aplicativos de função. Estes
são alguns dos exemplos:
Alfa
Beta
Preparação
[ 138 ]
Capítulo 5
E mais...
Se você tentar criar um slot sem ativar o recurso de Slots de Implantação, você verá algo
semelhante ao que é mostrado na seguinte captura de tela:
Você precisa ter todos os Azure Functions em cada um dos slots que gostaria de trocar
com o seu aplicativo de função de produção:
[ 139 ]
Exploração de ferramentas de testes para a validação do Azure Functions
Preparação
Crie uma conta do Azure DevOps em https://visualstudio.microsoft.com/.
Utilizaremos a ferramenta Teste de Carga do Azure DevOps para criar testes de carga
baseados em URL.
[ 140 ]
Capítulo 5
8. Cole a URL do gatilho de HTTP que você copiou na etapa 4 no campo de entrada
da URL, conforme mostrado nesta captura de tela:
[ 141 ]
Exploração de ferramentas de testes para a validação do Azure Functions
10. A próxima etapa é fornecer detalhes sobre a carga que gostaríamos de criar
no Azure Functions. Como mostrado na captura de tela a seguir, clique em
Configurações e forneça os detalhes sobre o teste de carga que você gostaria,
de acordo com seus requisitos:
11. Após fornecer todos os seus detalhes para o teste de carga, clique em Salvar.
Após você salvar o teste, o botão Executar teste será ativado, conforme mostrado
na seguinte captura de tela:
12. Clique em Executar teste para iniciar o teste de carga. Como a duração de
execução do nosso teste de carga é de 20 minutos, levaria 20 minutos para
concluir o teste de carga. Quando a carga estiver concluída, o Azure DevOps
nos fornecerá os relatórios de performance, mostrados da seguinte maneira:
[ 142 ]
Capítulo 5
E mais...
Também podemos verificar como o Azure expande as instâncias automaticamente nos
bastidores na guia Live Metrics Stream do Application Insights. A captura de tela
a seguir mostra as IDs de instância e a integridade das máquinas virtuais alocadas
automaticamente, com base na carga na arquitetura sem servidor do Azure. Você
aprenderá a integrar o Application Insights com o Azure Functions no Capítulo 6,
Como monitorar e solucionar problemas de serviços sem servidor no Azure
[ 143 ]
Exploração de ferramentas de testes para a validação do Azure Functions
Consulte também
O Monitoramento do Azure Functions usando a receita do Application Insights
no Capítulo 6, Como monitorar e solucionar problemas de serviços sem servidor no Azure,
contém mais informações sobre este tópico.
O Azure também nos fornece ferramentas para desenvolvedores que adoram trabalhar
com a linha de comando. Essas ferramentas nos permitem criar recursos do Azure com
comandos simples diretamente da linha de comando. Nesta receita, você aprenderá
a criar um novo aplicativo de função e também entenderá como criar uma função
e implantá-la na Nuvem do Azure diretamente da linha de comando.
Preparação
Execute as seguintes etapas:
[ 144 ]
Capítulo 5
2. Execute o seguinte comando para criar uma nova função de gatilho HTTP
no novo aplicativo de função que criamos:
func new
[ 145 ]
Exploração de ferramentas de testes para a validação do Azure Functions
4. A próxima etapa é fornecer um nome para o Azure Functions que você estiver
criando. Forneça um nome significativo e pressione Enter, como mostrado
na seguinte captura de tela:
5. Você pode usar seu IDE favorito para editar o código do Azure Functions.
Nesta receita, estou usando o código do Visual Studio para abrir a função
HttpTrigger, conforme mostrado na seguinte captura de tela:
6. Vamos testar o Azure Functions diretamente do seu computador local. Para isso,
precisamos iniciar o host do Azure Functions executando o seguinte comando:
func host start --build
[ 146 ]
Capítulo 5
7. Depois que o host for iniciado, você poderá copiar a URL e testá-la em
seu navegador, junto com um nome de parâmetro de cadeia de caracteres
de consulta, conforme mostrado na seguinte captura de tela:
Seria realmente útil receber uma notificação quando o nosso site não estivesse disponível
ou não respondesse a solicitações do usuário. O Azure fornece algumas ferramentas
para ajudar, alertando-nos se o site não está respondendo ou está inativo. Uma delas
é o Application Insights. Você aprenderá como configurar o Application Insights para
fazer ping em nosso aplicativo Azure Functions a cada minuto e configurá-lo para
alertar-nos se a função não estiver respondendo.
[ 147 ]
Exploração de ferramentas de testes para a validação do Azure Functions
Preparação
Execute as seguintes etapas:
[ 148 ]
Capítulo 5
[ 149 ]
Exploração de ferramentas de testes para a validação do Azure Functions
2. Na folha Criar teste, insira um nome significativo para seu requisito e cole
a URL do aplicativo de função, que você anotou na etapa 2 da seção anterior,
Preparação, no campo URL da folha Criar teste. Na folha Alertas, forneça
um endereço de e-mail válido no campo Enviar e-mails de alerta para esses
endereços de e-mail:, para o qual um alerta deverá ser enviado se a função
não estiver disponível ou não estiver respondendo:
[ 150 ]
Capítulo 5
[ 151 ]
Exploração de ferramentas de testes para a validação do Azure Functions
Como funciona...
Criamos um teste de disponibilidade, em que foi realizado ping em nosso aplicativo
de função uma vez a cada cinco minutos de um máximo de cinco locais diferentes
em todo o mundo. Você pode configurá-los na guia Local de teste da folha Criar teste
ao criar o teste. O critério padrão do ping é verificar se o código de resposta da URL
é 200. Se o código de resposta não for 200, então o teste falhou e um alerta será
enviado para o endereço de e-mail configurável.
E mais...
Você poderá usar um teste da Web de várias etapas (com a opção Tipo de Teste
na folha Criar teste) se desejar testar uma página ou funcionalidade que exija
a navegação para várias páginas.
Nesta receita, aprenderemos como usar o gatilho de HTTP básico e ver como é fácil
escrever casos de teste de unidade automatizados para isso usando o Visual Studio
Test Explorer e o Moq (uma estrutura open source disponível como um pacote NuGet).
Preparação
Utilizaremos a estrutura de simulação Moq para o teste da unidade de nosso Azure
Functions. Ter um conhecimento de trabalho básico de Moq é uma exigência para esta
receita. Se precisar, você poderá conhecer mais sobre Moq em https://github.com/
moq/moq4/wiki.
[ 153 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 154 ]
Capítulo 5
namespace AzureFunctions.Tests
{
public class ShouldExecuteAzureFunctions
{
[Fact]
public async Task WithAQueryString()
{
var httpRequestMock = new Mock<HttpRequest>();
var LogMock = new Mock<ILogger>();
var queryStringParams = new Dictionary<String,
StringValues>();
httpRequestMock.Setup(req => req.Query).Returns(new Qu
eryCollection(queryStringParams));
queryStringParams.Add("name", "Praveen Sreeram");
[ 155 ]
Exploração de ferramentas de testes para a validação do Azure Functions
[ 156 ]
Como monitorar e solucionar
problemas de serviços sem
servidor no Azure
Neste capítulo, você aprenderá sobre o seguinte:
Introdução
Não basta concluir o desenvolvimento de um projeto e ativar um aplicativo para finalizar
a implantação. Precisamos monitorar continuamente nossos aplicativos, analisar sua
performance e revisar seus logs para entender se os usuários finais enfrentam problemas.
Neste capítulo, você aprenderá como utilizar essas ferramentas e adotar qualquer
ação necessária com base nas informações disponíveis.
[ 157 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
[ 158 ]
Capítulo 6
A janela de log mostra erros somente para essa função específica e não
para as outras funções associadas ao aplicativo de função. Nesse caso,
os logs do aplicativo de streaming de logs são úteis, pois podem ser
usados nas funções de qualquer aplicativo de função específico.
[ 159 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
2. Logo depois, você passará para outra folha, em que poderá escolher a categoria
certa para os problemas que estiver solucionando no momento. Clique
em 5xx Erros para exibir detalhes sobre as exceções que os usuários finais
enfrentam, como mostrado na seguinte captura de tela:
[ 160 ]
Capítulo 6
E mais...
Cada evento de função é registrado em um serviço de armazenamento de tabela do Azure.
Todos os meses, uma tabela é criada com o nome AzureWebJobsHostLogs<ano><mês>.
[ 161 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
Como parte da solução de problemas, se você quiser obter mais detalhes sobre qualquer
erro, primeiro localize o campo ID na seção Detalhes da Invocação, conforme mostrado
na seguinte captura de tela:
Como mostrado na captura de tela anterior, você receberá a entrada de log armazenada
no armazenamento de tabela. Clicar na linha abrirá os detalhes completos do erro, como
mostrado na seguinte captura de tela:
[ 162 ]
Capítulo 6
Preparação
Criamos uma conta do Application Insights na receita Teste e validação da capacidade
de resposta do Azure Functions usando o Application insights do Capítulo 5, Exploração
de ferramentas de teste para a validação do Azure Functions. Crie uma conta, caso ainda não
tenha feito isso, seguindo as seguintes etapas:
[ 163 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
1. Depois que a conta do Application Insights for criada, navegue até a guia
Visão geral e vá até Chave de Instrumentação, conforme mostrado na seguinte
captura de tela:
[ 164 ]
Capítulo 6
°° Abra um dos Azure Functions (no meu caso, abri o gatilho de HTTP)
em outra guia e execute alguns testes para garantir que ele emita alguns
logs para o Application Insights.
5. Depois de concluir esses testes, vá para a guia que tem o Application Insights.
Você verá o tráfego ao vivo passando para o seu aplicativo de função, como
mostrado na seguinte captura de tela:
[ 165 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
Como funciona...
Criamos uma conta do Application Insights. Após integrar a Chave de Instrumentação
do Application Insights com o Azure Functions, o tempo de execução cuidará de enviar
os dados de telemetria de forma assíncrona para sua conta do Application Insights.
E mais...
No Live Metrics Stream, você também pode exibir todas as instâncias, junto com alguns
outros dados, como o número de solicitações por segundo tratadas por suas instâncias.
Vamos fazer uma pequena alteração na função do gatilho de HTTP e, depois, executá-lo
algumas vezes.
1. Navegue até o gatilho de HTTP que você criou e substitua o código a seguir.
Acabei de mover a linha de código que registra as informações para o console
Logs e adicionei o parâmetro name no final do método:
public static async Task<IActionResult> Run(HttpRequest req,
ILogger log)
{
string name = req.Query["name"];
string requestBody = await new
StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.
DeserializeObject(requestBody);
name = name ?? data?.name;
log.LogInformation($"C# HTTP trigger function processed
a request with the input value {name}");
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on
the query string or in the request body");
}
[ 166 ]
Capítulo 6
2. Agora, execute a função fornecendo o valor para o parâmetro name com valores
diferentes, como Azure Test Run 1, Azure Test Run 2 e Azure Test Run
3. Isto é apenas para fins de demonstração. Você pode usar a entrada da sua
preferência. O console Logs mostrará a seguinte saída:
[ 167 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
Como funciona...
No gatilho de HTTP, adicionamos uma instrução log que exibe o valor do parâmetro
name que o usuário fornece. Executamos o gatilho de HTTP algumas vezes. Após algum
tempo, clique no botão Análise no Application Insights, que abre a janela Análise, em
que você pode gravar consultas para exibir os dados de telemetria que estão sendo
emitidos pelo Azure Functions. Tudo isso pode ser obtido sem escrever códigos
personalizados.
Você pode executar consultas sobre as informações que o Application Insights fornece
usando sua linguagem de consulta de análise.
[ 168 ]
Capítulo 6
Nesse contexto, as solicitações por hora são uma métrica derivada. Se você quiser
criar um novo relatório no Application Insights, precisará alimentar o Application
Insights sobre a nova métrica derivada regularmente. Depois de alimentar os dados
necessários regularmente, o Application Insights fornecerá relatórios para sua análise.
Utilizaremos o Azure Functions que alimenta o Application Insights com uma métrica
derivada denominada solicitações por hora:
[ 169 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
Preparação
Execute as seguintes etapas de pré-requisitos:
1. Crie uma nova conta do Application Insights, caso ainda não tenha uma.
2. Verifique se você tem um aplicativo em execução que se integre com
o Application Insights. Você pode aprender como integrar seu aplicativo com o
Application Insights em https://docs.microsoft.com/en-us/azure/
application-insights/app-insights-asp-net.
[ 170 ]
Capítulo 6
3. Como mostrado na imagem anterior, clique no botão Criar para criar a função.
[ 171 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
3. Também precisamos criar uma nova chave de API. Conforme mostrado na etapa
anterior, clique no botão Criar chave de API para gerar a nova chave de API,
conforme mostrado na captura de tela a seguir. Forneça um nome significativo,
verifique os dados de Telemetria de leitura e clique em Gerar chave:
[ 172 ]
Capítulo 6
4. Logo depois, você poderá ver e copiar a chave, como mostrado na captura de
tela a seguir. Utilizaremos isso para criar uma nova configuração de aplicativo
com o nome AI_APP_KEY no nosso aplicativo de função:
[ 173 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
1. Agora, é hora de desenvolver uma consulta que nos forneça o valor de métrica
derivada de solicitações por hora. Navegue até a folha Visão geral do
Application Insights e clique no botão Análise.
2. Você passará para a folha Análise. Grave a seguinte consulta na guia de consulta.
Você pode gravar sua própria consulta conforme suas exigências. Certifique-se
de que a consulta retorne um valor escalar:
requests
| where timestamp > now(-1h)
| summarize count()
[ 174 ]
Capítulo 6
5. Vamos fazer um teste rápido para ver se você definiu as três configurações
do aplicativo e a consulta corretamente. Navegue até a guia Integrar e altere
a frequência de execução para um minuto, conforme mostrado nesta captura
de tela:
[ 175 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
6. Agora, vamos navegar até a guia Monitorar e ver se tudo está funcionando bem.
Em caso de problemas, você verá uma marca X na coluna Status. Exiba o erro
na seção Logs da guia Monitorar clicando na entrada Log de invocação: