Como criar uma Api Rest Utilizando Somente ApiGateway e DynamoDb

Como criar uma Api Rest Utilizando Somente piGateway e DynamoDb

Trazemos no artigo de hoje feito pelo especialista Rafael Campana um pouco sobre questões técnicas que diversos especialistas enfrentam constantemente dentro do seu ambiente de trabalho, nós da BRLink estamos sempre atentos em trazer os melhores métodos e práticas dentro da área de Cloud Computing.

A abordagem comum do desenvolvimento de software é usar uma função intermediária para manipular os dados entre a API e o banco de dados, a maneira serverless para se conseguir isso no mundo da AWS é usar uma função lambda para fazer esse trabalho da seguinte forma: 

 

Em muitos casos essa função é apenas usada como proxy para o banco de dados, porém já cogitou remover esse código que não possui utilidade e manter tudo mais simples e clean?

            Este é um cenário considerado relativamente “bom”, você pode ter aqui um contêiner ou até mesmo um aplicativo implantado em um EC2, consumindo muitos recursos para nada. 

            Com um ApiGateway usando Mapping Templates você pode criar uma API restfull, com quase zero linhas de código e entregar uma boa solução em um tempo recorde com menor custo. O esquema de infraestrutura você pode ver abaixo: 

 

Após essa breve elucidação, vamos praticar?

1- Criar uma tabela do DynamoDB 

Para este exemplo, foi criado uma tabela muito simples apenas com id, name e userName. Não vamos entrar no detalhe de como criar essa tabela para não fugir do foco , mas você pode ver as etapas acessando: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SampleData.CreateTables.html 

 

2- Criar uma Role no IAM 

Sua função deve ter acesso à sua tabela no Dynamo, para este exemplo foi liberado full access para o Dynamo, pois em um mundo real é uma boa prática criar um acesso granular para cada API, tabela e método 

*Policies atreladas à Role

 

3- Crie seu Api Gateway 

Crie um Api Gateway com a seguinte estrutura: 

No método post, você deve selecionar AWS Service apontar o banco de dados do Dynamo e indicar sua role criada na etapa anterior:

 

Uma vez criado, você deve criar um mapping template para converter um conteúdo do body da solicitação do post em uma solicitação PutItem do DynamoDbIntegration Request > Mapping Templates, adicionar novo item com o contente type application /json com o seguinte conteúdo: 

{

“TableName”: “users”,

“Item”: {

“uid”: {

“S”: “$context.requestId”

},

“name”: {

“S”: “$input.path(‘$.name’)”

},

“userName”: {

“S”: “$input.path(‘$.userName’)”

}

}

O que esse código significa? Ele mapeia as propriedades nome e username do corpo do método post para as propriedades “name” e “userName” do DynamoDb. O uid é preenchido com um requestId exclusivo gerado pelo request do API gateway. 

            Após essas configurações, vamos fazer nosso primeiro teste e analisar a resposta: 

 

Como você pode ver, a chamada restante é convertida em uma chamada de PutItem para o Dynamo e a resposta é 200, o item foi criado e você pode verificar no console do db do Dynamo.

4- Criar um Recurso e Obter o Método 

            Crie um Resource com o path {username} e um método get associado à ele. Configure o método Get quase como ao Post , mas alterando o PutItem” para “Query”, uma vez que a ação agora necessária é que faça uma query no Dynamo: 

Agora precisamos criar novamente os Mapping Templates noIntegration Request, mas agora com a seguinte tradução:

{    “TableName”: “users”,    “IndexName”: “userName-index”,    “KeyConditionExpression”: “userName = :val”,    “ExpressionAttributeValues”: {        “:val”: {            “S”: “$input.params(‘username’)”        }    }}

 

Isso mapeia o username do parametro do resource para uma query do dynamoDb com a condição “userName” e faz a consulta.

Agora, precisamos criar uma etapa adicional e criar um mapeamento do response, em Response Response> Mapping Templates, adicione um novo item com o tipo de conteúdo application / json com o seguinte conteúdo:

 

#set($inputRoot = $input.path(‘$’))

{

“users”: [

#foreach($elem in $inputRoot.Items) {

“uid”: “$elem.uid.S”,

“name”: “$elem.name.S”,

“userName”: “$elem.userName.S”

}#if($foreach.hasNext),#end

#end

]

}

 

Vamos testar e analisar o response:

 

Nós passamos o nome de usuário criado rocampana que contém um array (com apenas um item) com todos os usuários com este username cadastrados no banco de dados. 

            E agora nós temos dois métodos: 

post — users/
get— users/{username} 

 

Essas são as respostas no estilo REST com código quase zero e uma infraestrutura limpa e mais barata possível.