Funções Serverless em TypeScript: AWS Lambda do A ao Z

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Funções Serverless em TypeScript: Guia Completo de AWS Lambda



A arquitetura Serverless revolucionou a abordagem ao desenvolvimento de backend. Em vez de gerenciar servidores, os desenvolvedores podem se concentrar exclusivamente na lógica de negócios. AWS Lambda é um dos serviços mais populares para executar funções serverless. Neste guia, abordaremos a criação, configuração e deploy de funções Lambda em TypeScript — desde conceitos básicos até soluções de produção.



Por que TypeScript para AWS Lambda?



TypeScript adiciona tipagem estática ao JavaScript, o que é crucial para funções serverless:



  • Segurança de tipos — previne erros em tempo de compilação
  • Autocompletar — a IDE sugere métodos do AWS SDK
  • Legibilidade — interfaces e tipos documentam a estrutura dos dados
  • Escalabilidade — mais fácil manter o código à medida que o projeto cresce


Configuração do Projeto



1. Inicialização e instalação de dependências



Crie um novo projeto e instale os pacotes necessários:



mkdir my-lambda-projectcd my-lambda-projectnpm init -y

npm install @types/aws-lambda aws-sdknpm install -D typescript ts-node @types/node


2. Configuração do TypeScript



Crie o arquivo tsconfig.json:



{  "compilerOptions": {    "target": "ES2020",    "module": "commonjs",    "lib": ["ES2020"],    "outDir": "./dist",    "rootDir": "./src",    "strict": true,    "esModuleInterop": true,    "skipLibCheck": true,    "forceConsistentCasingInFileNames": true,    "resolveJsonModule": true,    "declaration": true,    "declarationMap": true,    "sourceMap": true  },  "include": ["src/**/*"],  "exclude": ["node_modules", "dist"]}


Criando a Primeira Função Lambda



Estrutura básica do handler



Crie o arquivo src/handler.ts:



import { Handler, APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';

interface UserData { userId: string; name: string; email: string;}

export const handler: Handler<APIGatewayProxyEvent, APIGatewayProxyResult> = async (event) => { try { // Parse do corpo da requisição const body: UserData = JSON.parse(event.body || '{}'); // Validação if (!body.userId || !body.name) { return { statusCode: 400, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify({ error: 'Campos obrigatórios ausentes' }) }; }

// Lógica de negócios const result = { id: body.userId, displayName: body.name.toUpperCase(), createdAt: new Date().toISOString() };

return { statusCode: 200, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify(result) }; } catch (error) { console.error('Erro ao processar requisição:', error); return { statusCode: 500, body: JSON.stringify({ error: 'Erro interno do servidor' }) }; }};


Trabalhando com ambiente e segredos



Use variáveis de ambiente para configuração:



import { Handler } from 'aws-lambda';

interface Config { DB_TABLE: string; MAX_RETRIES: number;}

export const handler: Handler = async (event) => { const config: Config = { DB_TABLE: process.env.DB_TABLE || 'tabela-padrao', MAX_RETRIES: parseInt(process.env.MAX_RETRIES || '3', 10) };

// Use AWS Secrets Manager ou Parameter Store // para dados sensíveis return { statusCode: 200, body: JSON.stringify({ table: config.DB_TABLE }) };};


Técnicas Avançadas



1. Processamento

Blogs

Book Recommendations