Criando um CRUD Serverless com Azure Functions – Parte 2

Olá pessoal, tudo bem?

Seguindo a nossa série em que vamos criar um CRUD Serverless com Azure Functions, hoje desenvolveremos a parte de edição e de exclusão do nosso registro.

Primeiramente vamos trabalhar na edição, e portanto, começaremos criando nossa Function através do comando abaixo:

func new

Feito isso, como já é sabido, aparecerão diversas opções de Azure Functions, cada uma para um propósito diferente, e no nosso caso escolheremos o tipo HttpTrigger e então nós daremos a ela o nome de EditPerson.

Abra o arquivo criado (EditPerson.cs) e vamos altera-lo com o código abaixo:

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "put", Route = null)]HttpRequest req,
    [Queue("EditPerson", Connection = "AzureWebJobsStorage")]IAsyncCollector<string> queueItem,
    ILogger log)
{
    log.LogInformation("EditPerson function started a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    await queueItem.AddAsync(requestBody);

    log.LogInformation("EditPerson function finished a request.");

    return new OkObjectResult($"Obrigado! Seu registro já esta sendo processado.");
}

Observe que o código não é muito diferente do código da nossa HttpTrigger que criamos na parte 1 do nosso post.

Dica: Observe que na chamada da nossa HttpTrigger existe uma propriedade chamada Route, ela serve para customizarmos a rota da nossa Function caso você queira, do contrário o padrão será sempre o nome da sua HttpTrigger.

Vamos agora executar nosso Function App utilizando o comando abaixo:

func start

Note que agora nós temos dois endpointsCreatePerson: [POST] http://localhost:7071/api/CreatePerson e EditPerson: [PUT] http://localhost:7071/api/EditPerson e com isso já é possível testar nossa função de edição (para isso recomendo utilizar um Client REST da sua preferência), porém dessa vez precisaremos passar além das propriedades Name e Email as propriedades para encontrar o registro em si e elas são a PartitionKey e o RowKey. Com isso seu body deve ficar muito parecido com que se encontra logo abaixo:

{
	"name": "Blog do Ericson - Edit",
	"email": "ericson@email.com",
        "partitionKey": "Person",
        "rowKey": "<GUID_DO_REGISTRO>"
}

Feito isso abra a ferramenta Microsoft Azure Storage Explorer e localize dentro de Storage Account o serviços de Queues e abrindo-o note que foi criada uma Queue chamada EditPerson. Abra a mesma e note que o body que passamos para o nosso endpoint estará armazenado na fila.

Agora nosso próximo passo, assim como na parte 1 do nosso post, será o de desenfileirar a mensagem e salva-la no nosso banco de dados e para isso vamos criar nossa próxima Azure Function, e para isso, novamente vamos utilizar o comando abaixo:

func new

Dessa vez escolheremos o tipo QueueTrigger e colocaremos o nome dela de EditPersonQueue e em seguida, vamos altera-la com o código abaixo:

public static void Run(
    [QueueTrigger("EditPerson", Connection = "AzureWebJobsStorage")]string queueItem,
    [Table("Person")]CloudTable cloudTable,
    ILogger log)
{
    log.LogInformation($"EditPersonQueue trigger function started.");

    var data = JsonConvert.DeserializeObject<Person>(queueItem);

    var tableOperation = TableOperation.InsertOrReplace(data);
    cloudTable.ExecuteAsync(tableOperation);

    log.LogInformation($"EditPersonQueue trigger function finished.");
}

Note que novamente não há muita mudança em relação nossa Queue Trigger criada no post anterior.

Com isso vamos executar nosso Function App novamente através do comando:

func start

E então abra novamente o Microsoft Azure Storage Explorer e note que a mensagem sumiu da fila EditPerson, e agora o registro encontra-se editado na nossa tabela Person.

Agora que a edição esta finalizada e funcionando perfeitamente, vamos para o próximo passo que é o de excluir o nosso registro, e para isso vamos novamente criar mais uma função através do comando abaixo:

func new

Novamente, escolha o tipo HttpTrigger e então nós daremos a ela o nome de DeletePerson.

Abra o arquivo criado (DeletePerson.cs) e vamos altera-lo com o código abaixo:

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "delete", Route = null)]HttpRequest req,
    [Queue("DeletePerson", Connection = "AzureWebJobsStorage")]IAsyncCollector<string> queueItem,
    ILogger log)
{
    log.LogInformation("DeletPerson function started a request.");

    await queueItem.AddAsync(
        JsonConvert.SerializeObject(
            new Person
            {
                PartitionKey = "Person",
                RowKey = req.Query["id"]
            }
        )
    );

    log.LogInformation("DeletePerson function finished a request.");

    return new OkObjectResult($"Obrigado! Seu registro já esta sendo processado.");
}

Observe que agora nossa HttpTrigger, ao contrario das criadas anteriormente, espera como body apenas o Partition Key (coloquei ele já direto no código, mas você pode passa-lo como parâmetro caso queira) e o RowKey que será passado via QueryString sob o parâmetro de nome id.

Vamos agora executar nosso Function App utilizando o comando abaixo:

func start

Note que agora nós temos três endpointsDeletePerson: [DELETE] http://localhost:7071/api/DeletePerson, CreatePerson: [POST] http://localhost:7071/api/CreatePerson e EditPerson: [PUT] http://localhost:7071/api/EditPerson e com isso já é possível testar nossa função de exclusão (para isso recomendo utilizar um Client REST da sua preferência), porém dessa vez conforme precisaremos apenas do RowKey e com isso sua QueryString deve ficar muito parecido com que se encontra logo abaixo:

http://localhost:7071/api/DeletePerson?id=<GUID_DO_REGISTRO>

Feito isso abra a ferramenta Microsoft Azure Storage Explorer e localize dentro de Storage Account o serviços de Queues e abrindo-o note que foi criada uma Queue chamada DeletePerson. Abra a mesma e note que o body que passamos para o nosso endpoint estará armazenado na fila.

Agora nosso próximo passo, assim como na parte 1 do nosso post, será o de desenfileirar a mensagem e salva-la no nosso banco de dados e para isso vamos criar nossa próxima Azure Function, e para isso, novamente vamos utilizar o comando abaixo:

func new

Dessa vez escolheremos o tipo QueueTrigger e colocaremos o nome dela de DeletePersonQueue e em seguida, vamos altera-la com o código abaixo:

public static void Run(
    [QueueTrigger("DeletePerson", Connection = "AzureWebJobsStorage")]string queueItem,
    [Table("Person")]CloudTable cloudTable,
    ILogger log)
{
    log.LogInformation($"DeletePersonQueue trigger function started.");

    var data = JsonConvert.DeserializeObject<Person>(queueItem);

    var person = new DynamicTableEntity(data?.PartitionKey, data?.RowKey);
    person.ETag = "*";

    var tableOperation = TableOperation.Delete(person);
    cloudTable.ExecuteAsync(tableOperation);

    log.LogInformation($"DeletePersonQueue trigger function finished.");
}

Note que dessa vez houve uma certa mudança em relação nossa Queue Trigger criada no post anterior.

Aqui nos primeiros temos que recuperar o registro da nossa Table Person, baseando-se na PartitionKey e no RowKey antes de mais nada e na sequência setar a propriedade ETag. Falando rapidamente sobre essa propriedade, ela consegue atuar no caso de concorrência de alterações de um registro, como aqui eu quero excluir o mesmo eu estou setando com o * e isso significa que eu estou dizendo para o Tables não se preocupar em monitorar essa exclusão.

Com isso vamos executar nosso Function App novamente através do comando:

func start

E então abra novamente o Microsoft Azure Storage Explorer e note que a mensagem sumiu da fila DeletePerson, e agora o registro também não existe mais na nossa tabela Person.

Bom pessoal, e com isso finalizamos a segunda parte do nosso CRUD Serverless em que editamos e excluímos o nosso registro. No nosso próximo post vamos trabalhar na exibição dos registros já cadastrados e na publicação do nosso Function App no Azure.

E para finalizar deixo aqui um convite.

Que tal aprender mais sobre Docker, Kubernetes e a implementação de soluções baseadas em containers utilizando o Microsoft Azure, em um workshop que acontecerá durante um sábado todo (dia 04/04) em São Paulo Capital e implementando um case na prática?

Acesse então o link a seguir para efetuar sua inscrição (já incluso camiseta, emissão de certificado e almoço para os participantes) com o desconto: http://bit.ly/anp-docker-blog-ericson

Até mais pessoal.

Abraços e Obrigado!

Criando um CRUD Serverless com Azure Functions – Parte 1

Olá pessoal tudo bem?

Iniciaremos através deste post uma série sobre como montar um CRUD completo utilizando a última versão (3) do Azure Functions.

Importante: Para concluirmos o CRUD de maneira satisfatória, vamos precisar instalar as seguintes ferramentas:

No Visual Studio Code recomendo fortemente instalar a extensão do Azure Functions, pois ela vai nos ajudar bastante.

Assim que todas as instalações forem concluídas, vamos executar o Azure Storage Emulator (caso o mesmo já não esteja em execução), e então na sequência, vamos criar nosso projeto no Visual Studio Code, abrindo seu Terminal (Ctrl + ‘) e em seguida digitando o seguinte comando:

func init

Feito vão aparecer 4 opções de seleção, nesse caso, selecione a primeira opção “dotnet”, e então, espere que termine a criação do nosso Function App.

Nosso próximo passo será o de criar nossa primeira Azure Function, e para isso digite o comando abaixo:

func new

Feito isso apareceram diversas opções de Azure Functions, cada uma para um propósito diferente, e no nosso caso escolheremos o tipo HttpTrigger e daremos a ela o nome de CreatePerson.

Abra o arquivo criado (CreatePerson.cs) e observe que ele já veio com um código padrão. Esse código nada mais faz, do que esperar um parâmetro chamado name e no fim exibirá uma mensagem de boas vindas.

Note que a função possui um cabeçalho, e ele e de extrema importância, pois é através dele que “injetaremos” os serviços que desejamos consumir na nossa Function.

Dica 1: Por boas práticas inclusive recomendadas no livro Clean Code do Robert C. Martin (Cap. 3 – Functions), uma Função deve ser extremamente pequena e no caso das Azure Functions isso não é excessão, lembre sempre que se uma Função tiver mais de um propósito, faça uma refatoração da mesma.

Dica 2: Quando suas Azure Functions estiverem publicadas no Azure, caso o plano escolhido seja o Consumption (mais barato), uma função tem tempo limite de 10 minutos para executar, logo já é mais que um bom motivo para suas funções serem “pequenas”.

Voltando para a nossa função CreatePreson vamos substitui o código padrão pelo código abaixo:

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequest req, 
    [Queue("CreatePerson", Connection = "AzureWebJobsStorage")]IAsyncCollector<string> queueItem, 
    ILogger log)
{
    log.LogInformation("CreatePerson function started a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    await queueItem.AddAsync(requestBody);

    log.LogInformation("CreatePerson function finished a request.");

    return new OkObjectResult($"Obrigado! Seu registro já esta sendo processado.");
}

Observe que o Visual Studio Code vai indicar um erro, na palavra Queue e na propriedade Connection. Isso deve ao fato de que ele não encontrou as mesmas e portanto precisamos importar o SDK do Azure Storage na nossa aplicação, e para fazer isso, abra o arquivo .csproj do seu projeto e logo abaixo da linha em que ele adiciona a referência do SDK das Azure Functions, adicione a seguinte referência:

<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="3.0.10" />

Com isso ele vai pedir para fazer o Restore do seu projeto e em seguida os erros deixarão de existir.

Comentando sobre o código da nossa Function, nós basicamente “injetamos” a possibilidade de lidar com as Queues do Azure Storage, e então através da nossa HttpTrigger receberemos o conteúdo contido no body da nossa requisição e então, enfileiraremos esse conteúdo no serviço de mensageria do Azure Storage. Note também, que na propriedade Connection eu passo um valor chamado “AzureWebJobsStorage”, nesse caso, vamos abrir o arquivo local.settings.json e localizar a propriedade “AzureWebJobsStorage” e então, substituir o conteúdo dela para a String de Conexão do nosso Azure Storage Emulator. Caso você possua Mac ou Linux você pode indicar nesse local a String de Conexão do seu Azure Storage no Azure.

Como desejamos fazer um CRUD completo, vou utilizar a classe abaixo (Person.cs) como referência para o nosso cadastro.

using Microsoft.WindowsAzure.Storage.Table;

namespace AzureFunctions
{
    public class Person : TableEntity
    {
        public string Name { get; set; }
        public string Email { get; set; }

        public Person() { }
    }
}

Observe que na classe Person eu já herdo a classe TableEntity para já facilitar a inserção dos nosso dados em um outro serviço do Azure Storage chamado Azure Tables.

Feito isso, vamos testar nosso Function App, e para isso digite o seguinte comando:

func start

Note que ele criou o seguinte endpoint para nós: CreatePerson: [POST] http://localhost:7071/api/CreatePerson e com isso já é possível testar nossa função (para isso recomendo utilizar um Client REST da sua preferência) passando o seguinte body:

{
	"name": "Blog do Ericson",
	"email": "ericson@email.com"
}

Feito isso abra a ferramenta Microsoft Azure Storage Explorer (instalada previamente no inicio do post) e localize dentro de Storage Account o serviços de Queues e abrindo-o note que foi criada uma Queue chamada CreatePerson. Abra a mesma e note que o body que passamos para o nosso endpoint estará armazenado na fila.

Agora nosso próximo passo será desenfileirar a mensagem e salva-la em um banco de dados, e seguindo nosso exemplo esse banco de dados sera o serviço de Tables (banco de dados NoSQL de chave-valor) do Azure Storage.

Vamos então criar uma nova Azure Function, digitando o novamente o comando abaixo:

func new

Feito isso, novamente aparecerão diversas opções de Azure Functions, e dessa vez escolheremos o tipo QueueTrigger e nós daremos a ela o nome de CreatePersonQueue. Após a criação da mesma substitua o código gerado pelo template pelo código abaixo:

public static void Run(
    [QueueTrigger("CreatePerson", Connection = "AzureWebJobsStorage")]string queueItem, 
    [Table("Person")]CloudTable cloudTable, 
    ILogger log)
{
    log.LogInformation($"CreatePersonQueue trigger function started.");

    var data = JsonConvert.DeserializeObject<Person>(queueItem);
    data.PartitionKey = "Person";
    data.RowKey = Guid.NewGuid().ToString();

    var tableOperation = TableOperation.Insert(data);
    cloudTable.ExecuteAsync(tableOperation);

    log.LogInformation($"CreatePersonQueue trigger function finished.");
}

No código acima, vamos deserializar a mensagem para o tipo Person e em seguida precisamos criar duas propriedades obrigatórias para que se possa utilizar o serviço de Tables do Azure Storage. Explicando de maneira bem resumida, a RowKey teria uma função similar ao de um ID de um banco de dados relacional e a PartitionKey teria a função de ajustar o particionamento automático do serviço de Tables do Azure Storage.

Com isso vamos executar nosso Function App novamente através do comando:

func start

E então abra novamente o Microsoft Azure Storage Explorer e note que a mensagem sumiu da fila, e agora a mesma encontra-se salva na tabela Person (criada automaticamente) dentro do serviço de Tables.

Bom pessoal, e com isso finalizamos a primeira parte do nosso CRUD Serverless em que criamos nosso registro. No nosso próximo post vamos trabalhar na edição e exclusão dele.

E para finalizar deixo aqui um convite.

Que tal aprender mais sobre Docker, Kubernetes e a implementação de soluções baseadas em containers utilizando o Microsoft Azure, em um workshop que acontecerá durante um sábado todo (dia 04/04) em São Paulo Capital e implementando um case na prática?

Acesse então o link a seguir para efetuar sua inscrição (já incluso camiseta, emissão de certificado e almoço para os participantes) com o desconto: http://bit.ly/anp-docker-blog-ericson

Até mais pessoal.

Abraços e Obrigado!

AZ-900 – Azure Fundamentals

Olá pessoal, tudo bem?

Ontem (08/01), tirei a certificação AZ-900 – Azure Fundamentals, e vou contar para vocês aqui como foi todo o processo de estudo até a prova.

O que cai na prova?

Abaixo, vou fazer um resumos dos principais assuntos que são cobrados na prova, lembrando que para essa prova você não precisa saber implementa-los de fato, apenas saber como eles funcionam e suas diferenças.

A prova AZ-900 é divida em quatro tópicos de estudo, sendo eles:

  1. Conceitos de Nuvem
    • Entender a diferença entre IaaS, PaaS e SaaS.
    • Entender a diferença entre nuvem, privada, pública e híbrida.
    • Entender a diferença entre CapEx e OpEx.
    • Entender a diferença entre Elasticidade, Escalabilidade, Disponibilidade, Disaster Recovery e etc.
  2. Serviços do Azure
    • Entender a arquitetura do Azure (Regiões, Zonas de disponibilidade e etc).
    • Entender os principais serviços do Azure (Computação, Storage, Dados, Rede e etc).
    • Entender como funciona o Portal do Azure, Azure Cli, Powershell e Cloud Shell.
    • Entender a utilidade do Azure Advisor.
  3. Segurança, Privacidade e Conformidade
    • Entender a diferença entre Network Security Group (NSG), Firewall, Proteção DDoS.
    • Entender como funciona o Azure Active Directory.
    • Entender para que serve o Azure Key-Vault
    • Entender as metodologias de segurança do Azure (Policies, Locks e etc).
    • Entender as opções de monitoramento e Log (Azure Monitor, Log Analytics e etc).
    • Entender as diferentes normas de conformidade do Azure variando de acordo com cada país.
  4. Precificação e Suporte
    • Entender a diferença entre uma assinatura “Free” e em uma assinatura “normal”.
    • Entender para que serve uma Subscription.
    • Entender a diferença entre os planos de suporte do Azure (Basic, Standart, Professional e etc).
    • Entender o SLA do Azure.

Como estudar para a prova?

Primeiramente sugiro fortemente que caso você já não tenha, crie uma conta no Azure, pois ela será fundamental para o aprendizado.

Feito isso, existe um guia de estudo que a própria Microsoft disponibilizou, contendo os principais tópicos abordados no exame. Caso você já tenha familiaridade com os conceitos de Cloud Computing e com o Azure, esse guia deve ser suficiente para que você passe na prova, entretanto se você ainda não é familiarizado com esse conceitos sugiro complementar seus estudos com as seguintes opções:

Como comprar e aonde fazer a prova?

A prova AZ-900 é um pouco mais barata que as demais provas do Azure, custando hoje $60. Essa prova pode ser adquirida através do site da Microsoft Learning.

Quando estiver comprando você terá a opção de escolher entre fazer a prova em um Testing Center ou na sua casa/escritório, eu escolhi fazer na minha casa mesmo e a experiência foi ótima. Claro que existem regras para se fazer o exame na sua casa e elas devem ser seguidas a risca do contrário você perde o exame. Nesse vídeo feito pela própria Microsoft é retratado de maneira bem fiel como funciona todo o processo.

Últimas dicas

Conforme mencionei no inicio do texto, você não vai implementar nada no Azure, a prova é 100% conceitual, logo a palavra-chave aqui para que você tenha sucesso no dia do exame é: entender as diferenças entre os serviços, entre os modelos e etc. Saber qual serviço é mais adequado para cada situação.

Boa sorte!

Microsoft Ignite The Tour São Paulo

Olá pessoal,

Na quinta-feira do dia 12/12 participei do pop-up de comunidades no evento Microsoft Ignite The Tour São Paulo 2019 através da comunidade .NET SP palestrando sobre Azure Storage. No total tivemos um público de mais de 60 pessoas assistindo.

Para quem tiver interesse meu GitHub possui inúmeros exemplos sobre Azure Storage. Para quem tiver interesse meu GitHub pode ser acessado através desse link.

Abaixo fotos do dia.

Microsoft Ignite The Tour São Paulo
Microsoft Ignite The Tour São Paulo

Azure Weekend 2019 – Piracicaba-SP

Olá pessoal,

No último sábado 23/11 participei do meetup promovido pelas comunidades Campinas .NET e Dev Piracicaba na Pecege em Piracicaba, meetup no qual atuei tanto na organização quanto palestrando sobre Arquitetura Serverless no Azure. No total tivemos um público de mais de 30 pessoas.

Os slides utilizados na minha palestra, sobre Arquitetura Serverless você confere logo abaixo:

Para quem quiser baixar o código utilizado na palestra, ele esta acessível através do meu GitHub nesse link.

Abaixo uma foto da minha palestra:

Azure Weekend 2019 – Piracicaba

ASP.NET Core, Xamarin, Angular, PeopleChain , Azure, IA, Dynamics

Olá pessoal,

No último sábado 11/11 participei do meetup promovido pelo .NET SP juntamente com a XP Investimentos, meetup no qual atuei tanto na organização quanto palestrando sobre Azure Storage. No total tivemos um público de aproximadamente 40 pessoas.

Os slides utilizados na minha palestra, sobre Armazenamento de dados no Azure Storage você confere logo abaixo:

Abaixo uma foto da minha palestra:

Meetup .NET SP + XP Investimentos

.NET Conf Local 2019 – Campinas-SP

Olá pessoal,

No último sábado 19/10 participei do .NET Conf 2019 – Campinas, evento no qual atuei tanto na organização quanto palestrando sobre Arquitetura Serverless. No total ao longo do dia tivemos um público de 30 pessoas.

Os slides utilizados na minha palestra, sobre Arquitetura Serverless utilizando o Azure você confere logo abaixo:

Para que quiser baixar o código fonte utilizado na palestra, é só clicar nesse link.

Abaixo uma foto da minha palestra:

.NET Conf 2019 – Campinas

.NET Conf Local 2019 – Araraquara-SP

Olá pessoal,

No último sábado 05/10 participei do .NET Conf 2019 – Araraquara, evento no qual atuei palestrando sobre Arquitetura Serverless. No total tivemos um público total de 70 pessoas.

Os slides utilizados na minha palestra, sobre Arquitetura Serverless utilizando o Azure você confere logo abaixo:

Para que quiser baixar o código fonte utilizado na palestra, é só clicar nesse link.

Abaixo uma foto da minha palestra:

.NET Conf Local 2019 – Araraquara-SP

Azure Weekend 2019 – São Paulo

Olá pessoal,

No último sábado 10/08 participei do Azure Weekend 2019 – São Paulo, palestrando sobre Azure Monitor. No total tivemos um público total de aproximadamente 70 pessoas.

Os slides utilizados na minha palestra, sobre Monitorando seus recursos com o Azure Monitor você confere logo abaixo:

Para que quiser “brincar” com a linguagem Kusto, é só clicar nesse link que ele já possui uma fonte de dados bem bacana.

Abaixo fotos da minha palestra:

Azure Weekend 2019
Azure Weekend 2019
Azure Weekend 2019
Azure Weekend 2019

Azure Fundamentals 2019 – São Paulo

Olá pessoal,

Na última segunda-feira 05/08 participei do Azure Fundamentals 2019 – Campinas, evento no qual ajudei tanto na organização quanto palestrando. No total tivemos um público total de aproximadamente 40 pessoas.

Gostaria de deixar um agradecimento ao pessoal da FCamara pelo apoio na realização do evento.

Os slides utilizados na minha palestra, Do Armazenando de Dados a Hospedagem de Sites Estáticos no Azure Storage você confere logo abaixo:

E para quem quiser o código utilizados na palestra, é só baixar através desse link.

Deixo aqui também um artigo que já publiquei como referência ao conteúdo apresentado.

Abaixo fotos da minha palestra:

Azure Fundamentals
Azure Fundamentals
Azure Fundamentals
Azure Fundamentals