Pular para conteúdo

AWS Lambda - Integração com AWS Lambda Functions

Este diretório contém a documentação completa das tools de integração com AWS Lambda, o serviço serverless de computação da Amazon Web Services.

O que é AWS Lambda?

AWS Lambda é um serviço de computação serverless que permite executar código sem provisionar ou gerenciar servidores. Você paga apenas pelo tempo de computação consumido.

Tools Disponíveis

✅ Documentadas (3/3)

  1. lambda_invoke - Invocar função Lambda (síncrona ou assíncrona)
  2. lambda_invoke_async - Invocar Lambda assíncrona (⚠️ DESCONTINUADA - use invoke com Event)
  3. lambda_list - Listar todas as funções Lambda da conta/região

Casos de Uso Comuns

1. Executar Lógica Serverless

{
  "type": "aws_lambda",
  "parameters": {
    "operation": "invoke",
    "functionName": "processar-dados",
    "invocationType": "RequestResponse",
    "payload": { "dados": "valor" }
  }
}

2. Disparar Processamento Background

{
  "type": "aws_lambda",
  "parameters": {
    "operation": "invoke",
    "functionName": "enviar-relatorio",
    "invocationType": "Event",
    "payload": { "usuario_id": 123 }
  }
}

3. Listar Lambdas Disponíveis

{
  "type": "aws_lambda",
  "parameters": {
    "operation": "listFunctions",
    "maxItems": 20
  }
}

Configuração Inicial

1. Credenciais AWS

Obtenha Access Key e Secret Key no AWS IAM:

  1. AWS Console → IAM → Users
  2. Security Credentials → Create Access Key
  3. Salve Access Key ID e Secret Access Key

2. Permissões IAM Necessárias

Política mínima para usar as tools Lambda:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction",
        "lambda:ListFunctions"
      ],
      "Resource": "*"
    }
  ]
}

3. Regiões AWS

Especifique a região onde suas Lambdas estão:

  • us-east-1 - Virginia (padrão AWS)
  • us-west-2 - Oregon
  • sa-east-1 - São Paulo
  • eu-west-1 - Irlanda

Tipos de Invocação

RequestResponse (Síncrono)

  • ✅ Aguarda execução completa
  • ✅ Retorna resultado imediato
  • ⏱️ Timeout máximo: 15 minutos
  • 📦 Payload máximo: 6 MB

Event (Assíncrono)

  • ✅ Executa em background
  • ✅ Não aguarda resposta
  • 🔄 Retry automático (2x)
  • 📦 Payload máximo: 256 KB

DryRun (Validação)

  • ✅ Valida permissões
  • ❌ Não executa função
  • 🔐 Testa acesso

Estrutura de Resposta

Invoke (Síncrono)

{
  "success": true,
  "statusCode": 200,
  "payload": {
    "resultado": "dados retornados pela Lambda"
  }
}

Invoke (Assíncrono)

{
  "success": true,
  "statusCode": 202,
  "payload": null
}

List Functions

{
  "success": true,
  "functions": [
    {
      "FunctionName": "minha-funcao",
      "Runtime": "nodejs20.x",
      "MemorySize": 256,
      "Timeout": 30
    }
  ]
}

Exemplo Completo: Flow com Lambda

{
  "name": "Processar Pedido com Lambda",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "ID do Pedido",
        "parameters": {
          "message": "Digite o ID do pedido:",
          "variable": "pedido_id"
        }
      }
    },
    {
      "id": "lambda_1",
      "type": "aws_lambda",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Processar Pedido",
        "parameters": {
          "operation": "invoke",
          "accessKeyId": "{{aws_access_key}}",
          "secretAccessKey": "{{aws_secret_key}}",
          "region": "us-east-1",
          "functionName": "processar-pedido",
          "invocationType": "RequestResponse",
          "payload": {
            "pedido_id": "{{pedido_id}}"
          }
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Pedido Aprovado?",
        "parameters": {
          "variable": "lambda_payload.aprovado",
          "operator": "equals",
          "value": true
        }
      }
    },
    {
      "id": "message_sim",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Pedido {{pedido_id}} aprovado! Total: R$ {{lambda_payload.total}}"
        }
      }
    },
    {
      "id": "message_nao",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Erro",
        "parameters": {
          "message": "Pedido rejeitado: {{lambda_payload.motivo}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "lambda_1" },
    { "source": "lambda_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_sim", "label": "true" },
    { "source": "condition_1", "target": "message_nao", "label": "false" },
    { "source": "message_sim", "target": "end_1" },
    { "source": "message_nao", "target": "end_1" }
  ]
}

Boas Práticas

✅ Fazer

  • Use variáveis para credenciais AWS (nunca hardcode)
  • Configure timeout adequado na Lambda (não no flow)
  • Use RequestResponse quando precisa do resultado
  • Use Event para tarefas longas ou background
  • Trate erros verificando lambda_payload.error
  • Valide credenciais com DryRun antes de produção
  • Cache resultado de listFunctions se usar múltiplas vezes

❌ Não Fazer

  • Nunca commite accessKeyId/secretAccessKey no código
  • Não use RequestResponse para processos > 15 minutos
  • Não envie payloads maiores que os limites
  • Não use invokeAsync (descontinuado - use invoke com Event)
  • Não liste Lambdas repetidamente sem necessidade
  • Não exponha lista de Lambdas a usuários finais

Segurança

Credenciais

{
  "type": "variable",
  "parameters": {
    "variables": {
      "aws_access_key": "AKIAIOSFODNN7EXAMPLE",
      "aws_secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
    }
  }
}

Least Privilege

Configure IAM com apenas as permissões necessárias:

{
  "Effect": "Allow",
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:us-east-1:123456789012:function:minha-funcao"
}

Custos AWS Lambda

  • Invocações: $0.20 por 1 milhão de invocações
  • Duração: $0.0000166667 por GB-segundo
  • Free Tier: 1 milhão de invocações + 400.000 GB-segundos/mês

Exemplo: 100.000 invocações de 500ms com 256MB = ~$0.40/mês

Monitoramento

CloudWatch Logs

Todas as invocações geram logs automaticamente:

  1. AWS Console → CloudWatch → Log Groups
  2. /aws/lambda/nome-da-funcao
  3. Visualize execuções, erros e logs customizados

Métricas

  • Invocations: Total de execuções
  • Duration: Tempo médio de execução
  • Errors: Quantidade de erros
  • Throttles: Invocações limitadas por concorrência

Troubleshooting

Erro: "User is not authorized to perform lambda:InvokeFunction"

Causa: Credenciais sem permissão

Solução: Adicione política IAM com lambda:InvokeFunction

Erro: "Function not found"

Causa: Lambda não existe ou está em outra região

Solução: Verifique FunctionName e region corretos

Erro: "Task timed out after X seconds"

Causa: Lambda excedeu timeout configurado

Solução: Aumente timeout na configuração da Lambda (AWS Console)

Erro: "Payload too large"

Causa: Payload excede 6MB (RequestResponse) ou 256KB (Event)

Solução: Reduza tamanho do payload ou use S3 para dados grandes

Limites AWS Lambda

Característica RequestResponse Event
Timeout máximo 15 minutos 15 minutos
Payload request 6 MB 256 KB
Payload response 6 MB N/A
Concorrência 1000 (padrão) 1000 (padrão)
Ambiente 512 MB - 10 GB 512 MB - 10 GB

Próximos Passos

  1. Criar Lambda: AWS Console → Lambda → Create Function
  2. Testar invoke: Use lambda_invoke com RequestResponse
  3. Testar async: Use lambda_invoke com Event
  4. Listar funções: Use lambda_list para inventário
  5. Monitorar: Configure CloudWatch Alarms

Outras Integrações AWS

  • SQS - Filas de mensagens
  • SNS - Notificações pub/sub
  • DynamoDB - Banco NoSQL
  • S3 - Armazenamento de objetos
  • SES - Envio de emails

Documentado em: 2025-01-15 Total de tools: 3/3 (100% completo) Arquivo fonte: /home/zielinski/develop/gptapi/src/whatsapp-flows/executors/aws-executors.service.ts