Cloud & Infraestrutura

Como Usar API Gateway: REST API, HTTP API e WebSocket API na Prática em Produção

8 min de leitura

Como Usar API Gateway: REST API, HTTP API e WebSocket API na Prática em Produção

Entendendo as Três Arquiteturas do API Gateway O AWS API Gateway oferece três modelos distintos para expor suas aplicações: REST API, HTTP API e WebSocket API. Cada uma serve a um propósito específico e escolher a correta impacta diretamente na performance, custo e capacidade de manutenção em produção. A REST API é a mais tradicional e robusta, ideal para aplicações complexas que precisam de recursos avançados como autorização granular e transformação de requisições. A HTTP API é uma versão otimizada e mais barata, perfeita para microsserviços simples e APIs modernas. A WebSocket API permite comunicação bidirecional em tempo real, essencial para chats, notificações push e dashboards ao vivo. Em produção, você raramente usará apenas uma. Uma arquitetura típica combina REST API para operações CRUD tradicionais e WebSocket para notificações em tempo real. O HTTP API fica reservado para endpoints de alto volume com lógica simples. Entender quando usar cada uma é a primeira decisão arquitetural crítica. REST API: O Padrão

<h2>Entendendo as Três Arquiteturas do API Gateway</h2>

<p>O AWS API Gateway oferece três modelos distintos para expor suas aplicações: REST API, HTTP API e WebSocket API. Cada uma serve a um propósito específico e escolher a correta impacta diretamente na performance, custo e capacidade de manutenção em produção. A REST API é a mais tradicional e robusta, ideal para aplicações complexas que precisam de recursos avançados como autorização granular e transformação de requisições. A HTTP API é uma versão otimizada e mais barata, perfeita para microsserviços simples e APIs modernas. A WebSocket API permite comunicação bidirecional em tempo real, essencial para chats, notificações push e dashboards ao vivo.</p>

<p>Em produção, você raramente usará apenas uma. Uma arquitetura típica combina REST API para operações CRUD tradicionais e WebSocket para notificações em tempo real. O HTTP API fica reservado para endpoints de alto volume com lógica simples. Entender quando usar cada uma é a primeira decisão arquitetural crítica.</p>

<h2>REST API: O Padrão Robusto para Produção</h2>

<p>A REST API é a escolha natural para a maioria das aplicações corporativas. Ela oferece controle fino sobre autenticação, autorização, limitação de taxa, validação de schemas e transformação de requisições. Seu custo é ligeiramente maior, mas a segurança e flexibilidade justificam para sistemas que processam dados sensíveis.</p>

<pre><code class="language-yaml"># Exemplo de configuração REST API com CloudFormation

AWSTemplateFormatVersion: &#039;2010-09-09&#039;

Resources:

MyRestApi:

Type: AWS::ApiGateway::RestApi

Properties:

Name: ProdutoAPI

Description: API REST em Produção

EndpointConfiguration:

Types:

  • REGIONAL

ProdutosResource:

Type: AWS::ApiGateway::Resource

Properties:

RestApiId: !Ref MyRestApi

ParentId: !GetAtt MyRestApi.RootResourceId

PathPart: produtos

GetProdutosMethod:

Type: AWS::ApiGateway::Method

Properties:

RestApiId: !Ref MyRestApi

ResourceId: !Ref ProdutosResource

HttpMethod: GET

AuthorizationType: AWS_IAM

Integration:

Type: AWS_PROXY

IntegrationHttpMethod: POST

Uri: !Sub &#039;arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ProdutosLambda.Arn}/invocations&#039;</code></pre>

<p>A integração com Lambda via proxy (AWS_PROXY) é o padrão recomendado em 2024. Ela passa toda a requisição HTTP como evento para a função Lambda, permitindo que você processe Headers, Query Strings e Body sem transformações manuais no API Gateway. Implemente autenticação usando API Keys ou AWS IAM para endpoints críticos, e sempre ative logging CloudWatch para auditoria em produção.</p>

<h2>HTTP API: Velocidade e Economia de Custo</h2>

<p>A HTTP API é 71% mais barata que a REST API e possui latência significativamente menor. Ideal quando você precisa apenas das operações básicas HTTP sem recursos avançados como mapeamento de modelos ou autorização granular. Para microsserviços e APIs públicas de alto volume, ela é a escolha óbvia.</p>

<pre><code class="language-javascript">// Exemplo de Lambda integrado com HTTP API

export const handler = async (event) =&gt; {

console.log(&#039;Event:&#039;, JSON.stringify(event, null, 2));

try {

// HTTP API passa o corpo como string

const body = typeof event.body === &#039;string&#039;

? JSON.parse(event.body)

: event.body;

if (!body.nome || !body.preco) {

return {

statusCode: 400,

headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },

body: JSON.stringify({ erro: &#039;Nome e preço são obrigatórios&#039; })

};

}

// Simular salvamento no banco

const produto = {

id: Math.random().toString(36).substr(2, 9),

...body,

dataCriacao: new Date().toISOString()

};

return {

statusCode: 201,

headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },

body: JSON.stringify(produto)

};

} catch (error) {

return {

statusCode: 500,

body: JSON.stringify({ erro: &#039;Erro ao processar requisição&#039; })

};

}

};</code></pre>

<p>Configure a HTTP API via Terraform para produção com stage variables que separam ambientes:</p>

<pre><code class="language-hcl">resource &quot;aws_apigatewayv2_api&quot; &quot;http_api&quot; {

name = &quot;produtos-api-http&quot;

protocol_type = &quot;HTTP&quot;

cors_configuration {

allow_origins = [&quot;https://seu-dominio.com&quot;]

allow_methods = [&quot;GET&quot;, &quot;POST&quot;, &quot;PUT&quot;, &quot;DELETE&quot;]

allow_headers = [&quot;Content-Type&quot;, &quot;Authorization&quot;]

}

}

resource &quot;aws_apigatewayv2_stage&quot; &quot;prod&quot; {

api_id = aws_apigatewayv2_api.http_api.id

name = &quot;prod&quot;

auto_deploy = true

default_route_settings {

throttling_burst_limit = 5000

throttling_rate_limit = 2000

}

}</code></pre>

<h2>WebSocket API: Comunicação Real-Time em Escala</h2>

<p>A WebSocket API mantém conexões persistentes, permitindo que o servidor envie mensagens ao cliente sem esperar por requisições. Essencial para chats, notificações em tempo real e colaboração ao vivo. A complexidade está em gerenciar o ciclo de vida das conexões: connect, message e disconnect.</p>

<pre><code class="language-python"># Lambda para manipular eventos WebSocket

import json

import boto3

import os

apigateway_client = boto3.client(&#039;apigatewayv2&#039;)

CONNECTION_TABLE = os.environ[&#039;CONNECTION_TABLE&#039;]

dynamodb = boto3.resource(&#039;dynamodb&#039;)

def lambda_handler(event, context):

route_key = event[&#039;requestContext&#039;][&#039;routeKey&#039;]

connection_id = event[&#039;requestContext&#039;][&#039;connectionId&#039;]

if route_key == &#039;$connect&#039;:

Armazenar conexão ativa

table = dynamodb.Table(CONNECTION_TABLE)

table.put_item(Item={&#039;connectionId&#039;: connection_id})

return {&#039;statusCode&#039;: 200}

elif route_key == &#039;$disconnect&#039;:

Remover conexão encerrada

table = dynamodb.Table(CONNECTION_TABLE)

table.delete_item(Key={&#039;connectionId&#039;: connection_id})

return {&#039;statusCode&#039;: 200}

elif route_key == &#039;sendMessage&#039;:

Broadcast para todos os clientes conectados

body = json.loads(event[&#039;body&#039;])

table = dynamodb.Table(CONNECTION_TABLE)

connections = table.scan()[&#039;Items&#039;]

for conn in connections:

try:

apigateway_client.post_to_connection(

ConnectionId=conn[&#039;connectionId&#039;],

Data=json.dumps({

&#039;tipo&#039;: &#039;mensagem&#039;,

&#039;conteudo&#039;: body[&#039;mensagem&#039;],

&#039;timestamp&#039;: int(time.time())

})

)

except Exception as e:

print(f&quot;Erro ao enviar para {conn[&#039;connectionId&#039;]}: {str(e)}&quot;)

return {&#039;statusCode&#039;: 200}</code></pre>

<p>A estratégia de armazenar IDs de conexão no DynamoDB é essencial. Configure o TTL automático para evitar dados obsoletos de conexões que não desconectaram corretamente. Para aplicações com milhões de conexões simultâneas, considere usar sharding ou Redis para armazenar conexões, não DynamoDB.</p>

<h2>Padrões de Segurança e Deployment em Produção</h2>

<p>Em produção, sempre implemente throttling e rate limiting no API Gateway, não confie apenas na Lambda. Configure custom domain names com certificados ACM para HTTPS e use WAF (Web Application Firewall) para bloquear ataques comuns. Implemente versionamento via stage variables para não quebrar clientes antigos ao fazer deploy de mudanças.</p>

<pre><code class="language-bash"># Deployment seguro via AWS CLI

aws apigateway create-deployment \

--rest-api-id abc123 \

--stage-name prod \

--stage-variable version=v2 \

--description &quot;Versão 2.0 com autenticação JWT&quot;

Monitorar CloudWatch

aws logs tail /aws/apigateway/ProdutoAPI --follow</code></pre>

<h2>Conclusão</h2>

<p>Você aprendeu que <strong>REST API é para controle e segurança</strong>, <strong>HTTP API para velocidade e economia</strong>, e <strong>WebSocket API para real-time</strong>. Em produção, a decisão não é &quot;qual usar&quot;, mas &quot;como combinar as três&quot;. Use REST API como camada principal, HTTP API para endpoints de alto volume e WebSocket apenas quando necessário bidirecionalidade verdadeira. Sempre implemente throttling, logging e monitoramento desde o primeiro dia, pois problemas de API Gateway em produção afetam toda sua aplicação.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/apigateway/" target="_blank" rel="noopener noreferrer">AWS API Gateway Documentation</a></li>

<li><a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html" target="_blank" rel="noopener noreferrer">AWS API Gateway Best Practices</a></li>

<li><a href="https://aws.amazon.com/pt/api-gateway/pricing/" target="_blank" rel="noopener noreferrer">Comparing API Gateway Types</a></li>

<li><a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/websocket-api.html" target="_blank" rel="noopener noreferrer">WebSocket API Real-Time Applications</a></li>

<li><a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-function-reuse.html" target="_blank" rel="noopener noreferrer">API Gateway with Lambda Proxy Integration</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

Dominando EC2 em Profundidade: Instance Types, AMIs e Placement Groups em Projetos Reais
Dominando EC2 em Profundidade: Instance Types, AMIs e Placement Groups em Projetos Reais

Instance Types: Escolhendo a Máquina Correta Os tipos de instância EC2 são or...

VPN e Direct Connect: Conectividade Híbrida com a AWS: Do Básico ao Avançado
VPN e Direct Connect: Conectividade Híbrida com a AWS: Do Básico ao Avançado

Fundamentos de Conectividade Híbrida na AWS A conectividade híbrida conecta s...

O que Todo Dev Deve Saber sobre Systems Manager: Parameter Store, Session Manager e Patch Manager
O que Todo Dev Deve Saber sobre Systems Manager: Parameter Store, Session Manager e Patch Manager

Systems Manager: Uma Visão Prática para Developers O AWS Systems Manager é um...