Arquitetura Serverless 2: API proxy, Integration requests e queries DynamoDB.

Raul Tavares
4 min readNov 23, 2020

--

Esta é a segunda parte de uma série de tutoriais de arquitetura sem servidor (parte 1 aqui), onde compartilho conhecimentos sobre programação e uso de serviços da AWS para construir uma API web versátil e sem servidor.

Na lição anterior, criamos nosso primeiro método API, a tabela em DynamoDB e a função Insert, e neste tutorial vamos construir as funções Ler Todos e Ler Único, usando a integração direta do API Gateway com o DynamoDB.

Configurando permissões adicionais

Em vez de criar uma função Lambda para esta parte, vamos integrar nosso API Gateway diretamente com nossa tabela DynamoDB. E para isso, precisaremos criar outra role e outra política para permitir serviços comunicarem entre si.

Vá para o painel do IAM e escolha Roles -> Create Role. Em seguida, escolha AWS Service como o type, API Gateway como use case e clique em Next: Permissions.

Deixe tudo como está e clique em Next: Tags. Nesta próxima tela, apenas clique em Next:Review.

Chame a role de APIDynamoDBCustom e clique em Create role. Copie o código ARN desta role que usaremos nos próximos passos, é só clicar nela na lista de Roles.

Agora volte ao IAM dashboard and escolha Policies -> Create Policy.

Escolha DynamoDB como Service, busque por Scan, GetItem, UpdateItem and DeleteItem e adicione os três. Em Resources, Escolha Specific e adicione o ARN da tabela DynamoDB, incluindo a região. Por último, clique em Review policy.

Nomeie como DynamoDBCustomPermissions e clique em Create policy.

Em Policies, pesquise a política criada recentemente e selecione-a.

Na página de edição da política, vá para a guia Policy Usage e na seção Permissions, clique em Attach. Selecione a função criada (APIDynamoDBCustom) e clique em Attach policy. Isso é tudo!

Método GET (todos)

Vá para o console da API Gateway e em Actions, clique em Create Method. Na pequena lista suspensa que aparecerá, selecione GET e clique na marca de seleção ao lado dela.

A seguir, na página de configuração, preencha o formulário da seguinte forma:

· Integration Type: AWS Service
· AWS Region: your-region
· AWS Service: DynamoDB
· HTTP Method: POST

(por que POST se estou criando um método GET? Isso ocorre porque as consultas do DynamoDB utilizam métodos POST, mesmo quando você está recuperando itens. Para seu usuário final, a chamada de API será GET, mas sua lógica é baseada em uma consulta POST)

· Action: Scan
· Execution Role: (ARN da role que criamos no último passo)

Clique em Save.

Última etapa, você precisa mapear a tabela para a solicitação e, para isso, clique em Integration Request.

Um pouco abaixo, expanda a seção Mapping Templates, escolha a segunda opção (recomendada) e clique no pequeno ícone (+) para Add mapping template.

Escreva application/json e aperte a pequena marca de seleção para abrir um bloco de código abaixo. Cole o seguinte código:

{
"TableName":"Users"
}

Veja aqui a documentação oficial da ação Scan.

E é isso! Volte para a tela de Method Execution, clique em Test e, em seguida, Test novamente e veja sua solicitação GET funcionando.

Observe que traz todos os registros da tabela. Mas e se você quiser apenas um único registro?

Método GET (único)

Vamos criar outro método GET, mas agora usando um parâmetro de URL e para isso precisamos criar um novo recurso no API Gateway.

Vá em Actions e depois Create Resource.

Você pode criar livremente qualquer nome de recurso e seus métodos, pois isso torna seus URLs mais amigáveis.

Para este exemplo, para criar um parâmetro de URL, você precisa usar chaves no Resource Path, como abaixo:

· Resouce Name: usuario
· Resouce Path: {usuario}

Clique em Create Resource e, com o recurso selecionado, vá para Actions, Create Method e escolha GET no menu suspenso.

Preencha com a mesma configuração do método anterior, exceto:

· Action: GetItem

E clique em Save.

Crie um novo Mapping Template, usando a sintaxe da ação GetItem junto com algumas customizações para mapear o input da URL.

{
"TableName": "Users",
"Key": { "username": { "S": "$input.params(‘usuario’)"} }
/ * the $input.params(‘xxxx’) holds the parameter you specified */
}

E é isso! Volte para a tela de Method Execution e clique em Test.

Na entrada de texto Path que contém o parâmetro que você nomeou, coloque qualquer nome de usuário cadastrado em seu banco de dados e clique em Test abaixo.

Conclusão

É isso para este artigo. Há muitas informações para compartilhar e no próximo tutorial, veremos como atualizar (UpdateItem) e excluir (DeleteItem) usando integrações proxy para funções Lambda e editando a resposta da API para um formato mais amigável. Até então, obrigado!

--

--

Raul Tavares

Writer, technology professional, curious and creative.