Imagine um pequeno programa que só quer que se execute quando alguém o chama: receber o aviso de que um cliente pagou, processar um formulário de contacto, converter uma imagem. Não quer um servidor ligado 24 horas para isso. Para isso existe o Lambda: dá o seu código à Amazon, e a Amazon executa-o só quando é preciso e cobra-lhe só por esse bocado. Nada de máquinas para manter.
A pergunta é: como é que o chama? O mais universal é dar-lhe um endereço web, um URL como https://algo.on.aws/, de forma que qualquer navegador ou programa o possa "abrir" e o seu código responda. Este guia faz exatamente isso com a opção que o Lambda traz de série, chamada URL de função. Não é preciso instalar nem contratar mais nada.
Antes de começar: o que significa cada coisa
- Função Lambda
- Um pedaço de código seu (em Python, Node.js, etc.) guardado na Amazon, que se executa quando algo o chama e se desliga ao terminar. Paga por cada execução, não por ter algo ligado.
- URL
- Um endereço web, o que se escreve na barra do navegador. Aqui, o endereço pelo qual se pode chamar a sua função.
- Pedido e resposta
- Quando um navegador ou um programa abre um URL, envia um "pedido" (o que quer) e recebe uma "resposta" (o que lhe devolvem). A sua função recebe o pedido e fabrica a resposta.
- Webhook
- Um aviso automático que um serviço (por exemplo, a sua plataforma de pagamentos) envia para um URL seu quando acontece algo. Para o receber, precisa de um URL que responda: este guia dá-lho.
- API Gateway
- Outro serviço da Amazon, mais completo e mais complexo, que também serve para pôr um endereço web à frente de uma função. Durante anos era a única opção. Hoje, para a maioria dos casos simples, não é preciso, e este guia não o usa.
- CORS
- Uma regra de segurança dos navegadores: uma página web só pode chamar endereços de outros sites se esses sites o permitirem expressamente. Se a sua função vai ser chamada por uma página web sua, há que dizer ao Lambda que páginas o podem fazer.
- Registos (logs)
- O diário do que a sua função faz em cada execução: quanto demorou, se falhou e porquê. Guardam-se noutro serviço chamado CloudWatch.
Passo a passo
Confirme que a sua função sabe responder a um pedido web
Quando a função é chamada pelo seu endereço web, o Lambda entrega-lhe um pacote de dados com o pedido (o que pedia, com que dados) e espera que o seu código devolva uma resposta com duas coisas: um código de estado (200 quer dizer "tudo bem") e um corpo (o texto ou os dados que devolve). Se a sua função foi feita para outro uso, há que adaptá-la. Um exemplo mínimo, em Node.js, que responde "olá, mundo":
export const handler = async (event) => ({ statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ hola: "mundo" }) });Se não é você quem programa, passe este parágrafo a quem o faça: saberá o que significa.
Decida quem vai poder chamar a função
É a única decisão importante do guia, e convém entendê-la bem. Há duas opções:
- Só com credenciais da AWS (a opção chama-se
AWS_IAM): só a poderá chamar um programa seu que tenha permissões na sua conta da Amazon. É a mais segura, mas um navegador normal ou um serviço externo não a poderão usar. - Aberta (a opção chama-se
NONE): qualquer pessoa que conheça o endereço poderá chamá-la. É o que precisa se for chamada por um serviço externo (um webhook) ou por uma página web. Em troca, a segurança tem de ser posta pelo seu código: verificar uma palavra-passe ou uma assinatura em cada chamada. Vemos isso no último passo.
Regra simples: se não sabe qual escolher, escolha a primeira. Se a função tiver de receber chamadas de fora da sua conta, escolha a segunda e não salte o último passo.
- Só com credenciais da AWS (a opção chama-se
Ative o endereço web
Na consola da AWS entre em Lambda, abra a sua função e clique no separador Configuração. No menu da esquerda escolha URL da função e clique em Criar URL da função. Escolha o tipo de acesso do passo anterior.
Se for chamada por uma página web sua a partir de outro domínio, abra CORS e escreva o endereço dessa página em "Permitir origem" (por exemplo
https://miweb.com). Se puser um asterisco, qualquer site do mundo poderá chamá-la a partir do navegador; evite-o salvo se for isso que quer. Guarde. Em cima aparece o endereço novo, com este aspeto:https://xxxxxxxx.lambda-url.eu-west-1.on.aws/. Esse é o seu URL.Teste-o
Se escolheu a opção aberta, copie o endereço e cole-o no navegador: deverá ver a resposta da sua função (no exemplo, o texto "olá, mundo"). Já está a funcionar.
Se preferir testá-lo a partir de um terminal, no CloudShell (o ícone de terminal na barra superior da consola da AWS) escreva:
curl -i https://xxxxxxxx.lambda-url.eu-west-1.on.aws/Se escolheu a opção com credenciais, o navegador dirá "Forbidden": é o esperado, porque não leva credenciais. O teste terá de ser feito pelo programa seu que a vai chamar, usando as bibliotecas da AWS, que já sabem assinar os pedidos.
Veja o diário de execuções
Separador Monitorar, botão Visualizar logs do CloudWatch. Cada chamada deixa uma anotação com o que demorou e o que o seu código tiver escrito. Se uma chamada devolver um erro, aqui verá o motivo. Um conselho que poupa dinheiro: nesse grupo de registos, ponha uma retenção de, por exemplo, 30 dias; senão, os registos guardam-se para sempre e são cobrados.
Se a deixou aberta, proteja-a
Aberta quer dizer que qualquer pessoa a pode chamar, por isso o seu código deve verificar algo em cada chamada. O normal: o serviço que lhe envia o webhook inclui uma assinatura ou uma chave secreta em cada aviso, e a sua função verifica que está correta antes de fazer seja o que for. Guarde essa chave nas variáveis de ambiente da função (separador Configuração), não escrita no código.
E ponha um limite a quantas vezes pode executar-se ao mesmo tempo (simultaneidade reservada, em Configuração): se alguém bombardear o endereço, o limite evita que a fatura dispare.
O que pode correr mal
A página web diz algo sobre "CORS" e não recebe resposta
É o navegador a proteger o utilizador: a sua função não disse que essa página a pode chamar. Edite o URL da função, secção CORS, e acrescente o endereço exato da sua página e o tipo de pedido que usa (GET, POST). Se o seu código também devolver cabeçalhos CORS por conta própria, retire-os de um dos dois sítios: duplicados também falham.
Devolve "Forbidden" apesar de a ter deixado aberta
Falta à função a permissão que deixa que qualquer pessoa a chame. Ao criar o URL a partir da consola, ela é acrescentada sozinha; se foi criado por um programa ou um script, peça a quem o fez que acrescente a permissão lambda:InvokeFunctionUrl para o público (principal *).
A primeira chamada demora vários segundos e depois vai rápido
Chama-se "arranque a frio": se a função está há um bocado sem ser usada, a Amazon tem de a carregar de novo. Para um webhook é indiferente. Para um site com utilizadores à espera, pode reduzir-se tornando a função mais pequena ou pagando para a ter sempre pronta (simultaneidade provisionada).
Preciso que o endereço seja do meu domínio, ou de controlar quem chama e quanto
Para isso já é preciso o API Gateway, o serviço mais completo que mencionámos no início, ou pôr o CloudFront à frente. O URL de função é a via curta e para a maioria chega; quando ficar curto, vai notar.
No Simplio
No Simplio as suas funções Lambda aparecem com o seu estado e os seus registos numa lista; se estiverem em Python, Node.js ou Ruby pode editar o código, guardar com o duplo fator e testá-las no momento vendo a resposta. E dar-lhes um endereço web é um clique, com o tipo de acesso explicado em claro. Cada pessoa da sua equipa vê só as funções que lhe atribuir.
O mesmo, na AWS e no Simplio
| Na consola da AWS | No Simplio | |
|---|---|---|
| Dar o endereço web à função | Lambda, Configuração, URL da função, tipo de acesso, CORS: 5 passos | Botão "URL público" na função, com o tipo de acesso explicado: 1 clique |
| Testá-la e ver o que devolveu | Navegador ou curl, e CloudWatch para os registos | Testar a partir do Simplio vendo resposta e registos no mesmo ecrã |
| Mudar o código | Editor do Lambda, sem controlo de quem lhe mexeu | Editor com duplo fator ao guardar, e registo de atividade |