Arquitetura Serverless 2: API proxy, Integration requests e queries DynamoDB.
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!