Navegação
Objetivo
Neste post iremos falar sobre os princípios do AWS API Gateway e sua utilização com funções lambda.
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())
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:
- 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.
- 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!