Pular para o conteúdo

Criando um Serverless .NET Core Web API com AWS Lambda

Criando um Serverless .NET Core Web API com AWS Lambda

Para muitos que como eu estão se aventurando na AWS e estudando em como utilizar e implementar os serviços disponíveis na Amazon (que não sou poucos), resolvi compartilhar um pouco do meu aprendizado e mostrar o pouco que aprendi até agora.

Resolvi começar mostrando como criar uma pequena API em .Net Core com AWS Lambda. Para isso, precisaremos de:

Então vamos lá. Primeiramente vamos instalar o AWS Toolkit for Visual Studio.

Web API com AWS Lambda
Clique na imagem para ser direcionado para o link

Após efetuar o download, clique no instalador e a seguinte tela aparecerá:

3

Como possuo a versão 2017 e 2019 do Visual Studio, o instalador me dá a opção de instalação nos dois produtos. Apenas clique em Install e espere a instalação ser concluída.

4
5

Após a instalação, abra o Visual Studio e veja que novas opções de projetos estarão disponíveis. Clique em Create a New Project e escolha o template AWS Servless Application (.NET Core – C#) e clique em Next:

6
7

O nome do nosso projeto será AWSProductListWebAPI e o objetivo dele será inserir e excluir dados de uma lista de produtos que ficará em memória.

Clique em Create.

8

Escolha a opção AP.NET Core Web API e clique em Next.

9

Clique em Create e o seu projeto será criado.

10

Vamos apagar os dois Controllers criados no projeto, pois escreveremos o nosso próprio.

A API que criaremos fará a inclusão de produtos e suas respectivas quantidades em uma lista em memória. Algo bem simples.

Antes de continuarmos, entenda que não é objetivo desse artigo ensinar C#, portanto, descreverei a estrutura e disponibilizarei os fontes a seguir.

Estrutura de nossa API:

  • Controllers
  • Models
  • Services

Controllers

 using System.Linq;
 using System.Threading.Tasks;
 using AWSProductListWebAPI.Models;
 using AWSProductListWebAPI.Services;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;

namespace AWSProductListWebAPI.Controllers
 {
     [Route("v1/productList")]

     public class ProductListController : ControllerBase
     {
         private readonly IProductListService _productListService;

    public ProductListController(IProductListService productListService)
    {
        _productListService = productListService;
    }

    [HttpGet]
    public IActionResult GetProductList()
    {
        var result = _productListService.GetItemsFromProductList();

        return Ok(result);
    }

    [HttpPost]
    public IActionResult AddItemToProductList([FromBody] ProductListModel productList)
    {
        _productListService.AddItemToProductList(productList);

        return Ok();
    }
    [HttpDelete]
    public IActionResult DeleteItemsFromProductList([FromBody] ProductListModel productList)
    {
        _productListService.RemoveItem(productList.Name);

        return Ok();
    }

} 
}

Aqui definimos a rota de chamada de nossa API (v1/productList) e os métodos HTTP get, delete e post.

Models

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 namespace AWSProductListWebAPI.Models
 {
     public class ProductListModel
     {
         public string Name { get; set; }
         public int Quantity { get; set; }
     }
 }

Aqui o modelo de nossa lista de produtos

Services

Primeiro a interface de nosso Serviço:

 using System.Collections.Generic;
 using AWSProductListWebAPI.Models;

 namespace AWSProductListWebAPI.Services
 {
     public interface IProductListService
     {
         Dictionary GetItemsFromProductList();
         void AddItemToProductList(ProductListModel productList);
         void RemoveItem(string name);
     }
 }

E sua implementação:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 namespace AWSProductListWebAPI.Services
 {
     public class ProductListService : IProductListService
     {
         private readonly Dictionary _productListStorage = new Dictionary();
         public Dictionary GetItemsFromProductList()
         {
             return _productListStorage;
         }
         public void AddItemToProductList(Models.ProductListModel productList)
         {
             _productListStorage.Add(productList.Name, productList.Quantity);
         }
         public void RemoveItem(string productListName)
         {
             _productListStorage.Remove(productListName);
         }
     }
 }

A estrutura ficará assim no Visual Studio:

image 1

Compile tudo (CTRL+SHIFT+B), e se nenhum erro se apresentar, o seu projeto está íntegro ! 🙂

Vamos fazer um teste. Clique em F5 para executar o projeto e levantar o IIS ( Internet Information Services). Vamos agora testar o nosso serviço utilizando o Postman. Se você não o tem instalado e nem sabe como utilizá-lo, veja o artigo abaixo:

https://www.profissionaloracle.com.br/2019/10/21/instalando-e-utilizando-o-postman/

Quando o IIS levantar, o navegador abrirá e mostrará o endereço localhost com a respectiva porta. Copie esse link para utilizarmos na chamada de nossa API.

image 2

Vamos fazer a nossa primeira chamada com GET:

image 3

Observe que o JSON retornou vazio, pois não inserimos nada em nossa lista de produtos.

Vamos fazer uma chamada com POST incluindo um produto e sua quantidade:

{
   "Name": "mouse",
   "Quantity": 1
}
image 4

Incluiremos outro produto agora:

{
   "Name": "keyboard",
   "Quantity": 1
}

Agora faremos uma nova chamada GET.

image 5

Veja que o retorno foi os dois produtos que enviamos para a lista. Mouse e teclado.

Vamos fazer uma chamada DELETE apagando um produto de nossa lista. Vamos retirar o keyboard de nossa lista.

{
   "Name": "keyboard"
}
image 6

E um novo GET agora.

image 7

Observe que apenas o mouse permanece na lista. Isso mostra que a nossa API está 100% funcional ! 🙂

Agora vem o mais interessante. Vamos publicá-la na AWS ! Para isso, clique com o botão direito no nome da nossa API e escolha a opção Publish to AWS Lambda.

image 9

A seguinte tela se apresentará. Clique no botão para incluir o Account profile to use para preencher todos os dados da credencial.

15

Os principais campos a serem preenchidos são:

  • Access Key Id – Chave de acesso do usuário AWS que deverá possuir permissões para fazer a criação do Bucket S3, do Lambda Function e API Gateway
  • Secret Access Key – Chave de acesso secreta do usuário
  • Account Number – Account Number de sua conta AWS

Criando um usuário na AWS

O usuário que utilizaremos não é o root (master) que acessa todos os serviços da AWS, e sim um que contenha apenas as roles necessárias para a publicação de nossa API.

16

Clique em Serviços > Identity and Access Managemente (IAM) e depois Adicionar usuario.

17

Criemos o usuário tester. No Tipo de acesso, habilite o Acesso programático para que tenhamos as chaves de acesso necessárias para publicarmos nossa API. Após isso clique no botão Próximo: Permissões.

18

Escolha a opção Anexar políticas existentes de forma direta e escolha as permissões abaixo:

19
image 10

Em uma implementação de produção real, nunca daríamos acesso full aos serviço, mas como o objetivo desse artigo não é o aprofundamento na criação de usuário na AWS, vamos prosseguir do jeito mais fácil.

Clique em Criar usuário.

20 1

Voltemos ao IAM. Clique no usuário tester que criamos e acesse a aba Credenciais de Segurança. Lá clique em Criar chave de acesso para obtermos o Access Key ID e o Secret Access Key.

image 11

Voltemos ao Visual Studio para preenchermos os dados faltantes e clicar em OK. A seguinte tela se apresentará:

image 12

Preencha os seguintes campos:

  • Region: Região do datacenter onde você publicaremos a nossa API
  • Configuration: Release
  • Framework: netcoreapp2.1
  • Stack Name: ProductListLambdaWebAPI
  • S3 Bucket: Se não possuir um criado, clique em New e crie o seu bucket

Clique em Publish.

28
29

Se qualquer problema ocorrer, ele efetuará o ROLLBACK do deploy e apresentará a tela acima. Caso tudo funcione como esperamos, a tela abaixo aparecerá:

image 13

Onde está em vermelho, aparecerá o link para executarmos a nossa API. No Postman, substitua o localhost por esse link e faça os mesmos testes que efetuamos anteriormente. Se tudo funcionar, meus parabéns ! Você acabou de publicar sua primeira API na AWS !!

Dica: Após o término de seus testes, sugiro que bloqueie o seu bucket S3 para acesso público, pois ele estará exposto a ser chamado por qualquer um. Para isso, acesse sua conta na AWS, clique em Serviços e busque por Amazon S3. Clique na aba Permissões e depois em Editar.

Agora clique em Bloquear todo Acesso Público e depois em Salvar.

image 14
image 15

Digite confirmar e clique no botão Confirmar.

Pronto ! Seu bucket S3 não estará mais exposto a acesso público !

Assim chegamos ao fim de nosso artigo. Espero que ele seja útil e ajude um pouco a entender e a implementar APIs na AWS.

Fontes

Sergio Willians

Sergio Willians

Sergio Willians é o fundador do GPO (Grupo de Profissionais Oracle) e possui quase 30 anos de experiência em tecnologias Oracle, sendo especialista em desenvolvimento Forms/Reports, PL/SQL e EBS (E-Business Suite) nos módulos Receivables, Payables e General Ledger. Atualmente trabalha na Scania Latin America, onde se dedica à área de integração de dados com Confluent Kafka. Sua paixão é compartilhar conhecimento com a comunidade Oracle, contribuindo para o crescimento e a excelência da plataforma.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress