⚡ AutomationsAI|Portal de Cursos →

Verificando acesso...

MΓ“DULO 5.2

☁️ AWS Bedrock AgentCore (sample oficial)

Mergulho no sample oficial AWS: arquitetura multi-canal com API Gateway, Lambda router, AgentCore Runtime em Firecracker microVMs, estado em S3 e CDK organizado em 4 stacks.

6
TΓ³picos
60
Minutos
AvanΓ§ado
NΓ­vel
Enterprise
Tipo
1

πŸ›οΈ Arquitetura AWS β€” API Gateway β†’ Router β†’ AgentCore

O sample expΓ΅e um ΓΊnico endpoint HTTPS via API Gateway que recebe webhooks de Telegram, Slack, Discord e Feishu. O Lambda router normaliza o payload e invoca o AgentCore Runtime, onde o main.py do Hermes roda dentro de uma microVM Firecracker dedicada.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Telegram   β”‚   β”‚    Slack     β”‚   β”‚   Discord    β”‚   β”‚    Feishu    β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚ webhook          β”‚ events           β”‚ interactions     β”‚ event
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                   β–Ό                 β–Ό                  β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚      Amazon API Gateway (HTTP API)          β”‚
              β”‚  /telegram  /slack  /discord  /feishu       β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚ POST + signature
                                   β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚      Lambda Router (Node 20 / Python)       β”‚
              β”‚  - verify signature   - normalize payload   β”‚
              β”‚  - load S3 state      - invoke AgentCore    β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚ InvokeAgentRuntime
                                   β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚   Bedrock AgentCore Runtime                 β”‚
              β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
              β”‚   β”‚  Firecracker microVM (per session)   β”‚  β”‚
              β”‚   β”‚     └─► main.py (Hermes Agent)       β”‚  β”‚
              β”‚   β”‚             β”œβ”€β–Ί tools (shell/py)     β”‚  β”‚
              β”‚   β”‚             └─► Bedrock LLM API      β”‚  β”‚
              β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚ persist state
                                   β–Ό
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚   S3 bucket     β”‚
                          β”‚  sessions/...   β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ’‘ Por que essa arquitetura

  • β€’Um endpoint, N canais: adicionar WhatsApp = sΓ³ implementar adapter no router.
  • β€’Pagamento por uso real: Lambda + AgentCore sΓ³ cobram quando hΓ‘ mensagem.
  • β€’IAM nativo: roles separadas por componente β€” router NΓƒO acessa o bucket todo.
  • β€’Observabilidade unificada: tudo em CloudWatch com trace ID cruzando os 3 serviΓ§os.
2

πŸ”₯ Firecracker microVMs β€” 1 VM por sessΓ£o

O AgentCore Runtime usa o mesmo Firecracker que roda Lambda e Fargate por trΓ‘s β€” mas o expΓ΅e como ambiente persistente por sessΓ£o. Cada usuΓ‘rio ganha uma microVM dedicada com isolamento de hypervisor (KVM), cold-start em ~125ms e snapshot/restore nativo.

βœ“ Modelo correto

  • βœ“1 microVM por sessΓ£o de usuΓ‘rio
  • βœ“Snapshot ao final, restore na prΓ³xima msg
  • βœ“Idle TTL configurΓ‘vel (default 15min)
  • βœ“Limite hard de CPU/MEM por VM

βœ— Anti-padrΓ΅es

  • βœ—1 VM compartilhada entre usuΓ‘rios (vaza estado)
  • βœ—Manter VM viva 24/7 β€” perde a vantagem de custo
  • βœ—Persistir creds dentro da VM (fica no snapshot)
  • βœ—VM sem limite β€” bug de loop come orΓ§amento

πŸ’‘ Dica

Use o sample como referΓͺncia de mapeamento sessΓ£oβ†’VM, nΓ£o copie idle TTL Γ s cegas. Para chatbot conversacional, 15min Γ© alto; para agente de longa execuΓ§Γ£o (CI bot), 60min faz sentido. Ajuste por canal.

3

πŸ“¦ CDK em 4 fases β€” como o sample organiza

O sample divide a infra em 4 stacks CDK independentes. Cada um pode ser destruΓ­do e recriado sem tocar nos outros β€” vocΓͺ itera nas integraΓ§Γ΅es sem refazer VPC.

1

NetworkStack

VPC, subnets privadas, NAT, VPC endpoints para Bedrock e S3.

Exporta vpcId e privateSubnetIds para os stacks seguintes.

2

IamStack

Roles separadas: RouterLambdaRole, AgentCoreExecutionRole, StateBucketReadWriteRole.

PrincΓ­pio de menor privilΓ©gio β€” router nΓ£o pode invocar Bedrock, sΓ³ AgentCore pode.

3

AgentCoreStack

Recurso AWS::BedrockAgentCore::Runtime com imagem do Hermes, S3 bucket de estado, KMS key.

Aqui mora o main.py empacotado β€” versione com tag git.

4

IntegrationsStack

API Gateway HTTP API + Lambda router + Secrets Manager (tokens Telegram/Slack/Discord/Feishu).

Γ‰ o stack que vocΓͺ mexe ao adicionar canal novo β€” sem tocar os outros 3.

# Snippet CDK (TypeScript) β€” AgentCoreStack simplificado
import { Stack, StackProps, Duration } from 'aws-cdk-lib';
import { Bucket, BucketEncryption } from 'aws-cdk-lib/aws-s3';
import { CfnRuntime } from 'aws-cdk-lib/aws-bedrockagentcore';

export class AgentCoreStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    const stateBucket = new Bucket(this, 'HermesState', {
      encryption: BucketEncryption.KMS_MANAGED,
      versioned: true,
      lifecycleRules: [{ expiration: Duration.days(90) }],
    });

    new CfnRuntime(this, 'HermesRuntime', {
      runtimeName: 'hermes-agent-prod',
      containerImage: `${ecrRepo.repositoryUri}:${imageTag}`,
      executionRoleArn: agentRole.roleArn,
      idleTimeoutSeconds: 900,
      environmentVariables: {
        HERMES_STATE_BUCKET: stateBucket.bucketName,
        BEDROCK_MODEL_ID: 'anthropic.claude-3-5-sonnet-20241022-v2:0',
      },
    });
  }
}

# deploy
$ npm ci && npm run build
$ npx cdk deploy --all --require-approval never
4

πŸ’Ύ Estado em S3 β€” persistΓͺncia entre invocaΓ§Γ΅es

Como microVMs sΓ£o efΓͺmeras por design, o sample persiste tudo que precisa sobreviver entre mensagens em um bucket S3 particionado por user_id/session_id: histΓ³rico de conversa, memΓ³rias de longo prazo, arquivos gerados pelo agente.

# layout do bucket
hermes-state-prod/
β”œβ”€β”€ sessions/
β”‚   └── telegram/
β”‚       └── user_123456/
β”‚           └── session_abc/
β”‚               β”œβ”€β”€ history.jsonl       # mensagens
β”‚               β”œβ”€β”€ memory.json         # facts persistentes
β”‚               └── workspace/          # arquivos do agente
β”‚                   β”œβ”€β”€ output.csv
β”‚                   └── analysis.png
└── snapshots/
    └── user_123456/
        └── vm_state.bin                # snapshot Firecracker

πŸ“Š PadrΓ£o de persistΓͺncia

  • history.jsonl β€” append-only, lido inteiro no inΓ­cio da sessΓ£o
  • memory.json β€” sobrescrito a cada turno, contΓ©m facts extraΓ­dos
  • workspace/ β€” sincronizado bidirecionalmente (download inΓ­cio, upload fim)
  • Lifecycle: sessions/* β†’ IA apΓ³s 30d, Glacier apΓ³s 90d, expira em 365d
  • KMS: bucket key encryption ativo (1 chamada KMS por sessΓ£o, nΓ£o por objeto)
5

πŸšͺ Lambda Router β€” multi-canal serverless

O router Γ© a peΓ§a mais reutilizΓ‘vel do sample: uma Lambda Node.js que recebe webhooks dos 4 canais, valida assinatura, normaliza para um schema interno e invoca o AgentCore. Adicionar WhatsApp = ~80 linhas no router, zero mudanΓ§a no resto.

// router.ts (estrutura simplificada do sample)
import { verifyTelegram, verifySlack, verifyDiscord, verifyFeishu } from './adapters';
import { invokeAgentRuntime } from './agentcore';

export async function handler(event: APIGatewayProxyEventV2) {
  const channel = event.rawPath.replace('/', '');   // telegram | slack | ...
  const adapter = adapters[channel];

  // 1. verifica assinatura (HMAC ou OAuth)
  if (!adapter.verify(event)) return { statusCode: 401 };

  // 2. normaliza payload
  const msg = adapter.normalize(event);
  // { channel, userId, sessionId, text, attachments }

  // 3. invoca AgentCore (async se demorado)
  const result = await invokeAgentRuntime({
    sessionId: msg.sessionId,
    input: msg.text,
    metadata: { channel: msg.channel, userId: msg.userId },
  });

  // 4. responde de volta no canal
  return adapter.reply(msg, result.output);
}

πŸ’‘ Dica de produΓ§Γ£o

Mensagens longas (treino de modelo, scraping pesado) NÃO devem responder síncrono no webhook. Use InvokeAsync + DLQ + responda "processando..." em <3s para evitar timeout do Telegram/Slack (que retentam após 5-10s).

6

πŸ’° Custos AWS β€” estimativa real para 1k usuΓ‘rios/mΓͺs

Premissa de cΓ‘lculo: 1.000 usuΓ‘rios ativos mensais, 30 msgs/usuΓ‘rio/mΓͺs = 30k invocaΓ§Γ΅es, sessΓ£o mΓ©dia de 90s, regiΓ£o us-east-1, modelo Claude 3.5 Sonnet via Bedrock.

πŸ“Š Breakdown de custo mensal estimado

ComponenteVolumePreΓ§oTotal
API Gateway HTTP API30k req$1.00/M$0.03
Lambda Router30k Γ— 200ms Γ— 256MB$0.20/M + GB-s$0.18
AgentCore Runtime30k Γ— 90s Γ— 1vCPU/2GB~$0.0001/s$270.00
Bedrock Claude 3.5 Sonnet~600M input + 60M output$3 / $15 per M$2.700,00
S3 storage + requests~50GB + 200k req$0.023/GB + req$1.80
CloudWatch logs~30GB ingestion$0.50/GB$15.00
KMS30k requests$0.03/10k$0.09
TOTAL estimado~$2.987 / mΓͺs

O custo Γ© dominado pelo LLM (~90%). AgentCore Runtime Γ© <10% β€” otimize prompts antes de mexer em infra.

⚠️ Quotas AWS que vão te morder

  • β€’ Bedrock TPM: limite default de tokens/min Γ© apertado β€” peΓ§a aumento ANTES de lanΓ§ar
  • β€’ AgentCore concurrent sessions: default ~100; precisa raise para multi-tenant sΓ©rio
  • β€’ Lambda concurrent executions: 1000 por regiΓ£o por default
  • β€’ API Gateway burst: 5000 RPS β€” webhook de canal viral satura sem rate limit

πŸ’‘ Dica β€” teste com LocalStack antes

Antes de queimar dΓ³lares na AWS real, suba o stack inteiro localmente com LocalStack:

$ docker run -d -p 4566:4566 localstack/localstack
$ export AWS_ENDPOINT_URL=http://localhost:4566
$ npx cdk bootstrap --profile localstack
$ npx cdk deploy --all --profile localstack

LocalStack Pro emula AgentCore e Bedrock; a versΓ£o Community emula sΓ³ Lambda/S3/API GW β€” jΓ‘ dΓ‘ pra testar o router e o S3 layout.

βœ… Resumo do MΓ³dulo

βœ“
Arquitetura Γ© API Gateway β†’ Router Lambda β†’ AgentCore Runtime β†’ main.py do Hermes, com S3 fora.
βœ“
Firecracker dΓ‘ 1 microVM por sessΓ£o com cold-start ~125ms β€” nunca compartilhe VM entre usuΓ‘rios.
βœ“
CDK em 4 stacks independentes (Network / IAM / AgentCore / Integrations) acelera iteraΓ§Γ£o.
βœ“
Estado persiste em S3 particionado por user/session, com lifecycle e KMS bucket key.
βœ“
Lambda Router unifica 4 canais com adapters β€” adicionar canal novo Γ© incremental.
βœ“
Para 1k MAU, o custo Γ© dominado pelo LLM (~90%), nΓ£o pela infra β€” otimize prompt antes de infra.

PrΓ³ximo mΓ³dulo:

5.3 β€” πŸ“‘ Observabilidade em produΓ§Γ£o: OpenTelemetry, Grafana, SLOs e alertas para enxergar dentro do Hermes em prod.