
Construindo um Servidor MCP Serverless na AWS com Autenticação IAM
Aprenda a implantar um servidor MCP baseado em Lambda por tras do API Gateway com autenticacao SigV4, conecta-lo ao Kiro CLI via mcp-proxy-for-aws e consultar o DynamoDB usando suas credenciais AWS existentes.
Introdução
Assistentes de código com IA se tornam muito mais poderosos quando conseguem acessar os dados internos da sua empresa. Em vez de responder apenas com base nos dados de treinamento, eles podem consultar bancos de dados reais, recuperar documentação interna e fornecer respostas contextualizadas com base nos seus sistemas reais.
O Model Context Protocol (MCP) padroniza como agentes de IA se conectam a fontes de dados externas. Neste artigo, exploramos a arquitetura de um servidor MCP serverless na AWS que expõe um banco de dados DynamoDB através do API Gateway e Lambda, protegido com autenticação IAM. Em seguida, conectamos o Kiro CLI a esse servidor usando o mcp-proxy-for-aws , permitindo que o assistente de IA consulte dados internos usando as mesmas credenciais AWS que você já utiliza no dia a dia.
O código-fonte completo — infraestrutura Terraform, função Lambda, scripts de seed e configuração do agente Kiro CLI — está disponível no GitHub: https://github.com/biagolini/TerraformAwsMcpServerlessKiroCli
Se você prefere aprender lendo código, clone o repositório e siga o README. Este artigo foca no porquê e no como por trás da arquitetura.
Este artigo faz parte de uma série explorando as capacidades do Kiro CLI. Artigos anteriores cobriram desenvolvimento orientado a especificações , confiança de ferramentas , segredos MCP com macOS Keychain , .kiroignore e solução de problemas de terminal e múltiplas janelas .
Arquitetura da Solução
A arquitetura segue um padrão totalmente serverless com autenticação baseada em IAM:

Visão geral da arquitetura da solução mostrando como o Kiro CLI se conecta ao servidor MCP serverless através do mcp-proxy-for-aws, que assina requisições com SigV4 para autenticação IAM no API Gateway, encaminhando para o Lambda que consulta o DynamoDB
O fluxo da requisição quando um desenvolvedor pergunta "Mostre-me os SUVs disponíveis":
- Kiro CLI envia a mensagem para o modelo de linguagem
- O modelo decide chamar a ferramenta MCP
search_cars_by_type - Kiro CLI encaminha a chamada da ferramenta para o processo mcp-proxy-for-aws
- O proxy assina a requisição HTTP com SigV4 usando as credenciais AWS locais
- API Gateway HTTP API valida a assinatura e verifica as permissões IAM
- Lambda processa a requisição MCP e consulta o DynamoDB
- Os resultados retornam pela mesma cadeia de volta ao Kiro CLI
- O modelo formata os dados em uma resposta legível para o usuário
Todo o ciclo leva de 1 a 3 segundos, incluindo o cold start do Lambda na primeira invocação.
Por que Autenticação IAM?
Servidores MCP tradicionais frequentemente usam chaves de API ou tokens OAuth. A autenticação IAM oferece vantagens distintas para ambientes nativos AWS:
- Zero credenciais adicionais — desenvolvedores já possuem credenciais AWS configuradas para o trabalho diário
- Controle de acesso unificado — as mesmas políticas IAM que controlam o acesso aos recursos AWS também controlam o acesso ao servidor MCP
- Rotação automática de credenciais — o AWS SSO fornece credenciais temporárias que rotacionam automaticamente
- Universal — roles de instância EC2, roles de tarefa ECS, roles de execução Lambda e laptops de desenvolvedores usam o mesmo mecanismo
- Auditável — cada requisição é registrada no CloudTrail com a identidade do chamador
Para equipes corporativas, isso significa nenhum gerenciamento separado de tokens, nenhum segredo para rotacionar e nenhuma infraestrutura OAuth para manter.
Como o Servidor MCP Funciona
A função Lambda implementa o transporte MCP Streamable HTTP usando JSON-RPC 2.0. Ela trata três métodos principais do MCP:
| Método | Finalidade |
|---|---|
| initialize | Handshake — declara as capacidades do servidor |
| tools/list | Retorna as ferramentas disponíveis e seus schemas |
| tools/call | Executa uma ferramenta e retorna os resultados |
O servidor expõe três ferramentas:
| Ferramenta | Descrição |
|---|---|
| search_cars_by_type | Consulta carros por tipo de carroceria usando um GSI do DynamoDB |
| get_all_available_cars | Varre todo o inventário disponível |
| get_car_details | Obtém um carro específico pelo ID |
Cada ferramenta retorna seu resultado como um bloco de conteúdo JSON text dentro do envelope de resposta padrão do MCP. O modelo de IA então interpreta os dados brutos e os formata para o usuário.
Boas Práticas de Tratamento de Erros
A especificação MCP define o campo
isError: true nos resultados de ferramentas para reportar falhas de execução. Quando o servidor retorna uma mensagem de erro clara com essa flag, o modelo de IA naturalmente comunica a falha ao usuário sem necessidade de configuração especial no agente:1
2
3
4
5
6
{
"result": {
"content": [{"type": "text", "text": "Unauthorized: invalid credentials"}],
"isError": true
}
}
Na nossa arquitetura, requisições não autorizadas são rejeitadas pelo API Gateway antes de chegar ao Lambda (HTTP 403). O
mcp-proxy-for-aws propaga essa falha para o Kiro CLI, e a IA reporta ao usuário naturalmente.Arquitetura de Segurança
Defesa em Profundidade
A solução implementa múltiplas camadas de segurança:
- Camada de transporte — o
mcp-proxy-for-awsrequer credenciais AWS válidas para iniciar. Sem elas, as ferramentas MCP nem aparecem na lista de ferramentas do agente de IA. - Camada do API Gateway — a validação de assinatura SigV4 garante que apenas identidades AWS autenticadas possam alcançar o endpoint.
- Camada de política IAM — a permissão
execute-api:Invokecontrola quais identidades podem chamar a API. - Camada do Lambda — a função tem acesso somente leitura ao DynamoDB (princípio do menor privilégio).
Configuração do Agente como Fronteira de Segurança
Ao configurar o agente do Kiro CLI, restringir
tools apenas ao necessário impede que a IA tente contornar quando o servidor MCP não está disponível:1
2
3
4
{
"tools": ["read", "@cars-inventory"],
"allowedTools": ["read", "@cars-inventory"]
}
Sem acesso ao
shell, o agente não pode tentar descobrir credenciais, iterar sobre perfis ou burlar a camada de autenticação. Esta é uma boa prática crítica — sempre limite as ferramentas do agente ao conjunto mínimo necessário.Padrão de Acesso Universal
O mesmo endpoint funciona para todos os consumidores sem alterações no código:
| Consumidor | Fonte de Credencial |
|---|---|
| Laptop do desenvolvedor | aws sso login + perfil |
| Instância EC2 | Role de instância (automático) |
| Tarefa ECS | Role de tarefa (automático) |
| Função Lambda | Role de execução (automático) |
| Pipeline CI/CD | Role assumida |
Visão Geral da Infraestrutura
O código Terraform cria:
| Recurso | Finalidade |
|---|---|
| Tabela DynamoDB | Inventário de carros com hash key car_id e GSI body_type |
| Função Lambda | Python 3.12, lógica do servidor MCP |
| Role IAM | Execução do Lambda com acesso somente leitura ao DynamoDB |
| API Gateway HTTP API | Rota POST /mcp com autorização AWS_IAM |
A infraestrutura segue uma estrutura modular:
infrastructure/ contém o módulo Terraform reutilizável, environments/dev/ contém a configuração específica do ambiente. O estado é armazenado remotamente no S3.Para o código Terraform completo, veja o repositório no GitHub .
Deploy e Teste
Pré-requisitos
- AWS CLI configurado com um perfil
- Terraform >= 1.0
- uv gerenciador de pacotes
- Kiro CLI
- Conta AWS com permissões para criar DynamoDB, Lambda, API Gateway e recursos IAM
Deploy
Clone o repositório e navegue até a pasta do ambiente dev:
1
2
git clone https://github.com/biagolini/TerraformAwsMcpServerlessKiroCli.git
cd TerraformAwsMcpServerlessKiroCli/environments/dev
Copie os arquivos de configuração de exemplo e preencha com seu bucket S3, região e perfil AWS:
1
2
cp backend.hcl.example backend.hcl
cp terraform.tfvars.example terraform.tfvars
Inicialize o Terraform com a configuração do backend:
1
terraform init -backend-config=backend.hcl
Faça o deploy da infraestrutura:
1
terraform apply -auto-approve
Popular o Banco de Dados
Defina seu perfil AWS:
1
export AWS_PROFILE=seu-perfil
Execute o script de seed para popular o DynamoDB com dados de exemplo:
1
./seed/seed_cars.sh
Conceder Acesso à API
Anexe esta política à identidade IAM que consumirá o servidor MCP:
1
2
3
4
5
6
7
8
9
10
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:<regiao>:<account-id>:<api-id>/*"
}
]
}
O
api-id é exibido como output pelo Terraform.Teste: Comparação Lado a Lado
Abra dois terminais lado a lado para demonstrar a autenticação IAM em ação.
Terminal 1 — Com credenciais válidas:
1
2
3
4
aws sso login --sso-session nome-da-sua-sessao
export AWS_PROFILE=seu-perfil-aws
cd test/
kiro-cli chat --agent cars-agent
Terminal 2 — Sem credenciais:
1
2
3
# NÃO defina AWS_PROFILE
cd test/
kiro-cli chat --agent cars-agent
Em ambos os terminais, execute
/tools para verificar as ferramentas disponíveis:
Demonstração de que sem credenciais AWS válidas o mcp-proxy-for-aws não inicia e as ferramentas MCP não aparecem na lista de ferramentas do agente, comprovando que a autenticação IAM atua na camada de transporte
Esquerda: com credenciais válidas — 4 ferramentas disponíveis (read + 3 ferramentas MCP). Direita: sem credenciais — apenas 1 ferramenta (read). As ferramentas MCP nem carregam sem credenciais AWS válidas.
Em seguida, pergunte "Mostre-me todos os SUVs disponíveis" em ambos os terminais:

Resultado prático da autenticação IAM - com credenciais válidas o agente chama search_cars_by_type e retorna dados reais do DynamoDB, enquanto sem credenciais o agente reporta que não pode atender à solicitação por falta de acesso às ferramentas MCP
Esquerda: o agente chama
search_cars_by_type e retorna dados reais do inventário do DynamoDB. Direita: o agente reporta que as ferramentas MCP não estão disponíveis e não pode atender à solicitação.Isso demonstra que a autenticação IAM funciona na camada de transporte — sem credenciais válidas, o proxy não inicia, as ferramentas não aparecem e o agente nem consegue tentar acessar os dados.
Considerações para Produção
Escalando para Produção
Esta prova de conceito usa uma tabela DynamoDB simples com ~10 itens. Para produção:
- Adicione paginação para lidar com grandes conjuntos de dados
- Implemente cache com DynamoDB DAX ou cache no nível do Lambda
- Adicione alarmes do CloudWatch para latência e taxas de erro
- Considere concorrência provisionada para eliminar cold starts
Granularidade do Controle de Acesso
Políticas IAM podem restringir o acesso no nível da rota:
1
2
3
{
"Resource": "arn:aws:execute-api:us-east-1:123456789012:abc123/*/POST/mcp"
}
Você pode criar conjuntos de permissões diferentes para acesso somente leitura versus leitura e escrita se adicionar ferramentas de escrita ao servidor MCP.
Multi-Ambiente
Variáveis do Terraform facilitam o deploy de ambientes isolados:
1
terraform apply -var="environment=prod"
Cada ambiente recebe sua própria tabela DynamoDB, função Lambda e API Gateway.
Conclusão
Construir um servidor MCP serverless na AWS com autenticação IAM cria uma ponte segura e escalável entre assistentes de código com IA e dados internos. Os pontos-chave:
- IAM unifica o controle de acesso — a mesma cadeia de credenciais funciona para desenvolvedores, instâncias EC2, tarefas ECS e pipelines CI/CD
- Defesa em profundidade — validação de credenciais na camada de transporte, SigV4 no API Gateway, políticas IAM e roles Lambda com menor privilégio
- Restrição de ferramentas do agente é crítica — limitar ferramentas impede que a IA tente contornar quando a autenticação falha
- Flag
isErrordo MCP — respostas de erro claras permitem que a IA comunique falhas naturalmente sem configuração especial
O código-fonte completo está disponível em: https://github.com/biagolini/TerraformAwsMcpServerlessKiroCli
Mantenha-se Conectado
Se você achou este artigo útil e quer aprender mais sobre AWS, arquitetura de nuvem, IA, infraestrutura como código e segurança em nuvem, siga o autor para conteúdos e tutoriais futuros:
- LinkedIn: https://www.linkedin.com/in/biagolini
- Medium: https://medium.com/@biagolini
- GitHub: https://github.com/biagolini
- YouTube (PT-BR): https://www.youtube.com/@BiagoliniTech
Boas construções na AWS!
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article