Skip to content

Deployment

Provisionamento via AWS CDK e variáveis de ambiente.


Stack CDK

Arquivo: infra/whatsapp-bot-stack.ts

RecursoDescrição
BotFunctionNodejsFunction ARM64, Node.js 20, 256MB, timeout 30s, tracing X-Ray
BotLogGroup/aws/lambda/contrasync-whatsapp-bot-{stage} retenção 7 dias
BotHttpApiAPI Gateway HTTP API com rotas /webhook e /health
BotErrorsAlarmAlarm CloudWatch quando Lambda errors ≥ 3 em 5 min
BotThrottlesAlarmAlarm quando Lambda throttles ≥ 1 em 5 min

Outputs:

OutputDescrição
BotApiUrlURL base do API Gateway (configurar no painel Z-API)
BotFunctionNameNome do Lambda

Tags: service=contrasync-whatsapp-bot, stage={dev|prod}.


Bundling

NodejsFunction com esbuild:

  • format: CJS
  • minify: true
  • sourceMap: true + NODE_OPTIONS: --enable-source-maps
  • target: node20
  • externalModules: ['@aws-sdk/*']

Removal Policy

StageBotLogGroup
devDESTROY
prodRETAIN

Variáveis de Ambiente

NomeObrigatória em prod?DefaultDescrição
STAGEsimdev / prod
NODE_OPTIONSsim--enable-source-mapsSource maps em runtime
ZAPI_INSTANCE_IDsim''ID da instância Z-API
ZAPI_TOKENsim''Token da instância
ZAPI_CLIENT_TOKENsim''Client-Token do Account Security
ZAPI_BASE_URLnãohttps://api.z-api.ioBase URL do Z-API
CONTRASYNC_API_URLsim''URL da API NestJS (ex.: https://api.contrasync.com)
BOT_API_KEYsim''Shared secret enviado no header x-bot-api-key; precisa bater com o BOT_API_KEY do nest-api

resolveRequiredEnv() falha o cdk synth/deploy se alguma dessas estiver vazia em prod.

Gerando BOT_API_KEY

bash
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

Use o mesmo valor nos dois projetos (whatsapp-bot e nest-api). Em prod, gerencie via Secrets Manager, nunca commite.


Pipeline Local

bash
npm install
cp .env.example .env
# preencher ZAPI_*, CONTRASYNC_API_URL e BOT_API_KEY

npm run build        # tsc --noEmit
npm run test         # vitest run + coverage 100%
npm run cdk:synth    # valida CDK + bundling

npm run cdk:diff     # diff contra o stack
npm run cdk:deploy   # deploy

Dev Server Local

Para testar o handler localmente apontando para uma API NestJS rodando em localhost:8011:

bash
npm run dev        # sobe HTTP em http://localhost:3001

O scripts/dev-server.ts envelopa o handler em um servidor HTTP simples (sem AWS SAM, sem Docker). Cada request vira um APIGatewayProxyEventV2 antes de chamar o handler.

Para o Z-API entregar mensagens reais no dev server, tunele com ngrok:

bash
ngrok http 3001
# configurar webhook do Z-API em https://abc123.ngrok.io/webhook

Configuração Pós-Deploy

  1. Pegue o output BotApiUrl do cdk deploy
  2. No painel Z-API, configure o webhook "ao receber mensagem" apontando para {BotApiUrl}/webhook
  3. Configure BOT_API_KEY no Secrets Manager / .env da nest-api com o mesmo valor do Lambda
  4. Smoke test: curl {BotApiUrl}/health deve retornar {"status":"ok","service":"contrasync-whatsapp-bot"}

Documento atualizado em Maio 2026