Escolar Documentos
Profissional Documentos
Cultura Documentos
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:
[ 176 ]
Capítulo 6
3. Depois disso, você passará para a folha Detalhes do gráfico, onde você pode
configurar sua métrica personalizada e todos os outros detalhes relacionados
ao gráfico. No menu suspenso NAMESPACE MÉTRICO, escolha azure.
applicationinsghts, conforme mostrado na seguinte captura de tela e escolha
a métrica personalizada Solicitação por hora que você criou:
[ 177 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
Como funciona...
É assim que todo o processo funciona:
[ 178 ]
Capítulo 6
O Azure Functions nos fornece a capacidade de obter todos os detalhes básicos usando
um modelo de função com código que é responsável por recuperar todos os valores
necessários do Application Insights e o código de canalização de estruturação do corpo
do e-mail e o envio do e-mail usando o SendGrid. Veremos como fazer isso nesta receita.
Preparação
Execute as seguintes etapas de pré-requisitos:
1. Crie uma nova conta SendGrid, se você ainda não tiver criado uma, e obtenha
a chave de API SendGrid
2. Crie uma nova conta do Application Insights, caso ainda não tenha uma
3. Verifique se você tem um aplicativo em execução que se integre com
o Application Insights
[ 179 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
[ 180 ]
Capítulo 6
7. Esta é uma captura de tela do e-mail que recebi depois de clicar no botão
Executar na captura de tela anterior:
[ 181 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
Como funciona...
O Azure Functions usa a API do Application Insights para executar todas as consultas
do Application Insights Analytics, recupera todos os resultados, estrutura o corpo
do e-mail com todos os detalhes e invoca a API SendGrid para enviar um e-mail
para a conta de e-mail configurada.
E mais...
Os modelos do Azure fornecem código padrão com algumas consultas que geralmente
são úteis para monitorar a integridade do aplicativo. Em caso de requisitos específicos
para receber alertas de notificação, vá em frente e adicione novas consultas ao método
GetQueryString. Para incorporar os novos valores, também será necessário alterar
a classe DigestResult e a função GetHtmlContentValue.
Consulte também
A receita Envio de uma notificação por e-mail ao administrador do site usando o serviço SendGrid
do Capítulo 2, Como trabalhar com notificações usando os serviços SendGrid e Twilio.
[ 182 ]
Capítulo 6
Preparação
Execute as seguintes etapas de pré-requisitos:
[ 183 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
Você precisa usar sua conta de trabalho para criar uma conta do Power BI.
No momento da gravação, não é possível criar uma conta do Power BI usando
um endereço de e-mail pessoal, como Gmail, Yahoo e assim por diante.
Verifique se você seguiu as etapas na seção Configuração de chaves de
acesso da receita Envio de detalhes de telemetria personalizados para
o Application Insights Analytics para configurar essas chaves de acesso:
Application Insights Chave de Instrumentação, a ID do aplicativo e a
chave de acesso à API.
1. Se você estiver usando o portal do Power BI pela primeira vez, talvez precise
clicar em Ignorar na página de boas-vindas, conforme mostrado na seguinte
captura de tela:
[ 184 ]
Capítulo 6
[ 185 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
5. Após criar o conjunto de dados, você será solicitado com uma URL de Push,
conforme mostrado na captura de tela a seguir. Você usará essa URL de
Push no Azure Functions para enviar os dados RequestsPerSecond por
push a cada segundo (ou de acordo com seus requisitos) com o valor real
de solicitações por segundo. Clique em Concluído:
[ 186 ]
Capítulo 6
6. A próxima etapa é criar um painel com um bloco nele. Vamos criar um novo
painel clicando em Criar e escolhendo Painel, como mostrado na seguinte
captura de tela:
[ 187 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
8. No painel vazio, clique no botão Adicionar bloco para criar um novo bloco.
Se você clicar em Adicionar bloco, abrirá um novo popup, em que poderá
selecionar a fonte de dados da qual o bloco deverá ser preenchido:
[ 188 ]
Capítulo 6
10. A próxima etapa é escolher Tipo de Visualização (neste caso, ele é Cartão) e
selecionar os campos da fonte de dados, como mostrado na seguinte captura de tela:
11. A etapa final é fornecer um nome para seu bloco. Forneci RequestsPerSecond.
O nome pode não fazer sentido, neste caso. Mas você pode fornecer qualquer
nome, de acordo com suas exigências.
[ 189 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
1. Navegue até o Azure Functions e crie uma nova função por meio do seguinte
modelo:
[ 190 ]
Capítulo 6
[ 191 ]
Como monitorar e solucionar problemas de serviços sem servidor no Azure
AiAppKey);
httpClient.DefaultRequestHeaders.Add("x-ms-app",
"FunctionTemplate");
httpClient.DefaultRequestHeaders.Add("x-ms-client-
request-id", requestId);
string apiPath = $"{AppInsightsApi}/{AiAppId}/query?
clientId={requestId}×pan=P1D&query={query}";
using (var httpResponse = await
httpClient.GetAsync(apiPath))
{
httpResponse.EnsureSuccessStatusCode();
var resultJson = await
httpResponse.Content.ReadAsAsync<JToken>();
double result;
if (!double.TryParse(resultJson.SelectToken
("Tables[0].Rows[0][0]")?.ToString(), out
result))
{
throw new FormatException("Query must result
in a
single metric number. Try it on Analytics
before
scheduling.");
}
string postData = $"[{{ "requests": "{result}"
}}]";
log.Verbose($"[Verbose]: Sending data:
{postData}");
using (var response = await
httpClient.PostAsync(RealTimePushURL, new
ByteArrayContent(Encoding.UTF8.
GetBytes(postData))))
{
log.Verbose($"[Verbose]: Data sent with
response:
{response.StatusCode}");
}
}
}
}
[ 192 ]
Capítulo 6
4. Esta é uma captura de tela que tem uma sequência de imagens mostrando
os dados em tempo real:
Como funciona...
Criamos o seguinte nesta ordem específica:
E mais...
• O Power BI nos permite criar dados em tempo real em relatórios de várias
maneiras. Nesta receita, você aprendeu a criar relatórios em tempo real usando
o conjunto de dados de streaming. As outras maneiras são com o conjunto de
dados de envio por push e o conjunto de dados de streaming PubNub. Você pode
saber mais sobre as três abordagens em https://powerbi.microsoft.com/
documentation/powerbi-service-real-time-streaming/.
• Tenha cuidado ao obter dados de integridade do aplicativo em tempo real.
A API do Application Insights tem um limite de taxa. Verifique https://dev.
applicationinsights.io/documentation/Authorization/Rate-limits
para entender mais sobre os limites de API.
[ 193 ]
Desenvolver aplicativos
confiáveis sem servidor
usando o Durable Functions
Neste capítulo, você aprenderá a:
Introdução
Ao trabalhar no desenvolvimento de aplicativos modernos que precisam ser hospedados
na nuvem, você precisa garantir que eles não possuam estado. A ausência de estado
é um fator essencial para o desenvolvimento de aplicativos habilitados para a nuvem.
Por exemplo, você deve evitar persistir dados no recurso específico de instâncias
de máquina virtual (VM) provisionadas para Serviços do Azure (por exemplo, serviço
de aplicativo, a API etc.). Se você fizer isso, não poderá utilizar alguns dos serviços, como
a funcionalidade de dimensionamento automático, pois o provisionamento de instâncias
é dinâmico. Se você depender de quaisquer recursos específicos da VM, acabará
enfrentando problemas com comportamentos inesperados.
[ 195 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
Preparação
Crie um novo aplicativo de função, se ainda não tiver feito isso. Verifique se a versão
do tempo de execução é ~2 nas Configurações do aplicativo, como mostrado na captura
de tela a seguir:
[ 196 ]
Capítulo 7
[ 197 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
E mais...
Atualmente, C# é a única linguagem compatível com o desenvolvimento do Durable
Functions. O suporte para outras linguagens está na fase de visualização.
[ 198 ]
Capítulo 7
Preparação
Antes de avançar, seguiremos as seguintes etapas:
[ 199 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
using System.Net;
[ 200 ]
Capítulo 7
eventData);
return starter.CreateCheckStatusResponse(req,
instanceId);
}
[ 201 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
"type": "orchestrationClient",
"direction": "in"
}
]
}
[ 202 ]
Capítulo 7
[ 203 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
2. Substitua o código padrão pelo seguinte código que apenas exibe o nome que
é fornecido como entrada e, em seguida, clique no botão Salvar para salvar
as alterações:
#r "Microsoft.Azure.WebJobs.Extensions.DurableTask"
public static string Run(string name)
{
return $"Hello Welcome Cookbook Readers!";
}
[ 204 ]
Capítulo 7
Como funciona...
Vejamos o funcionamento do método:
E mais...
O Durable Functions depende da estrutura de tarefas duráveis. Saiba mais sobre
a estrutura de tarefas duráveis em https://github.com/Azure/durabletask.
Aqui, veremos alguns dos pontos essenciais que você precisa conhecer ao trabalhar
com o Durable Functions.
[ 205 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
Preparação
Faça download e instale os seguintes itens, caso ainda não tenha feito isso:
3. Depois de clicar no botão Enviar, você receberá uma resposta com o seguinte:
°° O ID da instância
°° O URL para recuperar o status da função
°° O URL para enviar um evento à função
°° O URL para encerrar a solicitação
[ 206 ]
Capítulo 7
6. Se algo der errado, você poderá ver a mensagem de erro na coluna de resultados,
que informa em qual função ocorreu o erro. Em seguida, navegue até a guia
Monitor dessa função para ver uma explicação detalhada do erro.
[ 207 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
Aqui, implementaremos uma maneira simples de executar uma função em paralelo com
várias instâncias usando o Durable Functions para o cenário a seguir.
Imagine que temos cinco clientes (cujos IDs são 1, 2, 3, 4 e 5, respectivamente) que nos
procuraram para gerar um grande número de códigos de barras (cerca de 50.000). Seria
necessário muito tempo para gerar os códigos de barras, pois isso envolveria algumas
tarefas de processamento de imagens. Então, uma maneira simples de processar
rapidamente a solicitação é usar a programação assíncrona criando um thread para
cada um dos clientes e, em seguida, executar a lógica em paralelo para cada um deles.
Também simularemos um caso de uso simples para entender como o Durable Functions
faz a autocorreção quando a VM na qual ele está hospedado fica indisponível ou é
reiniciada.
Preparação
Instale os seguintes itens, caso ainda não tenha feito isso:
[ 208 ]
Capítulo 7
[ 209 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
await Task.WhenAll(tasks);
int nTotalItems = tasks.Sum(item => item.Result);
return nTotalItems;
}
[ 210 ]
Capítulo 7
"direction": "in"
}
]
}
[ 211 ]
Desenvolver aplicativos confiáveis sem servidor usando o Durable Functions
5. Depois de clicar no botão Enviar, você receberá uma resposta com o URL
do status. Clique em statusQueryGetURi para exibir o status da função.
Se você clicar no link statusQueryGetURi, ele será aberto em uma nova guia
dentro da ferramenta Postman. Quando a nova guia for aberta, clique no botão
Enviar para ver o progresso da função.
6. Enquanto a função estiver em execução, navegaremos até a folha Visão geral
do aplicativo de função e interromperemos o serviço clicando no botão Parar:
[ 212 ]
Capítulo 7
Como funciona...
O Durable Functions nos permite desenvolver a execução confiável das nossas funções,
o que significa que, mesmo que as VMs falhem ou sejam reiniciadas enquanto a função
estiver em execução, ela será retomada automaticamente no estado anterior. Ela faz isso
com a ajuda de algo chamado definição do ponto de verificação e reprodução, em que
o histórico da execução é armazenado na tabela de armazenamento.
E mais...
• Caso você receba uma resposta 404 Not Found ao executar o URL
statusQueryGetURi, não se preocupe. Levará algum tempo, mas acabará
funcionando quando você fizer uma solicitação posteriormente.
• Para exibir o histórico de execução do Durable Functions, navegue
até a tabela DurableFunctionsHubHistory, localizada na conta
de armazenamento que foi criada junto com o aplicativo de função:
[ 213 ]
Importação em massa de
dados usando o Azure Durable
Functions e o Cosmos DB
Neste capítulo, vamos aprender as seguintes receitas:
Introdução
Neste capítulo, desenvolveremos um miniprojeto considerando um caso de uso
muito comum que resolve o problema de negócios de compartilhamento de dados
em diferentes aplicativos que usam Excel. Usaremos a Durable Functions, que é uma
extensão para o Azure Functions que permite gravar fluxos de trabalho escrevendo
o número mínimo de linhas de código.
[ 215 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
Aqui estão os dois principais recursos da Durable Functions que usaremos nas receitas
deste capítulo:
Problema de negócios
Em geral, todas as organizações definitivamente estarão usando diversos aplicativos
hospedados em várias plataformas em diferentes data centers (na nuvem ou na
infraestrutura local). Muitas vezes, haverá requisitos em que os dados de um
aplicativo precisarão ser alimentados em outro sistema. Normalmente, planilhas do
Excel (ou, em alguns casos, arquivos JSON ou XML) são usadas para exportar dados
de um aplicativo e importá-los para outro.
Você pode pensar que exportar um arquivo do Excel de um aplicativo para outro
é um trabalho fácil, mas se houver muitos aplicativos que precisam alimentar dados
para outros aplicativos, em uma base semanal/mensal, isso se tornará muito tedioso
e dará muito espaço para erro manual. Então, obviamente, a solução é automatizar
o processo para a maior extensão possível.
Neste capítulo, aprenderemos como desenvolver uma solução durável com base
na arquitetura sem servidor usando o Durable Functions. Se você já leu o Capítulo 7,
Como desenvolver aplicativos confiáveis sem servidor usando Durable Functions, terá
algum conhecimento básico do que é o Durable Functions e como ele funciona. No
Capítulo 7, Como desenvolver aplicativos confiáveis sem servidor usando Durable Functions,
implementamos a solução do portal. No entanto, neste capítulo, implementaremos
um miniprojeto usando o Visual Studio 2017 (preferencialmente, 15.5 ou superior).
[ 216 ]
Capítulo 8
[ 217 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
Preparação
Execute os seguintes pré-requisitos:
[ 218 ]
Capítulo 8
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.FileExtensions
Install-Package Microsoft.Extensions.Configuration.Json
[ 219 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
5. Agora, copie o código a seguir para a função Main. Esta parte do código apenas
invoca a função UploadBlob, que internamente é responsável pelo carregamento
do blob:
{
UploadBlob().Wait();
}
catch (Exception ex)
{
Console.WriteLine(“An Error has occurred with the message” +
ex.Message);
}
[ 220 ]
Capítulo 8
8. Agora, compile o aplicativo e execute-o. Se você configurou tudo, deverá ver algo
como mostrado na seguinte captura de tela:
Como funciona...
Nesta receita, criamos um aplicativo de console que usa assemblies de armazenamento
para carregar um blob (em nosso caso, é apenas um arquivo do Excel) para o contêiner
de blob designado. Observe que toda vez que o aplicativo for executado, um novo
arquivo será criado no contêiner de blob. Para carregar os arquivos do Excel com
nomes exclusivos, estamos anexando um GUID.
[ 221 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
E mais...
Anote as convenções de nomenclatura que devem ser seguidas ao criar o contêiner
de blob:
Preparação
Execute os seguintes pré-requisitos:
[ 222 ]
Capítulo 8
[ 223 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
3. Quando você cria o projeto, a estrutura deve ser algo parecido com a seguinte
captura de tela:
[ 224 ]
Capítulo 8
[ 225 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
Terminamos de criar o gatilho de blob que é acionado sempre que um novo blob
é adicionado ao contêiner de blob.
E mais...
Todas as configurações serão obtidas do arquivo local.settings.json enquanto
você está executando as funções em seu ambiente local. No entanto, quando você
implanta as funções no Azure, todos os itens de configurações (como cadeia de conexão
e configurações do aplicativo) serão mencionados nas Configurações do Aplicativo
de seu aplicativo de função. Verifique se você criou todos os itens de configuração
no aplicativo de função depois de implantar as funções.
[ 226 ]
Capítulo 8
1. Crie uma nova função clicando com o botão direito do mouse em ExcelImport.
DurableFunctions, clique em Adicionar e escolha Nova Função do Azure,
como mostrado na captura de tela a seguir:
[ 227 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
[ 228 ]
Capítulo 8
[ 229 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
Como funciona...
Iniciamos a receita criando a função Orchestration e, em seguida, fizemos alterações
no gatilho de blob ExcelImportBlobTrigger adicionando as associações de saída
OrchestratonClient para invocar a função do Orquestrador do Durable.
Quando você cria uma nova função Orchestration, ela cria algumas funções de atividade.
Nas próximas receitas, vamos removê-las e criar novas funções de atividade de acordo
com nossas necessidades.
E mais...
Nesta receita, usamos DurableOrchestrationClient, que compreende como iniciar
e terminar Orquestrações do Durable.
[ 230 ]
Capítulo 8
Preparação
Nesta receita, criaremos o gatilho de atividade denominado função ReadExcel_AT, que
lê os dados do blob armazenado na conta de armazenamento. Esse gatilho de atividade
executa os seguintes trabalhos:
Install-Package WindowsAzure.Storage
Install-Package EPPlus
[ 231 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
[ 232 ]
Capítulo 8
3. Por último, adicione uma cadeia de conexão (se ainda não tiver feito isso)
da conta de armazenamento ao arquivo local.settings.json, como
mostrado aqui:
employees.Add(new Employee()
{
EmpId = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
1].Value),
Name = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
2].Value),
Email = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
3].Value),
PhoneNumber = Convert.ToString(ExcelWorksheet.
Cells[EmployeeIndex, 4].Value)
});
}
}
return employees;
}
}
Se compilar o aplicativo agora, você não deve ver erros. Nós concluímos o
desenvolvimento das dependências para nossa primeira função de gatilho de atividade.
Agora, vamos começar a compilar o gatilho de atividade real.
[ 234 ]
Capítulo 8
log.LogInformation(“Orchestration started”);
StorageManager storageManager = new StorageManager();
Stream stream = null; ;
log.LogInformation(“Reading the Blob Started”);
stream = await storageManager.ReadBlob(name);
log.LogInformation(“Reading the Blob has Completed”);
EPPLusExcelManager ePPLusExcelManager = new EPPLusExcelManager();
log.LogInformation(“Reading the Excel Data Started”);
List<Employee> employees = ePPLusExcelManager.
ReadExcelData(stream);
log.LogInformation(“Reading the Blob has Completed”);
return employees;
}
[ 235 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
E mais...
A função do Orquestrador recebe a entrada usando o método GetInput() da classe
DurableOrchestratorContext. Essa entrada é passada pelo gatilho de blob usando
o método StartNewAsync da função da classe DurableOrchestrationClient.
[ 236 ]
Capítulo 8
Além disso, para reduzir custos, para cada serviço, é recomendável ter a capacidade
em um nível inferior e aumentá-la sempre que necessário. A API do Cosmos DB
nos permite controlar o número de RUs com base em nossas necessidades. Quando
precisarmos fazer uma importação em massa, aumentaremos as RUs antes de começar
a importar os dados. Depois que o processo de importação estiver concluído, poderemos
diminuir as RUs para o nível mínimo.
Preparação
Execute os seguintes pré-requisitos:
[ 237 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
Por uma questão de simplicidade, usei Fixa (10 GB) como a Capacidade
de armazenamento. No entanto, em cargas de produção, dependendo de seus
modelos de dados, você pode ter uma capacidade de armazenamento Ilimitada.
3. Execute o seguinte comando no gerenciador de pacotes NuGet para instalar
as dependências do Cosmos DB:
Install-Package Microsoft.Azure.WebJobs.Extensions.CosmosDB
[ 238 ]
Capítulo 8
using System.Linq;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
[ 239 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
3. Crie uma nova cadeia de conexão para o Cosmos DB, conforme mostrado
na captura de tela a seguir. Você pode copiar a conexão da folha de Chaves
da conta do Cosmos DB:
[ 240 ]
Capítulo 8
E mais...
A capacidade da coleção do Cosmos DB é representada como um recurso denominado
oferta. Nesta receita, recuperamos a oferta existente e a substituímos por uma nova
oferta. Saiba mais sobre isso em https://docs.microsoft.com/en-us/rest/api/
cosmos-db/offers.
[ 241 ]
Importação em massa de dados usando o Azure Durable Functions e o Cosmos DB
E mais...
A equipe do Cosmos DB lançou uma biblioteca chamada executor em massa do Cosmos
DB. Saiba mais sobre isso em https://docs.microsoft.com/en-us/azure/cosmos-
db/bulk-executor-overview.
Nesta receita, codifiquei o nome da coleção e o banco de dados para torná-lo simples.
Você terá que configurá-los no arquivo de configurações do aplicativo.
[ 242 ]
Implementação de práticas
recomendadas para o Azure
Functions
Neste capítulo, você aprenderá algumas das práticas recomendadas que podem ser
seguidas ao trabalhar com o Azure Functions, como as seguintes:
[ 243 ]
Implementação de práticas recomendadas para o Azure Functions
Aqui está um diagrama que descreve o fluxo de dados de diferentes aplicativos cliente
para a API Web de back-end:
Preparação
Estas são as etapas necessárias:
1. Criar uma conta de armazenamento usando o portal do Azure se você ainda não
tiver criado uma
2. Instalar o Gerenciador de Armazenamento da Microsoft de http://
storageexplorer.com/ se ainda não o tiver instalado
[ 244 ]
Capítulo 9
[ 245 ]
Implementação de práticas recomendadas para o Azure Functions
[ 246 ]
Capítulo 9
Como funciona...
Criamos uma nova função HTTP com um parâmetro do tipo iIAsyncCollector<cadeia
de caracteres>, que pode ser usado para armazenar várias mensagens em um serviço
de fila de uma vez e de forma assíncrona. Essa abordagem de armazenamento de vários itens
de forma assíncrona reduzirá a carga nas instâncias.
Por fim, testamos a invocação do gatilho HTTP do portal do Azure e também vimos
que as mensagens de fila são adicionadas usando o Gerenciador de Armazenamento
do Azure.
E mais...
Você também poderá usar a interface ICollector no lugar de IAsyncCollector
se quiser armazenar várias mensagens de forma síncrona.
[ 247 ]
Implementação de práticas recomendadas para o Azure Functions
Nesta receita, você aprenderá como o Azure Functions nos ajuda a lidar com esses tipos
de problemas com o mínimo de código.
Preparação
Estas são as etapas necessárias:
1. Criar uma conta de armazenamento usando o portal do Azure se você ainda não
tiver criado uma
2. Instalar o Gerenciador de Armazenamento do Azure de http://
storageexplorer.com/ se ainda não o tiver instalado
[ 249 ]
Implementação de práticas recomendadas para o Azure Functions
O gatilho da fila anterior registra em log uma mensagem com o conteúdo da fila
(é apenas um índice numérico) para as primeiras 50 mensagens e, em seguida, lança
uma exceção para todas as mensagens com conteúdo superior a 50.
3. Como mostrado aqui, você também deve ver uma nova fila denominada
myqueuemessages-poison (<NomeDaFilaOriginal>-Poison) com as outras
50 mensagens de fila nela. O Azure Function Runtime cuidará automaticamente
da criação de uma nova fila e da adição das mensagens que não são lidas
corretamente pelo Azure Functions:
[ 250 ]
Capítulo 9
Como funciona...
Criamos um aplicativo de console que cria mensagens no armazenamento de Filas
do Azure e também desenvolvemos um gatilho de fila capaz de ler as mensagens
na fila. Como parte da simulação de um erro inesperado, lançaremos um erro
se o valor no conteúdo da mensagem de fila for maior do que 50.
E mais...
Antes de enviar por push uma mensagem de fila para a fila de mensagens suspeitas,
o Azure Function Runtime faz cinco tentativas de escolher e processar a mensagem.
Você pode saber mais sobre o funcionamento desse processo ao adicionar um novo
parâmetro dequecount do tipo int ao método Run e registrar em log seu valor.
[ 251 ]
Implementação de práticas recomendadas para o Azure Functions
Preparação
Execute as seguintes etapas:
1. Crie um novo aplicativo de console que enviará eventos para o Hub de Eventos.
Eu o chamei de EventHubApp.
[ 253 ]
Implementação de práticas recomendadas para o Azure Functions
namespace EventHubApp
{
class EventHubHelper
{
static EventHubClient eventHubClient = null;
public static async Task GenerateEventHubMessages()
{
eventHubClient =
EventHubClient.CreateFromConnectionString
(conBuilder.ToString());
string strMessage = string.Empty;
for (int nEventIndex = 0; nEventIndex <= 100;
nEventIndex++)
{
strMessage = Convert.ToString(nEventIndex);
await eventHubClient.SendAsync(new EventData
(Encoding.UTF8.GetBytes(strMessage)));
Console.WriteLine(strMessage);
}
await eventHubClient.CloseAsync();
}
}
}
6. Em sua função main, coloque o código a seguir, que invoca o método para enviar
a mensagem:
namespace EventHubApp
[ 254 ]
Capítulo 9
{
class Program
{
static void Main(string[] args)
{
EventHubHelper.GenerateEventHubMessages().Wait();
}
}
}
7. Agora execute o aplicativo pressionando Ctrl + F5. Você deve ver algo
semelhante ao que é mostrado aqui:
[ 255 ]
Implementação de práticas recomendadas para o Azure Functions
Nesta receita, aprenderemos uma técnica que pode ser usada para manter a instância
sempre viva e quente para que todas as solicitações sejam atendidas corretamente.
Preparação
A fim de completar esta receita, precisamos ter um aplicativo de função com o seguinte:
Se você entendeu claramente o que é uma inicialização a frio, então ficará claro que não
é necessário se preocupar se o seu aplicativo tem tráfego regular durante o dia. Portanto,
se pudermos garantir que o aplicativo tenha tráfego durante todo o dia, a instância
do Azure Function não será desprovisionada e, portanto, não haveria nenhuma
preocupação sobre o plano de consumo.
[ 256 ]
Capítulo 9
[ 257 ]
Implementação de práticas recomendadas para o Azure Functions
E mais...
Se já conhece o Azure Functions, você poderá notar que as durações de inicialização
a frio para Azure Functions que têm C# como linguagem são de apenas alguns segundos.
No entanto, se você estiver trabalhando com Azure Functions que tenham o JavaScript
(como o Node.js) como linguagem, então a duração da inicialização a frio seria maior,
já que o tempo de execução precisaria fazer download de todos os pacotes npm que são
dependências para seu aplicativo. Nesses cenários, um recurso chamado Run-from-
Package vem a ser muito útil. Aprenderemos a implementar isso no próximo capítulo.
Consulte também
Consulte a receita Implantação do Azure Functions usando Executar de Pacote do Capítulo 10,
Configuração de aplicativos sem servidor no ambiente de produção.
Preparação
Presumo que você já saiba como criar uma função de gatilho HTTP. Faça download
da ferramenta Postman de https://www.getpostman.com/. A ferramenta Postman
é usada para enviar solicitações HTTP. Você também pode usar qualquer ferramenta
ou aplicativo que possa enviar solicitações e cabeçalhos HTTP.
[ 258 ]
Capítulo 9
1. Crie uma nova função de gatilho HTTP (ou abra uma função HTTP existente).
Ao criar a função, selecione Função como a opção na lista suspensa do nível
Autorização.
2. Na guia Editor de Código, escolha a URL da função clicando no link Obter URL
da Função disponível no canto direito do editor de código no arquivo run.csx.
3. Navegue até o Postman e cole a URL da função:
[ 259 ]
Implementação de práticas recomendadas para o Azure Functions
Como funciona...
Quando você faz uma solicitação via Postman ou qualquer outra ferramenta ou
aplicativo que possa enviar solicitações HTTP, a solicitação será recebida pelo aplicativo
Web do Serviço de Aplicativo do Azure subjacente (observe que o Azure Functions é
criado com base nos Serviços de Aplicativo) que primeiro verifica a presença do código
do nome do cabeçalho na coleção de cadeias de consulta ou no corpo da Solicitação.
Se encontrar, então ele validará o valor da cadeia de consulta de código com as teclas
de função. Se for válido, então ele autorizará a solicitação e permitirá que o tempo de
execução processe a solicitação. Caso contrário, ele gerará um erro com uma mensagem
401 Não Autorizado.
E mais...
Observe que a chave de segurança (na forma do parâmetro de cadeia de consulta
denominado code) no exemplo anterior é usada apenas para fins de demonstração.
Em cenários de produção, em vez de passar a chave como um parâmetro de cadeia
de consulta (o parâmetro code), você precisará adicionar a x-functions-key como
um cabeçalho HTTP, conforme mostrado na seguinte captura de tela:
[ 260 ]
Capítulo 9
Nesta receita, você aprenderá a trabalhar com teclas de função no Azure Functions.
Navegue até a guia Gerenciar do Azure Functions para exibir e gerenciar todas as chaves
relacionadas à função.
Por padrão, uma chave com o nome padrão é gerada para nós. Se você quiser gerar
uma nova chave, então clique no botão Adicionar nova tecla de função.
De uma maneira semelhante, você pode criar chaves diferentes para qualquer outro
aplicativo (como um aplicativo de IoT), dependendo de seus requisitos.
[ 261 ]
Implementação de práticas recomendadas para o Azure Functions
A ideia por trás de ter chaves diferentes para a mesma função é ter o controle sobre
as permissões de acesso para o uso das funções por aplicativos diferentes. Por exemplo,
se quiser revogar as permissões apenas para um aplicativo, mas não para todos
os aplicativos, você simplesmente excluirá (ou revogará) essa chave. Dessa forma,
você não afeta outros aplicativos que estejam usando a mesma função.
Crie dois aplicativos de gatilho HTTP, conforme mostrado na seguinte captura de tela:
[ 262 ]
Capítulo 9
Navegue até a guia Gerenciar de ambos os aplicativos, conforme mostrado nas capturas
de tela a seguir. Você observará que a chave mestra e as teclas host são as mesmas
em ambos os aplicativos:
Assim como no caso das teclas de função, você também pode criar
várias teclas host se seus aplicativos de função estiverem sendo usados
por vários aplicativos. Você pode controlar o acesso de cada um dos
aplicativos de função por aplicativos diferentes usando teclas diferentes.
Você pode criar várias teclas host seguindo as mesmas etapas que
seguiu ao criar as teclas de função regulares.
[ 263 ]
Implementação de práticas recomendadas para o Azure Functions
E mais...
Se achar que a tecla foi comprometida, então você pode regenerá-la a qualquer
momento clicando no botão Renovar. Observe que, quando você renovar uma tecla,
todos os aplicativos que acessam a função não funcionarão mais e isso geraria um erro
de código de status 401 Não Autorizado.
Você pode excluir ou revogar a tecla se ela não for mais usada em qualquer um dos
aplicativos.
Aqui está uma tabela com mais algumas diretrizes sobre as teclas:
[ 264 ]
Capítulo 9
Preparação
Nesta receita, para simplificarmos, usaremos o AD padrão criado quando você cria
uma conta do Azure. No entanto, em seus cenários de produção em tempo real, você
já teria um AD existente que precisa ser integrado. Eu recomendaria a leitura deste
artigo: https://docs.microsoft.com/azure/active-directory-b2c/active-
directory-b2c-tutorials-web-app.
[ 265 ]
Implementação de práticas recomendadas para o Azure Functions
É isso. Sem escrever uma única linha de código, terminamos a configuração de uma
instância do Azure AD que se baseia em uma camada de segurança e permite o acesso
somente a usuários autenticados. Em outras palavras, nós habilitamos o OAuth para
nosso aplicativo de função de back-end usando o Azure AD. Vamos testá-lo rapidamente
acessando qualquer um dos gatilhos HTTP que você tem no aplicativo de função. Eu usei
o Postman para fazer isso. Como esperado, você obterá um erro solicitando que efetue
logon.
Com as configurações atuais, nenhum dos aplicativos cliente externos poderá acessar
nossa API de back-end. A fim de fornecer acesso, precisamos executar as seguintes
etapas:
[ 266 ]
Capítulo 9
[ 267 ]
Implementação de práticas recomendadas para o Azure Functions
5. Na folha Configurações, clique no item de menu Chave para gerar uma chave
que será passada do Postman. A fim de gerar a chave, primeiro precisamos
fornecer uma Descrição e a Duração após a qual a chave deverá expirar.
Forneça os detalhes conforme mostrado na captura de tela a seguir e clique
no botão Salvar. A chave real é exibida para nós no campo de valor apenas
uma vez imediatamente depois de você clicar no botão Salvar, então copie-a
e a armazene em um lugar seguro. Nós a usaremos em alguns momentos:
[ 268 ]
Capítulo 9
[ 269 ]
Implementação de práticas recomendadas para o Azure Functions
°° Chave que você gerou para seu aplicativo cliente: você a anotou
na quarta etapa da seção Registro do aplicativo cliente no Azure AD.
°° Recurso: recurso ao qual precisamos de acesso. É a ID do cliente
do aplicativo de back-end; você a anotou na quarta etapa da seção
Configuração do Azure AD para o aplicativo de função.
2. Depois de ter todas essas informações, você precisará passar todos os parâmetros
e fazer uma chamada para um locatário do Azure AD, que retorna o token
de portador da seguinte maneira:
3. A etapa seguinte e final é fazer uma chamada para o back-end real (o gatilho
HTTP do Azure Function) passando o token JWT de portador (access_token)
que copiamos da tela anterior:
[ 270 ]
Capítulo 9
Nesta receita, aprenderemos a restringir os clientes ao acesso à API apenas uma vez
por minuto para um determinado endereço IP. A seguir, as etapas de alto nível que
acompanharemos:
[ 271 ]
Implementação de práticas recomendadas para o Azure Functions
Preparação
Para começar, precisamos criar um serviço de Gerenciamento de API do Azure
executando as seguintes etapas:
[ 272 ]
Capítulo 9
1. Navegue até a folha APIs da Instância de Gerenciamento de API que você criou
e clique no bloco Aplicativo de Função.
2. Você verá um pop-up Criar de Aplicativo de Função, onde poderá clicar
no botão Procurar, o que abrirá a barra lateral com o título Importar Azure
Functions, onde você pode configurar os aplicativos de função. Clique
no botão Definir Configuração Necessária para ver todos os aplicativos
de função que tenham gatilhos HTTP neles. Depois de selecionar o aplicativo
de função, clique no botão Selecionar.
[ 273 ]
Implementação de práticas recomendadas para o Azure Functions
3. A próxima etapa é escolher o gatilho HTTP que você gostaria de integrar com
o Gerenciamento de API do Azure. Depois de clicar no botão Selecionar, como
mencionado na etapa anterior, todos os gatilhos HTTP associados ao aplicativo
de função aparecerão, como mostrado na captura de tela a seguir. Eu escolhi
apenas um gatilho HTTP para simplificar:
[ 274 ]
Capítulo 9
5. Se tudo correr bem, você deverá obter uma captura de tela como a seguir. Agora,
terminamos a integração do Azure Functions com o Gerenciamento de API:
[ 275 ]
Implementação de práticas recomendadas para o Azure Functions
[ 276 ]
Capítulo 9
[ 277 ]
Implementação de práticas recomendadas para o Azure Functions
3. Agora clique imediatamente no botão Enviar outra vez. Como mostrado aqui,
você deve ver um erro, como nossa regra de política de entrada é permitir apenas
uma solicitação por minuto para um determinado endereço IP:
[ 278 ]
Capítulo 9
Como funciona...
Nesta receita, criamos uma instância de Gerenciamento de API do Azure e integramos
um Aplicativo de Função do Azure para aproveitar os recursos de Gerenciamento de
API. Uma vez integrados, nós criamos uma política de entrada que restringe os clientes
a apenas uma chamada por minuto de um determinado endereço IP. Aqui está um
diagrama de alto nível que retrata todo o processo:
[ 279 ]
Implementação de práticas recomendadas para o Azure Functions
Digamos que, por algum motivo, você altere a senha de uma conta, o que significa
que todos os aplicativos que usam essa conta não poderão obter acesso. Como um
desenvolvedor, não seria bom se houvesse uma instalação onde você não precisa se
preocupar com as credenciais e, em vez disso, a estrutura tomasse conta da autenticação?
Nesta receita, aprenderemos a acessar um Banco de Dados SQL de um Azure Function
sem fornecer uma ID do usuário ou senha usando um recurso chamado Identidade de
Serviço Gerenciada.
Preparação
Esta receita requer que criemos o Azure Functions (com o tempo de execução V1)
e o Banco de Dados SQL no mesmo grupo de recursos. Se você não os tiver criado,
faça isso e volte a esta receita para continuar. Aqui estão as etapas que executaremos
nesta receita:
[ 280 ]
Capítulo 9
con = new
SqlConnection("Server=tcp:dbserver.database.
windows.net,1433;Initial Catalog=database;Persist Security Info=Fa
[ 281 ]
Implementação de práticas recomendadas para o Azure Functions
lse;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertifi
cate=False;Connection Timeout=30;");
SqlCommand cmd = new SqlCommand(query, con);
con.AccessToken = (new
AzureServiceTokenProvider()).GetAccessTokenAsync("https://
database.windows.net/").Result;
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)
{
throw ex;
}
finally
{
if (con != null)
{
con.Close();
}
}
return req.CreateResponse(HttpStatusCode.OK, "Hello,
Successfully inserted the data");
}
[ 282 ]
Capítulo 9
3. Depois de garantir que não haja erros de build, publique o aplicativo de função
no Azure. Esta etapa garante a criação do aplicativo de função com o tempo
de execução V1. Clique no botão Publicar, que abre o pop-up como mostrado:
[ 283 ]
Implementação de práticas recomendadas para o Azure Functions
2. Você será solicitado a fornecer suas credenciais de conta do Azure para fazer
logon no portal do Azure. Depois de ter fornecido suas credenciais, ele mostrará
as assinaturas disponíveis no console de comando.
[ 284 ]
Capítulo 9
[ 285 ]
Implementação de práticas recomendadas para o Azure Functions
2. Vamos analisar o Banco de Dados SQL para ver se o registro foi inserido:
[ 286 ]
Capítulo 9
E mais...
Certifique-se de que você tenha todos os namespaces a seguir na classe:
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Data.SqlClient;
using System.Data;
using System;
using Microsoft.Azure.Services.AppAuthentication;
Consulte também
Consulte as interações do Banco de Dados SQL do Azure usando a receita do Azure Functions
do Capítulo 3, Integração perfeita do Azure Functions com Serviços do Azure.
[ 287 ]
Implementação de práticas recomendadas para o Azure Functions
2. Crie uma nova classe denominada Helper e cole o código a seguir no novo
arquivo de classe:
namespace Utilities
{
public class Helper
{
public static string GetReusableFunctionOutput()
{
return "This is an output from a Resuable Library
across functions";
}
}
}
[ 288 ]
Capítulo 9
5. Agora crie uma nova pasta bin clicando com o botão direito do mouse na área
vazia abaixo dos arquivos localizados em WWWROOT.
6. Depois de clicar no item Nova Pasta na tela obtida, uma nova caixa de texto será
exibida, onde você precisará fornecer o nome como bin.
7. Em seguida, clique com o botão direito do mouse na pasta bin e selecione a opção
Carregar Arquivos para carregar o arquivo .dll criado no Visual Studio
8. Esta é a sua aparência após o upload do arquivo .dll para a pasta bin:
[ 289 ]
Implementação de práticas recomendadas para o Azure Functions
12. Quando executar o aplicativo, você deverá ver a seguinte mensagem nos logs:
Como funciona...
Criamos um arquivo .dll que contém o código reutilizável que pode ser usado
em qualquer um dos Azure Functions que exigem a funcionalidade disponibilizada pelo
arquivo .dll.
Quando o arquivo .dll estiver pronto, criaremos uma pasta bin no aplicativo de função
e adicionamos o arquivo .dll à pasta bin.
[ 290 ]
Capítulo 9
E mais...
Se quiser usar o código compartilhado apenas em uma função, você precisará adicionar
a pasta bin junto com o arquivo .dll na pasta necessária do Azure Function.
Nesta receita, veremos como obter os detalhes do usuário da fila usando objetos
fortemente tipados.
Preparação
Antes de avançarmos, executaremos as seguintes etapas:
[ 291 ]
Implementação de práticas recomendadas para o Azure Functions
[ 292 ]
Capítulo 9
[ 293 ]
Implementação de práticas recomendadas para o Azure Functions
Como funciona...
Desenvolvemos uma nova função de fila que é acionada quando uma nova mensagem
é adicionada à fila. Nós criamos uma nova mensagem de fila com todos os detalhes
necessários para criar o usuário. Você pode reutilizar ainda mais o código do Azure
Function para passar o objeto de usuário (neste caso, myQueueItem) para a classe
de camada de banco de dados, que é capaz de inserir os dados em um banco de dados
ou em qualquer outro meio persistente.
E mais...
Nesta receita, o tipo do parâmetro de mensagem de fila que foi aceito pelo método Run
era User. O Azure Functions Runtime cuidará da desserialização da mensagem JSON
disponível na fila para o tipo personalizado; usuário, no nosso caso.
[ 294 ]
Configuração de aplicativos
sem servidor no ambiente
de produção
Neste capítulo, vamos aprender as seguintes receitas:
Introdução
Temos falado sobre todos os diferentes recursos do Azure Functions que ajudam
os desenvolvedores a criar rapidamente aplicativos de back-end. O foco deste
capítulo está nas configurações que o desenvolver precisa criar em um ambiente
de não desenvolvimento (como Preparo, UAT e produção).
[ 295 ]
Configuração de aplicativos sem servidor no ambiente de produção
Como você já deve estar ciente, cada aplicativo de função pode ter várias funções
hospedadas nele. Todos os códigos relacionados a essas funções serão localizados
na pasta D:\home\site\wwwroot:
Nesta receita, aprenderemos outra técnica nova, chamada Run From Package
(anteriormente chamada Run From Zip) para implantar o Azure Function como um pacote.
[ 296 ]
Capítulo 10
Usando Run From Package, podemos alterar o local padrão para uma conta
de armazenamento externo.
Preparação
Precisamos do seguinte para completar esta receita:
[ 297 ]
Configuração de aplicativos sem servidor no ambiente de produção
[ 298 ]
Capítulo 10
Como funciona...
Quando o tempo de execução do Azure Function localiza uma configuração de aplicativo
com o nome WEBSITE_RUN_FROM_PACKAGE, ele entende que deve procurar os pacotes
na conta de armazenamento. Portanto, em tempo real, o tempo de execução faz
download dos arquivos e usa-os para iniciar o aplicativo.
E mais...
Saiba mais sobre esta técnica e suas vantagens em https://github.com/Azure/app-
service-announcements/issues/84.
Preparação
Antes de começar a criar os modelos do ARM, precisamos entender os outros serviços
do Azure dos quais o Azure Function depende. Os seguintes serviços são criados
automaticamente quando você cria um aplicativo de função:
[ 299 ]
Configuração de aplicativos sem servidor no ambiente de produção
[ 300 ]
Capítulo 10
[ 301 ]
Configuração de aplicativos sem servidor no ambiente de produção
4. O modelo JSON necessário será criado no Visual Studio. Saiba mais sobre
o conteúdo JSON em https://docs.microsoft.com/azure/azure-
functions/functions-infrastructure-as-code.
5. Implante o ARM para provisionar o aplicativo de função e seus recursos
dependentes. Você pode implantá-lo clicando com o botão direito do mouse no
nome do projeto (em meu caso ARMTemplateforFunctionApp), em Implantar
e no botão Novo:
[ 302 ]
Capítulo 10
E mais...
Aqui estão algumas das vantagens de provisionar Recursos do Azure usando modelos ARM:
[ 303 ]
Configuração de aplicativos sem servidor no ambiente de produção
Preparação
Crie um domínio com qualquer um dos registradores de domínio. Você também
pode adquirir um domínio diretamente do portal usando o botão Comprar domínio,
que está disponível na folha Domínios Personalizados:
Depois que o domínio estiver pronto, crie os seguintes registros DNS usando
o registrador de domínio:
• Registro A
• Registro CName
[ 304 ]
Capítulo 10
[ 305 ]
Configuração de aplicativos sem servidor no ambiente de produção
[ 306 ]
Capítulo 10
[ 307 ]
Configuração de aplicativos sem servidor no ambiente de produção
Não importa qualquer seja o uso do valor de configuração, você precisa ter um lugar
para armazená-los que seja acessível a seu aplicativo.
Preparação
Crie um Azure Function com o tempo de execução da Função V2, se ainda não tiver
sido criado. Eu usarei o aplicativo de função que criamos no Capítulo 4, Noções básicas
sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio.
[ 308 ]
Capítulo 10
[ 309 ]
Configuração de aplicativos sem servidor no ambiente de produção
5. Execute a função clicando no botão Executar, que registra a saída na janela Saída:
[ 310 ]
Capítulo 10
1. Abra o Visual Studio e faça alterações no método Run para adicionar um novo
parâmetro para configuração do QueueTrigger:
[ 311 ]
Configuração de aplicativos sem servidor no ambiente de produção
Preparação
Crie uma função e um ou mais gatilhos HTTP. Para simplificar, criei um aplicativo
de função e um gatilho de HTTP, que aceita apenas os métodos Get.
Verifique se o aplicativo de função do Azure está configurado para apontar para a versão
1 do tempo de execução, como mostrado nas Configurações de Aplicativo:
[ 312 ]
Capítulo 10
2. Na guia Definição de API, clique na opção Função (versão prévia) para permitir
a fonte da definição de API:
3. Assim que você clicar no botão Função (versão prévia), o recurso será habilitado.
No entanto, você pode ver um erro na nova guia que é aberta. Não se preocupe,
como o recurso ainda está em visualização, a Microsoft pode corrigi-lo antes que
ele esteja disponível de forma geral (GA). Em seguida, clique em Gerar modelo
de definição de API:
[ 313 ]
Configuração de aplicativos sem servidor no ambiente de produção
[ 314 ]
Capítulo 10
8. Ela também nos permite executar alguns testes. Clique no botão Tentar esta
operação que é mostrado na captura de tela anterior. Ele abre uma janela onde
você pode fornecer entrada:
[ 315 ]
Configuração de aplicativos sem servidor no ambiente de produção
Preparação
Nesta receita, estaremos implementando a seguinte arquitetura:
[ 316 ]
Capítulo 10
Vamos supor que estamos trabalhando para um portal de comércio eletrônico onde
temos apenas três módulos (homens, mulheres e crianças) e nosso objetivo é criar as
APIs de back-end em uma arquitetura de microsserviço, em que cada microsserviço
é independente dos outros.
[ 317 ]
Configuração de aplicativos sem servidor no ambiente de produção
Criação de microsserviços
Execute as seguintes etapas:
1. Crie três aplicativos de função para cada um dos microsserviços que planejamos:
[ 318 ]
Capítulo 10
[ 319 ]
Configuração de aplicativos sem servidor no ambiente de produção
3. Crie os proxies para women e kids. Aqui estão os detalhes de todos os três
proxies. Observe que as URLs de back-end (dos aplicativos de função) podem
ser diferentes no seu caso:
Nome do Modelo URL de back-end (as URLs dos gatilhos HTTP criadas na
proxy de rota etapa anterior)
Homens /Men https://azurefunctioncookbook-men.
azurewebsites.net/api/Men-HttpTrigger
Mulheres /Women https://azurefunctioncookbook-women.
azurewebsites.netapi/Women-HttpTrigger
Crianças /Kids https://azurefunctioncookbook-kids.
azurewebsites.netapi/Kids-HttpTrigger
4. Depois de criar os três proxies, a lista deverá ficar mais ou menos assim:
• https://azurefunctioncookbook-gateway.azurewebsites.net/Men
• https://azurefunctioncookbook-gateway.azurewebsites.net/Women
• https://azurefunctioncookbook-gateway.azurewebsites.net/Kids
[ 320 ]
Capítulo 10
• Homens:
• Mulheres:
• Crianças:
Observe as URLs das três capturas de tela. Você observará que parece que elas são
fornecidas de um único aplicativo com rotas diferentes. No entanto, elas são três
microsserviços diferentes que podem ser gerenciados individualmente.
E mais...
Todos os microsserviços que criamos nesta receita são anônimos, o que significa que eles
são acessíveis publicamente a todos. Para torná-los seguros, você precisa seguir qualquer
uma das abordagens recomendadas no Capítulo 9, Implementação de práticas recomendadas
para o Azure Functions.
[ 321 ]
Configuração de aplicativos sem servidor no ambiente de produção
Consulte também
• A receita Controle de acesso ao Azure Functions usando teclas de função do Capítulo 9,
Implementação de práticas recomendadas para o Azure Functions
• A receita Proteção do Azure Functions usando o Azure AD do Capítulo 9,
Implementação de práticas recomendadas para o Azure Functions
• A receita Configuração da limitação do Azure Functions usando o Gerenciamento de
API no Capítulo 9, Implementação de práticas recomendadas para o Azure Functions
No mundo de PaaS do Azure, com Serviços de Aplicativos do Azure, você ainda pode
ter os arquivos Web.Config e eles funcionam como costumavam no mundo tradicional
da infraestrutura local. No entanto, o Serviço de Aplicativo do Azure oferece um
recurso adicional no que diz respeito às configurações de aplicativo, no qual você pode
definir essas configurações (manualmente ou por meio de modelos ARM) e elas são
armazenadas em um formato criptografado. Porém, você poderá exibi-las como texto
normal no portal se tiver acesso.
[ 322 ]
Capítulo 10
Preparação
Execute as seguintes etapas:
[ 323 ]
Configuração de aplicativos sem servidor no ambiente de produção
[ 324 ]
Capítulo 10
3. Clique no elemento config, como mostrado na captura de tela anterior, que abre
todos os itens relacionados às configurações:
[ 325 ]
Configuração de aplicativos sem servidor no ambiente de produção
[ 326 ]
Capítulo 10
[ 327 ]
Como implementar e implantar
a integração contínua usando
o Azure DevOps
Neste capítulo, você aprenderá a:
Introdução
Como um profissional de software, você já deve estar ciente das diferentes metodologias
de desenvolvimento de software que as pessoas praticam. Independentemente da
metodologia que está sendo seguida, existem vários ambientes, como desenvolvimento,
preparo e produção, onde o ciclo de vida do aplicativo precisa ser seguido com estes
estágios críticos relacionados ao desenvolvimento:
[ 329 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
Para cada alteração que você faz no software, precisamos compilar e implantar o
aplicativo em vários ambientes e, neste caso, diferentes equipes podem ser responsáveis
para liberar os builds para ambientes distintos. Como diferentes ambientes e equipes
estão envolvidos, considerando a quantidade de tempo gasto na execução dos builds,
implantá-los em diferentes ambientes dependerá mais dos processos que as diferentes
equipes seguem.
Pré-requisitos
Crie o seguinte, se você ainda não fez isso:
[ 330 ]
Capítulo 11
[ 331 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
Preparação
Execute os seguintes pré-requisitos:
[ 332 ]
Capítulo 11
[ 333 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
3. Você será levado para a tela Selecione seu repositório, em que você pode
escolher seu repositório. Para este exemplo, o meu se originou no TFVC. Como
mostrado a seguir, selecione TFVC e clique em Continuar. Verifique se você
escolheu seu projeto, que no meu caso é AzureServerlessCookBook:
4. Você será levado para a etapa Selecione um modelo, em que pode escolher o
modelo requerido para o seu aplicativo. Para esta receita, escolheremos Função
C#, como mostrado na captura de tela a seguir, clicando no botão Aplicar:
[ 334 ]
Capítulo 11
[ 335 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
[ 336 ]
Capítulo 11
Como funciona...
Uma definição de build é apenas um plano gráfico das tarefas que são necessárias
para a compilação de um aplicativo de software. Nesta receita, usamos um modelo
padrão para criar a definição de build. Podemos escolher um modelo em branco e criar
a definição escolhendo as tarefas disponíveis no Azure DevOps também.
Você pode aprender sobre todos os diferentes tipos de variáveis na guia Variáveis
mostrada aqui:
[ 337 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
E mais...
• O Azure DevOps fornece muitas tarefas. Você pode escolher uma nova tarefa
para o modelo clicando no botão Adicionar tarefa (+), conforme mostrado
na captura de tela a seguir:
• Se não encontrar uma tarefa que atenda às suas necessidades, você poderá
procurar uma adequada no Marketplace, clicando no botão Marketplace
mostrado na captura de tela anterior.
• A função C# tem o conjunto correto de tarefas necessárias para configurar
a definição de build para o Azure Functions também.
Preparação
Antes de começar, verifique o seguinte:
[ 338 ]
Capítulo 11
[ 339 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
[ 340 ]
Capítulo 11
6. Se você quiser ver a saída do build, clique no botão Artefatos realçado na captura
de tela a seguir. Você pode fazer download dos arquivos clicando no botão
Download como mostrado aqui:
Nesta receita, você aprenderá como configurar a integração contínua no Azure DevOps
para seu projeto de equipe, bem como acionar a compilação automatizada fazendo uma
alteração no código do gatilho de HTTP Azure Function que criamos no Capítulo 4,
Noções básicas sobre a experiência integrada de desenvolvedor de Ferramentas do Visual Studio.
[ 341 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
[ 342 ]
Capítulo 11
5. Vamos navegar para o projeto do Azure Function no Visual Studio. Faça uma
pequena alteração na última linha do código-fonte da função Run que é mostrado
a seguir. Eu apenas substitui a palavra hello por Automated Build Trigger
test by:
return name != null ? (ActionResult)new OkObjectResult($"Automated
Build Trigger test by, { name}")
: new BadRequestObjectResult("Please pass a name on the
query string or in the request body");
[ 343 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
Como funciona...
Estas são as etapas seguidas nesta receita:
E mais...
Se você quiser restringir para que os desenvolvedores verifiquem o código somente após
uma compilação bem-sucedida, será necessário habilitar gated-check-in. Para habilitar
isso, edite a definição de build e navegue para a guia Gatilhos e Habilitar check-in
restrito, conforme mostrado na seguinte captura de tela:
Agora, volte para o Visual Studio e faça algumas alterações no código. Se você tentar
fazer check-in do código sem compilar o aplicativo no Visual Studio, receberá um alerta,
conforme mostrado aqui:
[ 344 ]
Capítulo 11
[ 345 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
[ 346 ]
Capítulo 11
4. É isso. Vamos agora colocar o build em fila clicando no botão Enfileirar depois
de salvar as alterações. Depois de alguns minutos, o pipeline de build é aprovado
sem nenhum aviso, conforme mostrado na seguinte captura de tela:
[ 347 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
5. Aqui está o resumo dos casos de teste. Você pode ver o gráfico que mostra
a porcentagem dos casos de teste que foram aprovados e reprovados:
E mais...
Se você seguiu todas as convenções de nomenclatura de acordo com as instruções,
não enfrentará problemas com esta receita. No entanto, se você tiver usado um nome
diferente para o projeto de unidade e se não tiver usado a palavra test em nenhum
lugar no nome do projeto (que é o mesmo nome do arquivo .dll gerado), sinta-se
à vontade para alterar o formato na seguinte configuração:
**\$(BuildConfiguration)\**\*whateverwordyouhaveinthenameofthedllfi
le*.dll
[ 348 ]
Capítulo 11
Preparação
Usei o novo editor de definição da versão para visualizar os pipelines de implantação.
O editor de definição da versão ainda está em visualização. No momento em que você
ler isso, se ele ainda estiver em visualização, você poderá habilitá-lo clicando na imagem
do perfil e, em seguida, clicando no link Recursos de visualização, como mostrado
na seguinte captura de tela:
[ 349 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
[ 350 ]
Capítulo 11
[ 351 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
[ 352 ]
Capítulo 11
7. Você será levado para a guia Tarefas, mostrada a seguir. Forneça um nome
significativo para o campo Nome do estágio. Eu forneci o nome Ambiente
de Preparo para este exemplo. Em seguida, escolha a assinatura do Azure
na qual você gostaria de implantar o Azure Function. Será necessário clicar
no botão Autorizar para fornecer as permissões, como mostrado aqui:
[ 353 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
9. Clique no botão Salvar para salvar as alterações. Agora, vamos usar esta
definição da versão e tentar criar uma nova versão clicando em Criar versão,
como mostrado na seguinte captura de tela:
[ 354 ]
Capítulo 11
10. Em seguida, você será levado para a janela pop-up Criar uma nova versão, em
que poderá configurar a definição de build que precisa ser usada. Como temos
apenas uma, podemos ver apenas uma definição de build. Você também precisa
escolher a versão certa do build, como mostrado aqui. Depois de revisá-la, clique
no botão Criar para colocar a versão na fila:
[ 355 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
11. Clicar no botão Criar na etapa anterior levará você para a etapa a seguir. Clique
no botão Implantar preparo como mostrado aqui para iniciar o processo
de implantação da versão:
12. Agora, será solicitado que você revise os artefatos associados. Depois de revisá-
los, clique no botão Implantar, como mostrado aqui:
[ 356 ]
Capítulo 11
[ 357 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
14. Clique nos links Em andamento mostrados na captura de tela anterior para
revisar o andamento. Como mostrado a seguir, o processo de versão foi
bem-sucedido:
Como funciona...
Na guia Pipeline, criamos artefatos e um ambiente denominado preparo e os vinculamos
juntos.
E mais...
Se você estiver configurando a implantação contínua pela primeira vez, poderá ver um
botão com o Autorizar na etapa de Implantação do Serviço de Aplicativo do Azure.
Clicar no botão Autorizar abrirá uma janela pop-up em que será solicitado que você
forneça suas credenciais do portal de Gerenciamento do Azure.
Você pode renomear o pipeline de versão clicando no nome na parte superior, como
mostrado aqui:
[ 358 ]
Capítulo 11
Consulte também
A receita Implantação do aplicativo Azure Functions para a Nuvem do Azure usando o Visual
Studio do Capítulo 4, Noções básicas sobre a experiência integrada de desenvolvedor de
Ferramentas do Visual Studio.
[ 359 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
Preparação
Faça download e instale a ferramenta Postman, se ainda não tiver instalado.
[ 360 ]
Capítulo 11
[ 361 ]
Como implementar e implantar a integração contínua usando o Azure DevOps
5. Navegue para a guia Versões depois que a compilação for concluída para
ver se uma nova versão foi acionada automaticamente, conforme mostrado
na captura de tela a seguir:
6. Depois que o processo de versão for concluído, você poderá revisar a alteração
fazendo uma solicitação ao Gatilho HTTP usando a ferramenta Postman:
Como funciona...
Na guia Pipeline, habilitamos o Gatilho de implantação contínua.
E mais...
Você também pode criar vários ambientes e configurar as definições para liberar os builds
requeridos para esses ambientes.
[ 362 ]
Outros livros que você pode gostar
Se você gostou deste livro, você pode se interessar por estes outros livros da Packt:
[ 363 ]
Outros livros que você pode gostar
Frederik Vos
ISBN: 978-1-78913-096-6
ff Entender por que o Azure é a solução ideal para seus workloads de open source
ff Dominar habilidades essenciais do Linux e aprender a descobrir o seu caminho
no ambiente Linux
ff Implantar o Linux em um ambiente do Azure
ff Usar o gerenciamento de configuração para gerenciar o Linux no Azure
ff Gerenciar contêineres em um ambiente do Azure
ff Melhorar a segurança do Linux e usar os sistemas de gerenciamento
de identidade do Azure
ff Automatizar a implantação com o Azure Resource Manager (ARM)
e o PowerShell
ff Usar o Ansible para gerenciar instâncias do Linux em um ambiente de nuvem
do Azure
[ 364 ]
Outros livros que você pode gostar
[ 365 ]