Projeto com deploy automático na AWS de um API Gateway que intercepta todas as URLs da aplicação e as autentica, caso necessário. A conexão entre o API Gateway e o Load Balancer da aplicação é feito via VPC Link, permitindo que essa stack seja reaproveitada caso outra aplicação precise de funcionalidades semelhantes.
A aplicação roda usando AWS SAM CLI. Para rodar o projeto inteiro, é necessário:
- AWS SAM CLI
- Node.js 18, incluindo o
npm
para gestão de dependências - Docker
Primeiramente, é necessário montar a imagem com:
sam build
Em seguida, pode-se subir a API com:
sam local start-api --debug --env-vars=env.json
É recomendado usar a flag --debug
para logs mais completos em caso de erro.
Com isso, aplicação já estará rodando em GET http://localhost:3000/test
e POST http://localhost:3000/customer
.
No caso do GET /test
, o autorizador deve ser ativado. Com isso, temos os seguintes cenários:
- Não enviou o header
Authorization
>> Não autorizado - Enviou o header, mas sem valor (ou um espaço em branco) >> Não autorizado
- Enviou o header, mas o CPF não existe na base >> Não autorizado + log de erro
- Enviou o header e o CPF existe na base >> Autorizado >> Loga o JSON que chegou no handler
Já no caso do POST /customer
, o autorizador jamais será chamado. Portanto, em todos os cenários a requisição será aceita.
O arquivo template.yaml
cria os seguintes recursos.
Um gateway que fica na frente da aplicação, interceptando as requisições e fazendo-as passar por um Lambda Authorizer antes de prosseguir.
A conexão com o Authorizer (TokenAuthorizerFunction
) é configurada em Properties -> Auth
e as configurações de interceptação em Properties -> DefinitionBody
.
Essa propriedade receber como parâmetro uma configuração no modelo Open API, à qual ajudará a montar as rotas do API Gateway. Com isso, temos mais possibilidades de personalização, entre elas permitir que alguns endpoints não passem pelo autorizador.
Com isso, temos algumas configurações importantes:
securitySchemes
configura o Lambda Authorizer, apontando para a função que deve ser executada e qual header ela espera (Authorization
)x-amazon-apigateway-authorizer
é uma propriedade exclusiva da AWS que configura o autorizador/{proxy+}:
(ou$default
) é a configuração padrão para todas as rotas que não foram listadas empath
x-amazon-apigateway-any-method
faz interceptar todos os verbos HTTPsecurity: - TokenAuthorizer: [ ]
aplica o Lambda Authorizer nas rotasx-amazon-apigateway-integration
configura a integração, ou seja, conecta o API Gateway à VPC via VPC Link/customer
configuração exclusiva para essa rota, removendo o autorizador dela
Configura o Lambda Authorizer, cujo código está em src/handlers/tokenAuthorizer.js
.
São dois endpoints simples usados para testar o Authorizer. Ele cria uma rota em GET /test
e outra em POST /customer
. Para mais detalhes, veja seção sobre como testar
A condition DevelopmentOnlyResources
impede sua criação em produção.
Serve para conectar o API Gateway ao Load Balancer via VPC. Para isso, ele recebe algumas informações, como ID do Security Group, os IDs das Subnets do Load Balancer e o ARN do listener do Load Balancer.
Com isso, ao dar deploy, o API Gateway já irá interceptar as requisições, autorizá-las (se preciso) e redirecionar para o Load Balancer, que por sua vez irá direcionar para as instâncias da aplicação.