AWS Builder Center
O código que roda sem servidor

O código que roda sem servidor

Lambda é um serviço que executa a sua função quando algo acontece. Você entrega o código; a AWS decide onde rodar, quantas cópias subir e quando desligar.

Series: Minicurso | Construindo um encurtador de URL serverless na AWS (6 articles)

  1. …
  2. 4
    O código que roda sem servidor This article
cloudops
Parte da série Construindo um encurtador de URL serverless na AWS.
Temos um site e uma tabela. Falta o que fica no meio.

Como funciona

Sua função recebe dois argumentos: o evento (um dicionário com o que aconteceu) e o contexto (dados da execução). Ela processa e retorna.
Três ideias que mudam como você escreve código:
A função não sabe quem a chamou. Para o Lambda, tudo é um dicionário. Requisição HTTP, mensagem de fila, alteração no banco, tudo chega como JSON. É quem configura o gatilho que define o formato.
Ela não guarda nada entre execuções. Variável global às vezes sobrevive, às vezes não. Estado vai para o banco.
Permissão é explícita e não vem de graça. Toda função executa com uma role do IAM. Sem permissão declarada, qualquer chamada à AWS falha com AccessDenied.

Onde entra no encurtador

Uma função trata as três rotas HTTP:
RotaO que faz
POST /shortengera um ID curto e grava na tabela
GET /urlslista os links
GET /{shortId}busca a URL longa e redireciona
Por que uma função e não três. O critério para separar não é a URL, é o gatilho e o ciclo de vida. As três reagem ao mesmo gatilho (HTTP, síncrono), escalam juntas e falham juntas. São uma função.
No artigo 5 você vai criar a segunda função, e aí o critério fica visível: ela é separada porque reage a outro gatilho, tem outro perfil de falha e pode ser repetida sem ninguém esperando do outro lado.

Hands-on

1. Criar a função

Console → Lambda → Create function.
  • Author from scratch
  • Function name: url-shortener-api
  • Runtime: Python 3.14
  • ARM64 architecture: Marque
  • Create function
⚠️ No AWS Academy Learner Lab, abra Change default execution role e escolha Use an existing role → LabRole. O Lab nega iam:CreateRole, então a criação padrão falha. Veja a nota ao final deste artigo.
a tela de criação com runtime e nome preenchidos
a tela de criação com runtime e nome preenchidos

2. Colar o código

Aba Code → abra lambda_function.py → apague tudo → cole o conteúdo de url-shortener/lambdas/api.py → Deploy.
O despacho fica no topo do arquivo:
1
2
3
4
5
6
7
8
9
ROTAS = {
"POST /shorten": _criar,
"GET /urls": _listar,
"GET /{shortId}": _redirecionar,
}

def lambda_handler(event, context):
tratar = ROTAS.get(event.get("routeKey"))
...
É um espelho literal das rotas que você vai criar no artigo 4. Método HTTP sozinho não serviria: /urls e /{shortId} são os dois GET. O que separa sem ambiguidade é o routeKey, que o API Gateway entrega já resolvido.

3. Variáveis de ambiente

Configuration → Environment variables → Edit → Add:
ChaveValor
TABELA_NOMEurl-shortener-urls
FILA_URLdeixe em branco por enquanto, ela entra no artigo 5
Nome de tabela não vai hardcoded no código: muda por ambiente, e código que muda por ambiente não é código, é configuração.

5. Testar

Aba Test → Create new event → nome CriarLink → cole:
1
2
3
4
5
6
7
8
{
"routeKey": "POST /shorten",
"body": "{\"url\": \"https://aws.amazon.com\"}",
"requestContext": {
"domainName": "exemplo.execute-api.us-east-1.amazonaws.com",
"stage": "$default"
}
}
Test. Você deve ver statusCode: 201 e um shortId. Confira na tabela: o item está lá.
o resultado do teste, com o corpo da resposta expandido
o resultado do teste, com o corpo da resposta expandido

6. Ver os logs

Aba Monitor → View CloudWatch logs. Cada execução gerou um registro, e você não configurou nada para isso.

O que pode dar errado (e por quê)

Runtime.HandlerNotFound: Handler 'lambda_handler' missing. O console cria a função esperando lambda_function.lambda_handler. Se o seu código define def handler(...), não bate. Duas saídas: renomear a função no código (melhor, porque não acrescenta passo) ou mudar em Runtime settings → Handler.
Object of type Decimal is not JSON serializable. É o tipo numérico do DynamoDB chegando no json.dumps. Por isso o código converte com int() antes de responder. Sem isso, sua rota de listagem devolve 500.
Timeout de 3 segundos. É o padrão, e é pouco quando há chamada externa. O sintoma é Task timed out after 3.00 seconds nos logs.

Como isso sustenta serverless

Uma função que não é chamada custa zero. Não há processo ocioso, nem instância reservada "por garantia". O custo nasce no evento e morre com ele.
E o escalonamento não é seu problema: se chegarem mil requisições ao mesmo tempo, a AWS sobe mil execuções. Você não configurou nada, e não existe um número máximo que você precise estimar com antecedência.
O preço disso é alguma disciplina: sem estado e sem permissão implícita. As duas coisas que mais incomodam no começo acabam sendo as que permitem o resto.

Nota: IAM no AWS Academy Learner Lab

No Learner Lab, iam:CreateRole e iam:AttachRolePolicy são negados, inclusive na própria LabRole. Ou seja, o passo 4 não é possível ali.
O caminho é escolher Use an existing role → LabRole na criação, e a função já funciona, porque a LabRole é bastante permissiva.

O que ainda não dá para fazer

A função existe, mas só você consegue executá-la, pelo botão Test. O navegador não tem como chegar até ela: não há endereço, não há HTTP, não há porta de entrada.

Series: Minicurso | Construindo um encurtador de URL serverless na AWS (6 articles)

  1. …
  2. 4
    O código que roda sem servidor This article
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article