.NET Core + Serverless: implementando jobs com Azure Functions e o VS Code

Renato Groffe
7 min readOct 28, 2019

--

Um equívoco bastante comum em cloud computing é considerar que a implementação de soluções Serverless esteja limitada à construção de APIs REST. No caso específico das Azure Functions, este tipo desenvolvimento faria uso de HTTP Triggers.

Contudo, esta não é a única opção disponível ao trabalharmos com esta tecnologia (felizmente!). Triggers de execução periódica (Timer Trigger), baseadas em mensageria (Queue, Service Bus Queue e Service Bus Topic Triggers) e atreladas a atualizações em uma base do Cosmos DB estão entre as possibilidades oferecidas via Microsoft Azure.

Tal fato aumenta o escopo de utilização das Azure Functions, ao mesmo tempo que constitui uma escolha que prioriza uma rápida entrega de soluções e descarta as preocupações envolvendo diferentes aspectos de infraestrutura como: a criação de VMs, configurações destes ambientes, instalação de componentes necessários à execução das aplicações….

Neste novo artigo demonstrarei a implementação de um job/rotina de processamento disparado periodicamente e empregando Azure Functions + Timer Trigger, .NET Core e o Visual Studio Code. A função em questão irá checar se uma base de dados se encontra no ar, logando o resultado disto em uma Table Storage e na eventualidade de um problema enviando um alerta para um canal do Slack via Azure Logic App. Num segundo post detalharei a publicação deste projeto no Microsoft Azure.

Caso queira conhecer mais sobre Azure Functions já abordei este tema anteriormente no seguinte artigo:

Desenvolvimento Serverless com .NET Core: implementando sua primeira Azure Function

E aproveito este espaço também para um convite…

Que tal aprender mais sobre Azure Functions e desenvolvimento de soluções Serverless, em um workshop que acontecerá durante um sábado (dia 18/01/2020) em São Paulo Capital e implementando um case na prática? Acesse então o link a seguir para efetuar sua inscrição com um desconto especial: http://bit.ly/aznp-devops-blog-groffe

Detalhes do ambiente utilizado para Desenvolvimento

A criação do projeto descrito neste artigo acontecerá dentro de um diretório chamado ServerlessMonitorBD. Acionar então neste local o Visual Studio Code através da instrução code . (no exemplo a seguir foi utilizado o PowerShell, mas tal procedimento aconteceria de maneira idêntica utilizando Bash e uma distribuição Linux como Ubuntu Desktop):

Será preciso que no Visual Studio Code esteja instalada a extensão Azure Functions:

Outros complementos necessários para a emulação deste serviço do Azure num ambiente de desenvolvimento são o Microsoft Azure Storage Emulator e as Azure Functions Core Tools. Maiores informações sobre estas ferramentas podem ser encontradas nos links a seguir:

Use the Azure storage emulator for development and testing

Work with Azure Functions Core Tools

Simulando o endpoint da Azure Logic App de integração com o Slack

Para efeitos de desenvolvimento e testes esse artigo simulará o comportamento da Azure Logic App empregada na integração com o Slack, a partir de uma requisição HTTP do tipo POST (a geração do recurso real acontecerá no segundo post). Como tal recurso será exposto como um endpoint de uma API REST, temos a possibilidade de “mockar” gratuitamente essa estrutura via portal Mockable.io:

https://www.mockable.io/

Na imagem a seguir está destacado em vermelho o botão + REST Mock do Mockable; acionar essa opção para prosseguir com a criação do mock:

Em REST MOCK preencher as seguintes configurações:

  • No campo Path informar o caminho relativo logicapp-alertabd;
  • Em Verb selecionar POST;
  • Em Response status escolher 202 — Accepted;
  • Manter selecionadas as opções application/json e UTF-8 em Content-Type e Content-Encoding, respectivamente.

Fornecer então uma descrição detalhando o objetivo do mock em Description:

E finalmente acionar o botão Save:

Neste momento o mock gerado para testes terá seu status como Stopped:

Acionando o botão Stopped o mesmo entrará em execução (status Started):

Consultando o mock teremos acesso aos endpoints gerados para testes com o mesmo (com e sem HTTPS):

Um teste via Postman mostrará que o mock gerado possui o comportamento esperado, gerando uma resposta do tipo 202 — Accepted quando do envio de uma requisição HTTP do tipo POST:

Implementando um processo por meio de um Timer Trigger

Acessar agora o ícone do Microsoft Azure; será a partir desta opção que acontecerá a criação de novas Function Apps e Azure Functions por meio do VS Code:

Em FUNCTIONS acionar a opção Create New Project… (um ícone representado por uma pasta e um raio):

Neste momento será solicitado o diretório que servirá de base para a geração do Function App; o projeto em questão assumirá o nome desta pasta (neste exemplo ServerlessMonitorBD):

Definir na sequência linguagem (C#) a ser utilizada para a implementação de Azure Functions:

A escolha de um template também será solicitada para a criação de uma primeira Azure Function; acionar para isto a opção TimerTrigger:

E uma cron expression, a fim de determinar a periodicidade de execução da função DBCheckTimerTrigger. Para este exemplo será utilizada a expressão a seguir, a qual fará com que a Azure Function seja disparada a cada 30 segundos:

*/30 * * * * *

Maiores informações sobre a montagem de cron expressions (um padrão originário de ambientes UNIX) podem ser encontradas na Wikipedia:

Será solicitado ainda a utilização de uma storage account; para este exemplo selecionar a opção Use local emulator:

Passados alguns segundos serão gerados o projeto ServerlessMonitorBD e seus diversos arquivos:

No arquivo local.settings.json deverão ser incluídas as seguintes definições:

  • A string de conexão BaseIndicadores, que aponta para uma base do SQL Server (local neste primeiro momento);
  • A string de conexão ConexaoLog, a qual fará uso inicialmente do Storage local;
  • O endpoint UrlLogicAppAlerta, que conterá o endereço para envio de dados à Logic App (neste primeiro instante será empregado o mock gerado via Mockable.io).

Adicionar também ao projeto ServerlessMonitorBD uma referência para o package System.Data.SqlClient (neste caso optei pela versão estável 4.6.0):

A classe LogEntity herda do tipo TableEntity (namespace Microsoft.WindowsAzure.Storage.Table) e representa os dados de log a serem gravados no Table Storage:

  • A propriedade PartitionKey conterá o identificador da base de dados SQL Server;
  • Na propriedade RowKey estará preenchido o horário da checagem;
  • A propriedade Status indicará se a verificação teve ou não sucesso;
  • Já a propriedade DescricaoErro conterá eventualmente dados de uma exceção que pode ter sido gerada devido à indisponibilidade da base SQL Server.

E por fim temos a implementação da classe DBCheckTimerTrigger e seu método Run:

  • O objeto do tipo ILogger (namespace Microsoft.Extensions.Logging) servirá de base para o print de informações em tela indicando o status da análise;
  • As configurações especificadas em local.settings.json serão acessadas por meio do método GetEnvironmentVariable da classe Environment (namespace System);
  • A conexão com o Table Storage do Azure se dá por meio de uma instância do tipo CloudStorageAccount (linha 23), a qual fará uso da string de conexão indicada em BaseLog;
  • Uma instância da classe CloudTable será gerada na linha 25. Caso LogTable ainda não exista a tabela correspondente será criada no Storage (linha 28);
  • O teste de conexão acontecerá a partir da linha 33. A instância de LogEntity gerada na linha 31 será preenchida com os resultados desta verificação;
  • O resultado desta checagem poderá indicar sucesso ou erro, com o mesmo sendo impresso em tela nas linhas 56 ou 59. A partir da linha 61 ocorrerá o envio de uma notificação de problema para a Logic App no Azure, empregando para isto uma instância de HttpClient (namespace System.Net.Http).

Testes

Os testes descritos nesta seção serão conduzidos a partir da execução do projeto ServerlessMonitorBD no Visual Studio Code:

Os primeiros testes serão executados com servidor SQL Server fora do ar, o que resultará em falhas:

Com o SQL Server em execução os resultados finalmente serão satisfatórios:

Consultando os dados via Microsoft Azure Storage Explorer teremos registros indicando falhas e sucessos no acesso a BaseIndicadores:

Recentemente aconteceu também uma live no Canal .NET sobre a implementação de soluções Serverless empregando Azure Functions. A gravação está disponível no YouTube e pode ser assistida gratuitamente por todos aqueles interessados em conhecer mais sobre as tecnologias mencionadas neste artigo:

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

No responses yet