.NET Core + Serverless: implementando jobs com Azure Functions e o VS Code
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:
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:
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: