AWS – API Gateway – Fundamentos

Navegação

Objetivo

Neste post iremos falar sobre os princípios do AWS API Gateway e sua utilização com funções lambda.

Interação com Lambda

Abaixo temos a ilustração que representa, em alto nível, a interação do API Gateway com funções lambda.

Componentes do API Gateway

O diagrama a seguir ilustra os principais componentes do API Gateway.

Criando um lambda

Crie um lambda simples que irá interagir com o API gateway.

Na console do Lambda → Create Lambda → Author from scratch → Function name → Runtime = Python x.x → Create function

Ajuste o código da função para retornar um simples Hello World → Test

				
					import json

def lambda_handler(event, context):
    
    return "Hello World"

				
			

Crie um evento de teste..

Faça o deploy, teste e verifique o resultado.

Criando uma API

Na console do API Gateway → REST API → Build.

Protocol: REST → New API → Name: HelloWorldAPIv01 → Create API

Actions → Create Resource → Name: HelloWorld → Create resource

No resource → Actions → Create Method → GET → Lambda Function → Lambda: HelloWorldv01 → Save

Actions → Deploy API

New Stage → Name: dev → Deploy

Stages → dev → /helloworld → GET → Clique na URL

Função handler do lambda

A função handler é o método dentro da lambda que processa eventos.

Quando uma Lambda invoca a função handler o runtime da lambda passa dois argumentos para a função handler: um objeto event e um context.

Event – É um documento JSON que contém dados para a função lambda processar. Quando você invoca uma lambda, você controla a estrutura e conteúdo de event.

				
					{
  "TemperatureK": 281,
  "WindKmh": -3,
  "HumidityPct": 0.55,
  "PressureHPa": 1020
}
				
			

Quando um serviço AWS invoca a função lambda, o serviço define a estrutura e conteúdo de event. A seguir está um exemplo de event enviado por uma notificação do SNS.

				
					{
  "Records": [
    {
      "Sns": {
        "Timestamp": "2019-01-02T12:45:07.000Z",
        "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
        "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
        "Message": "Hello from SNS!",
        ...
				
			

Context – Fornece informações sobre a chamada da função e o ambiente de runtime.

A seguir estão exemplos de propriedades em context.

Context methods

  • get_remaining_time_in_millis: retorna o número de milissegundos restantes antes do tempo limite da execução.

Context properties

  • function_name: o nome da função do Lambda.
  • function_version: a versão da função.
  • invoked_function_arn: o nome do recurso da Amazon (ARN) usado para invocar a função. Indica se o invocador especificou um alias ou número de versão.
  • memory_limit_in_mb: a quantidade de memória alocada para a função.
  • aws_request_id: o identificador da solicitação de invocação.
  • log_group_name: o grupo de logs da função.
  • log_stream_name: a transmissão de log para a instância da função.
  • identity: (aplicativos móveis) informações sobre a identidade do Amazon Cognito que autorizou a solicitação.
  • client_context: (aplicativos móveis) contexto do cliente fornecido ao Lambda pela aplicação cliente.

Referência: https://docs.aws.amazon.com/lambda/latest/dg/python-context.html

A seguir está um exemplo de código que loga o conteúdo de context.

				
					import time

def lambda_handler(event, context):   
    print("Lambda function ARN:", context.invoked_function_arn)
    print("CloudWatch log stream name:", context.log_stream_name)
    print("CloudWatch log group name:",  context.log_group_name)
    print("Lambda Request ID:", context.aws_request_id)
    print("Lambda function memory limits in MB:", context.memory_limit_in_mb)
    # We have added a 1 second delay so you can see the time remaining in get_remaining_time_in_millis.
    time.sleep(1) 
    print("Lambda time remaining in MS:", context.get_remaining_time_in_millis())
				
			
Outra função lambda

Esta outra função lambda faz a saudação a partir de uma país.

				
					import json

def lambda_handler(event, context):
    print(event)
    return 'Hello World from ' + event['country']
				
			

Esta função espera que em “event” seja passado o nome de um país.

Executar um teste.

Verificar o resultado.

Criando método POST

Usar a API criada anteriormente para criar um método POST que irá receber no corpo da solicitação a referência do país.

Na console do API Gateway, encontrar a API que criamos.

Criar o método POST e configurar para que a lambda HelloWorldFromCountry seja invocada.

Fazer o deploy da API.

Copiar a URL do método POST.

É importante observar duas coisas:

  1. As URL de GET e POST são iguais. Isto significa que o irá diferenciar uma requisição de outra é o método sendo utilizado.
  2. O método POST está esperando que no corpo da requisição esteja presente a indicação do país. Se a URL for inserida na barra de endereço do browser, por padrão, ele irá fazer uma requisição com o método GET, então, iremos utilizar o Postman para fazer requisições para esta URL usando o método POST.
Usando o Postman

Será utilizado o Postman para realizar um teste com API e o método POST.

No Postman → Colar a URL → Selecionar POST → Body → raw → JSON → Editar o corpo da requisição → Send.

Verificar o resultado da chamada da API.

Modifque o método para GET e verifique que o resultado é o mesmo que quando usando o browser.

Query Parameters

Encontramos query parameters em uma URL após o ponto de interrogação. Por exemplo, em https://www.google.com/search?q=teste, a string após “?” é uma query parameter.

Query parameters são usadas para enviar parâmetros em um método GET.

GET vs POST – POST é um método mais seguro para enviar dados em uma requisição HTTP. Enviar dados na URL não oferece nenhum tipo de segurança, enquanto que com o POST os dados podem ser trafegados pelo corpo da requisição e utilizando o protocolo seguro HTTPS os dados em body estarão criptografados.

Query Parameters e método GET no API Gateway

Para este teste será criada uma nova API chamada HelloWorldFromGet e utilizaremos a API HelloWorldFromCountryv01.

Na console API → Create API → REST API → Build → HelloWorldFromGet → Create API

Actions → Create method → Selecionar lambda → Save

Method Request

Add query string → Name: nomedopais → Required: Yes → Request Validator: Validate query string parameters and headers

Esta configuração está indicando para o API que ele deve considerar um query parameter chamado nomedopais e que ele deve ser obrigatória.

Embora informar ao API Gateway que ele deve considerar um query parameter, isto não é suficiente para que a função lambda entenda o que deve ser usado para montar sua resposta.

O componente Integration Request é o responsável por traduzir para a função lambda como utilizar o query parameter que foi configurado em Method Request. Ele é que irá orientar o API Gateway a pegar o query parameter e passar como o argumento “event” para a função lambda.

De volta da API selecione Integration Request.

Mapping Templates → When there are no templates defined → Add mapping template → application/json → Confirme

Entre com o seguinte código do Apache Velocity e clique em Save.

Isto basicamente diz para o API Gateway pegar o query parameter “nomedopais” e passar como country no argumento “event” da função lambda.

				
					{"country":"$input.params('nomedopais')"}
				
			

Faça o deploy da API e copie a URL gerada.

Usar a URL no postman retorna um erro, pois na definição da API havíamos informado que a query string “nomedopais” era obrigatória.

Para que a requisição funcione é preciso adicionar ?nomedopais=USA ao final da URL.

It’s done!

Bruno Veiga

Bruno Veiga

Arquiteto Cloud e Arquiteto de Soluções. Me dedicando em compartilhar conhecimento e ajudar empresas a encontrar as melhores soluções tecnológicas para os problemas do negócio com agilidade, segurança, equipes alinhadas e dentro do orçamento.