Palestra Puccamp – Cloud Computing Fundamentals

Olá pessoal, tudo bem?

No último sabádo tive o prazer de palestrar para o curso de Pós Graduação de Industria 4.0 na Puc Campinas.

Agradeço ao Leandro Xastre pela convite e oportunidade e ao Sinésio Knupfer pela indicação.

Os slides utilizados na minha palestra, sobre Cloud Computing Fundamentals você confere logo abaixo:

Muito obrigado e até a próxima.

Conteúdo Gratuito Certificação AZ-900

Olá pessoal tudo bem?

Vou compilar nesse post uma série de vídeos publicados no canal Coding Night a respeito da Certificação AZ-900, incluindo um simulado completo para a prova.

Mesmo que você não tenha interesse em tirar a provar o contéudo em si da uma visão bastante abrangente sobre Cloud e também sobre o Azure.

Playslist do Conteúdo: Conceitos Básicos de Cloud Computing e do Azure + Certificação AZ-900 – YouTube

Simulado: Simulado Online Gratuito AZ-900 e com certificado: teste seus conhecimentos sobre Azure e cloud! – YouTube

Espero que tenham gostado e até a próxima.

Obrigado!

Azure Free Books

Olá pessoal,

Nesse post vou listar alguns livros gratuitos sobre Azure para download.

O primeiro deles é o The Developer’s Guide to Microsoft Azure que se encontra gratuito nesse link.

O segundo deles é o Azure for Architects que se encontra gratuito nesse link.

O terceiro deles é o Azure Serverless Computing Cookbook que se encontra gratuito nesse link.

O quarto deles na verdade é um bundle sobre Kubernetes. Nesse link encontram-se 3 livros: Hands-On Kubernetes on Azure, Designing Distributed Systems e The Azure Cloud Native Architecture Mapbook.

E por último, porém não menos importante, Hands-On Linux Administration on Azure que pode ser encontrado nesse link.

Esperam que tenham gostado e até a próxima.

Obrigado.

Azure Architecture Icons

Olá pessoal, tudo bem?

Quantas vezes nós não deparamos com a dificuldade em encontrar os ícones corretos para montar um diagrama de Arquitetura do Azure?

A Microsoft lançou recentemente um pacote de ícones do Azure para download em SVG através desse link.

Deixo aqui também o convite para acessar o Azure Architecture Center, aqui você pode encontrar muito conteúdo legal sobre Azure.

Espero que tenha gostado da dica e até a próxima.

Obrigado!

Azure Labs – Workshop Online Gratuito: End-to-end Development Microsoft Cloud

Olá pessoal, tudo bem?

Na última quarta-feira dia 21 participei do Azure Labs. Nesse workshop, primeiramente, demonstrei uma visão geral do poder do Azure para o desenvolvedor de software e logo na sequência falei sobre todos os serviços do Azure Storage e como eles podem lhe ajudar no seu dia-a-dia de desenvolvedor. Por fim, também atuei de moderador no chat tirando dúvidas relacionadas ao Azure.

Vale mencionar que tivemos um público excepcional nesse workshop chegando a quase 300 pessoas simultâneas.

E para quem tiver interesse no código utilizado sobre Azure Storage, ele pode ser acessado através desse link.

Abaixo algumas imagens do workshop:

Azure Overview

Azure Storage

Moderador do Chat

JunDevelopers Summit 2020

Olá pessoal,

Nesse sábado 12/09 participei do JunDevelopers Summit 2020, evento em que palestrei sobre a Construção de uma aplicação escalável e de baixo custo no Azure utilizando Azure Storage e Azure Functions.

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

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

E o vídeo aqui:

Deixo aqui meus agradecimentos a todos que puderam participar.

Até a próxima!

Redimensionando imagens com Azure Functions e Azure Storage

Olá pessoal, tudo bem? Nesse post vamos aprender como fazer um redimensionamento de imagens altamente escalável e muito simples utilizando Azure Functions e Azure Storage.

Primeiramente vamos criar uma conta de Storage no Azure e na sequência 2 containers no serviço de Blob. O primeiro container vai se chamar images (onde nossa Function vai monitorar), e o segundo vai se chamar thumbnails (onde salvaremos a nossa imagem redimensionada).

Dica: Caso esteja utilizando o sistema operacional Windows, você pode utilizar o Azure Storage Emulator para simular o serviço de Storage do Azure.

Logo depois de criarmos o serviço de Storage (seja no Azure ou simulando localmente através do Azure Storage Emulator), vamos abrir o Terminal (Ctrl + ‘) do Visual Studio Code, e digitarmos:

func init

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

Logo depois, nosso próximo passo será o de criar nossa Azure Function, e para isso, utilize o comando abaixo:

func new

Agora, dentre as diversas opções de Azure Functions, vamos escolher o tipo BlobTrigger e daremos a ela o nome de ImageResizerTrigger.

Seguindo, abra o arquivo .csproj do seu projeto e adicione o package da SixLabors.ImageSharp nele, igual a linha abaixo:

<PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-rc0001" />

Na sequência o Visual Studio Code pedirá para que você faça um Restore na aplicação.

Assim que o Restore finalizar, abra o arquivo ImageResizerTrigger.cs e substitua-o com o código abaixo:

public static void Run([BlobTrigger("images/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, 
            [Blob("thumbnails/{name}", FileAccess.Write)] Stream outputBlob, ILogger log)
        {
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");

            using (var image = Image.Load(myBlob))
            {
                var resizeOptions = new ResizeOptions
                {
                    Size = new Size(640, 480),
                    Compand = true,
                    Mode = ResizeMode.Max
                };

                image.Mutate(ctx => ctx.Resize(resizeOptions));
                image.Save(outputBlob, new JpegEncoder { Quality = 80 });
            }
        }

Dessa forma, note no nosso código, que a nossa Azure Function estará sempre olhando para o container images, e seu “output” será sempre no container thumbnails.

Importante: A propriedade Connection esta “setada” com o valor: AzureWebJobsStorage. Esse valor na verdade esta contido no arquivo local.settings.json e você deverá colocar a string de conexão do seu Storage no mesmo.

Assim, faça o upload de uma imagem no container images e note que a imagem será automaticamente redimensionada e salva no container thumbnails, conforme nós queríamos.

Por fim, caso tenha interesse em mais conteúdos relacionados a Azure Functions e Azure Storage, convido você a dar uma olhada na série: Criando um CRUD Serverless com Azure Functions.

Espero que tenham gostado e até a próxima. Obrigado!

Criando um CRUD Serverless com Azure Functions – Parte 4

Olá pessoal, tudo bem? Neste post derradeiro sobre como criar um CRUD Serverless com Azure Functions, vamos aprender como orquestrar nossas API’s utilizando o Azure API Management. O intuito desse post não é explicar em detalhes esse serviço, mas sim em focar como podemos deixar nossas API’s mais seguras.

Primeiramente, acesse o https://portal.azure.com e clique em Create a Resource, e logo na sequência na barra de busca pesquise por API Management.

Preencha as informações necessárias e aguarde a criação do serviço terminar (isso leva em média 20 minutos). Agora nosso próximo passo será importar nossas API’s e para isso na barra esquerda clique em API’s e em seguida selecione Function App. No modal que aparecer clique em Browse, depois em Function App e então selecione a aplicação Serverless que publicamos na parte 3 do artigo, e após o preenchimento dos dados clique em Create.

Observe que você pode criar um sufixo para a chamada das API’s editando o campo API URL suffix. Outro ponto interessante é que ele nos mostra todas as nossas API’s (HttpTriggers) e quais desejamos importar (por padrão todas vem selecionadas).

Dessa forma, terminada a importação, vamos adicionar um “Produto” para a nossa API. Por padrão temos duas opções: Starter e Unlimited, tendo a possibilidade criarmos um customizado também caso necessário.

Após selecionado o produto, vamos clicar em Developer portal e logo abaixo do nome de login (provavelmente ADMINISTRATOR), selecione a opção Profile. Note que clicando nessa opção apareceram os dois produtos disponíveis (Starter e Unlimited) como duas Keys para cada um. Essas keys serão fundamentais para que nossas API’s funcionem pois sem elas, se tentarmos acessa-las aparecerá o seguinte erro:

{
  "statusCode": 401,
  "message": "Access denied due to invalid subscription key. Make sure to provide a valid key for an active subscription."
}

Então nosso próximo passo será autorizar a chamada das nossas API’s e para isso será necessário passar um Header da requisição chamado Ocp-Apim-Subscription-Key e como valor a Key do produto em questão. Note que se você fizer a chamada de alguma API ela vai funcionar perfeitamente.

Agora vamos implementar algumas Policies para nossa aplicação. Habilitaremos o CORS, na sequência as chamadas para um determinado range de IP’s e por fim restringir um numero abusivo de chamadas as nossas API’s em um pequeno espaço de tempo.

Para isso selecione nosso conjunto de API’s e clique em base nas opções de Inbound processing e em seguida adicione o código abaixo para habilitar o CORS (lembre-se que todo o código deve ser colocado dentro da tag de inbound):

<cors>
    <allowed-origins>
        <origin>{SUA_URL}</origin>
    </allowed-origins>
    <allowed-methods>
        <method>*</method>
    </allowed-methods>
    <allowed-headers>
        <header>*</header>
    </allowed-headers>
    <expose-headers>
        <header>*</header>
    </expose-headers>
</cors>

Agora vamos liberar apenas um range de IP:

<ip-filter action="allow">
    <address-range from="<IP_INICIO>" to="<IP_FIM>" />
</ip-filter>

Por último, com o código abaixo, restringiremos por 15 segundos o acesso as nossas API’s caso alguém acesse alguma delas 3 vezes seguidas em sequência.

<rate-limit-by-key calls="3" renewal-period="15" counter-key="@(context.Request.IpAddress)" increment-condition="@(context.Response.StatusCode == 200)" />

Bom pessoal e assim finalizamos nossa série Criando um CRUD Serverless com Azure Functions.

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

Espero que tenham gostado e até a próxima.

Obrigado!

Criando um CRUD Serverless com Azure Functions – Parte 3

Olá pessoal, tudo bem?

Seguindo a nossa série em que vamos criar um CRUD Serverless com Azure Functions, hoje desenvolveremos a listagem dos nossos registros, a publicação da nossa Function App no Azure e por fim a publicação de um site estático consumindo nossas API’s no Azure Storage.

Primeiramente vamos trabalhar na listagem dos registros, 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 ListPeople.

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

public static async Task<IEnumerable<Person>> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    [Table("Person")]CloudTable cloudTable,
    ILogger log)
{
    log.LogInformation("ListPeople function started a request.");

    var tableQuery = new TableQuery<Person>();
    TableContinuationToken continuationToken = null;

    TableQuerySegment<Person> tableQueryResult;
    do
    {
        tableQueryResult = await cloudTable.ExecuteQuerySegmentedAsync(tableQuery, continuationToken);
        continuationToken = tableQueryResult.ContinuationToken;
    } while (continuationToken != null);

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

    return tableQueryResult.Results;
}

Observe que o código mudou levemente em relação as HttpTriggers anteriores. Nesse código mudamos o retorno da Função, sendo que agora ela retorna um IEnumerable de Person e para que isso seja possível utilizamos o comando TableQuerySegment para trazer todos os registros da nossa tabela.

Vamos agora executar nosso Function App utilizando o comando abaixo:

func start

Agora vamos testar nossa função de listagem de registros (para isso recomendo utilizar um Client REST da sua preferência) acessando o novo endpoint criado: ListPeople: [GET] http://localhost:7071/api/ListPeople, e observe ele retornou todos os registros cadastrados.

Ao contrário do que vimos na parte 1 e parte 2 do artigo, não criaremos nenhuma QueueTrigger, pois não iremos enfileirar nenhuma consulta, ao invés disso, vamos criar mais uma HttpTrigger e dessa vez será para trazer um único registro ao invés da listagem toda.

Novamente vamos utilizar o comando abaixo:

func new

Feito escolheremos novamente o tipo HttpTrigger e para essa função daremos o nome de GetPerson.

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

public static async Task<Person> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    [Table("Person")]CloudTable cloudTable,
    ILogger log)
{
    log.LogInformation("GetPerson function started a request.");

    var partitionKey = "Person";
    var rowKey = req.Query["id"];

    TableOperation person = TableOperation.Retrieve<Person>(partitionKey, rowKey);
    TableResult result = await cloudTable.ExecuteAsync(person);

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

    return (Person)result.Result;
}

Note que o código acima não é bem semelhante ao que já produzimos nas Funções anteriores e então vamos mais uma vez testar a nossa aplicação, utilizando o comando:

func start

Mais uma vez vamos acessar o novo endpoint criado: GetPerson: [GET] http://localhost:7071/api/GetPerson, (lembre-se de passar o RowKey via QueryString sob o parâmetro de nome id ), e observe ele retornou o registro cadastrado.

Agora finalmente vamos publicar tudo isso no Azure, e para isso (caso ainda não tenha instalado), vamos instalar a extensão do Azure Functions no VsCode e com ela instalada, você irá clicar na opção Deploy to Function App…, e em seguida selecione sua Subscription no Azure (caso possua mais de uma), nosso próximo passo será selecionar Create a New Function App in Azure, feito isso ele irá lhe pedir um nome (necessita ser único globalmente), e por fim selecione a Region em que deseja fazer o deploy.

Agora é so aguardar alguns minutos para que o deploy seja finalizado no Azure.

Bônus

Para deixarmos nosso CRUD mais profissional podemos criar uma Single Page Application utilizando Angular e publicar isso no Azure, gastando apenas o custo de armazenamento, sem que seja cobrado qualquer custo de computação. Para realizarmos esse próximo passo, deixo abaixo um vídeo que eu publiquei no canal Azure na Prática fazendo um passo a passo de como fazer isso.

Por sim para quem tiver interesse todo o código da nossa Function App encontra-se no meu GitHub, inclusive contendo uma Single Page Application feita em Angular, pronta para ser publicada. Lembrando que no próximo e último artigo da série de posts, vou demonstrar como utilizarmos o Azure API Management pra a orquestração das nossas API’s criadas na nossa Function App.

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!