Publicação Técnica · Amazon Web Services
Amazon Bedrock AgentCore: o “core” operacional para agentes em produção
Se você já colocou um agente para rodar localmente (LangGraph, Strands, CrewAI, etc.), você sabe: o problema raramente é “fazer o modelo…
Palavras-chave
Se você já colocou um agente para rodar localmente (LangGraph, Strands, CrewAI, etc.), você sabe: o problema raramente é “fazer o modelo responder”. O problema é operar isso com segurança, rastreabilidade, isolamento, controle de acesso, versionamento, endpoints estáveis, observabilidade e governança, sem virar um festival de scripts e exceções.

O Amazon Bedrock AgentCore existe exatamente para eliminar essa camada de “undifferentiated heavy lifting” e te dar serviços composáveis para levar agentes para produção. O coração disso é o AgentCore Runtime, que hospeda seu agente como workload serverless com isolamento por sessão em microVM, suporte a execuções longas, autenticação, e trilhas de observabilidade orientadas a agentes.
A seguir eu vou direto ao ponto: como desenhar a fundação (rede, IAM, chaves, logs, versionamento e esteiras) e como provisionar runtimes e endpoints em Terraform sem ficar na superfície.
1) O que você está provisionando, de verdade
1.1 Runtime ≠ “o agente”
No AgentCore, o Runtime é o ambiente de execução do seu agente (ou de uma ferramenta / servidor MCP). Você “deposita” um artefato (container no ECR ou código via S3) e o Runtime passa a expor um contrato de invocação.
O Runtime traz propriedades que importam operacionalmente:
- NetworkConfiguration:
PUBLICouVPC(sim, isso muda totalmente seu threat model). - LifecycleConfiguration: limites de tempo por sessão e vida máxima. (Essencial para custo, resiliência e segurança).
- EnvironmentVariables: controlável, mas precisa disciplina (não vire “cofre de segredos” acidental).
- AuthorizerConfiguration: opções de autorização inbound.
1.2 Versionamento e endpoints (o que quase todo mundo negligencia)
Toda vez que você cria um Runtime, você ganha versão 1. Cada update gera uma nova versão imutável. Endpoints são ponteiros para versões — inclusive um DEFAULT que aponta para a versão mais recente.
Isso é a base do seu modelo de promoção:
dev→staging→prod- endpoint
prodnão deveria “flutuar” (a menos que você queira), enquantoDEFAULTpode ser usado para iteração rápida.
1.3 Invocação: Runtime ARN + payload (e suporte a streaming)
A invocação usa o InvokeAgentRuntime, com suporte a sessão e resposta em tempo real/streaming.
2) A fundação mínima para provisionar agentes “com boas práticas” (sem conversa mole)
Vou organizar a fundação como camadas, porque é assim que você evita retrabalho quando o número de agentes cresce.
Camada A — Padrões de conta/ambiente e governança
Objetivo: ambientes previsíveis, separação de blast radius e rastreabilidade.
- Separar por contas (mínimo:
shared,dev,prod). Se não der, separar por workspaces + naming/tagging rigoroso. - Tags obrigatórias:
app,env,owner,cost_center,data_classification,criticality. - KMS por domínio (logs/segredos/dados sensíveis) e políticas mínimas.
Camada B — Rede e egress (onde “PUBLIC” vira dívida)
Decisão crítica: PUBLIC vs VPC.
Para enterprise, o padrão tende a ser VPC para:
- controlar egress,
- usar endpoints privados,
- reduzir superfície de exposição.
O próprio Runtime suporta NetworkMode: PUBLIC | VPC.
Recomendação prática:
- Subnets privadas + NAT com egress controlado (ou egress via firewall).
- VPC Endpoints (Interface/Gateway) para o que seu agente usa (S3, ECR, Logs, STS, Bedrock conforme aplicável).
- SG “deny by default”, liberar só o necessário.
Camada C — IAM (o lugar onde agentes quebram segurança em silêncio)
Você vai ter, no mínimo:
- Role de execução do Runtime (o
roleArndo runtime). - Permissões de invocação de modelos (
bedrock:InvokeModel*quando o agente chamar modelos no Bedrock). Isso aparece inclusive em atualizações de políticas gerenciadas relacionadas ao AgentCore. - Permissões específicas de ferramentas (S3, DynamoDB, APIs internas, etc.) — sempre em política separada por “capability”, não um monstrão.
Regra operacional: “runtime role” não deveria ter permissão de administrar infraestrutura. Ele executa. Ponto.
Camada D — Observabilidade de agente (não é só log)
AgentCore Runtime dá trilhas focadas em “agent reasoning / tool invocations / model interactions” para debugging e auditoria.
Fundação recomendada:
- Log groups padronizados por
env/app/runtime. - Retention por classe (
dev: curto,prod: alinhado a compliance). - Correlação por
sessionId,requestId,traceId(OpenTelemetry quando aplicável).
Camada E — Versionamento, endpoints e promoção (CI/CD)
Se você não automatizar isso, vira “deploy artesanal”:
- Build do artefato (container) → push no ECR
- Atualiza Runtime (gera nova versão)
- Atualiza endpoint
staging - Smoke test (invoke)
- Promotion manual/aprovada → atualiza endpoint
prod
O mecanismo de endpoints/versões existe justamente para isso.
3) Provisionamento em Terraform (com Runtime + Endpoint + fundação)
3.1 Por que eu vou usar awscc aqui
No momento, os recursos do AgentCore Runtime/Endpoint aparecem de forma natural via CloudFormation e no ecossistema Terraform o caminho mais direto é o provider awscc (Cloud Control / CloudFormation-backed). Isso te dá uma trilha estável enquanto o provider aws “main” evolui para cobrir tudo nativamente.
_Se você preferir não depender do
awscc, a alternativa pragmática é acionar a criação via AWS CLI (bedrock-agentcore-control create-agent-runtimeetc.) emnull_resource— mas aí você está assumindo drift e idempotência na unha._
3.2 Estrutura recomendada de repositório Terraform
/infra
/modules
/agentcore-foundation
/agentcore-runtime
/envs
/dev
/prod
agentcore-foundation: VPC, endpoints, KMS, ECR, logs, IAM baseagentcore-runtime: runtime + endpoints + policies específicas do agente
3.3 Código: providers, convenções e tags
terraform {
required_version = ">= 1.6.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.0"
}
awscc = {
source = "hashicorp/awscc"
version = ">= 0.80.0"
}
}
}
provider "aws" {
region = var.region
}
provider "awscc" {
region = var.region
}
locals {
tags = {
app = var.app_name
env = var.env
owner = var.owner
cost_center = var.cost_center
data_classification = var.data_classification
}
}
3.4 Fundação: ECR (artefato do runtime) + KMS + Logs
ECR (com immutability e scan)
resource "aws_ecr_repository" "agent" {
name = "${var.app_name}-${var.env}-agentcore"
image_tag_mutability = "IMMUTABLE"
image_scanning_configuration {
scan_on_push = true
}
tags = local.tags
}
KMS (para criptografia de logs/segredos/dados)
resource "aws_kms_key" "agentcore" {
description = "KMS for AgentCore (${var.app_name}/${var.env})"
deletion_window_in_days = 30
enable_key_rotation = true
tags = local.tags
}
CloudWatch Logs (padrão de retenção)
resource "aws_cloudwatch_log_group" "agentcore" {
name = "/agentcore/${var.env}/${var.app_name}"
retention_in_days = var.log_retention_days
kms_key_id = aws_kms_key.agentcore.arn
tags = local.tags
}
Observação: o AgentCore pode criar logs próprios em namespaces específicos (inclusive para avaliações). Se você quer “tudo sob controle”, planeje naming/retention e permissões de forma explícita.
3.5 IAM: Role do Runtime (least privilege de verdade)
data "aws_iam_policy_document" "runtime_assume" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["bedrock-agentcore.amazonaws.com"]
}
}
}
resource "aws_iam_role" "runtime" {
name = "${var.app_name}-${var.env}-agentcore-runtime"
assume_role_policy = data.aws_iam_policy_document.runtime_assume.json
tags = local.tags
}
# Exemplo: permitir invocar modelos no Bedrock
data "aws_iam_policy_document" "runtime_permissions" {
statement {
sid = "BedrockInvoke"
effect = "Allow"
actions = ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"]
resources = var.allowed_model_arns
}
# Exemplo: logs
statement {
sid = "WriteLogs"
effect = "Allow"
actions = [
"logs:CreateLogStream",
"logs:PutLogEvents"
]
resources = ["${aws_cloudwatch_log_group.agentcore.arn}:*"]
}
}
resource "aws_iam_policy" "runtime_permissions" {
name = "${var.app_name}-${var.env}-agentcore-runtime-permissions"
policy = data.aws_iam_policy_document.runtime_permissions.json
tags = local.tags
}
resource "aws_iam_role_policy_attachment" "runtime_attach" {
role = aws_iam_role.runtime.name
policy_arn = aws_iam_policy.runtime_permissions.arn
}
3.6 Provisionando o Runtime (awscc / CloudFormation-backed)
A CloudFormation define que o Runtime exige:
AgentRuntimeNameAgentRuntimeArtifact(container ou código no S3)RoleArnNetworkConfiguration(PUBLICouVPC)- (opcionais)
LifecycleConfiguration,EnvironmentVariables,AuthorizerConfiguration, etc.
Exemplo com container no ECR e VPC mode
resource "awscc_bedrockagentcore_runtime" "this" {
agent_runtime_name = "${var.app_name}_${var.env}"
description = "AgentCore Runtime for ${var.app_name} (${var.env})"
role_arn = aws_iam_role.runtime.arn
# Artefato: container
agent_runtime_artifact = {
container_configuration = {
container_uri = "${aws_ecr_repository.agent.repository_url}:${var.image_tag}"
}
}
# Rede: VPC
network_configuration = {
network_mode = "VPC"
network_mode_config = {
vpc_id = var.vpc_id
subnet_ids = var.private_subnet_ids
security_group_ids = [var.runtime_sg_id]
}
}
# Ciclo de vida (controle de custo / segurança)
lifecycle_configuration = {
idle_runtime_session_timeout = var.idle_session_timeout_seconds
max_lifetime = var.max_session_lifetime_seconds
}
environment_variables = {
ENV = var.env
LOG_LEVEL = var.log_level
}
tags = local.tags
}
A API do AgentCore Runtime expõe explicitamente networkConfiguration, lifecycleConfiguration, environmentVariables e roleArn como parâmetros de criação/controle.
3.7 Endpoint estável para promoção (dev/staging/prod)
O recurso RuntimeEndpoint em CloudFormation pede:
AgentRuntimeIdName- (opcional)
AgentRuntimeVersioneDescription
Em Terraform (awscc), isso fica assim:
resource "awscc_bedrockagentcore_runtime_endpoint" "prod" {
agent_runtime_id = awscc_bedrockagentcore_runtime.this.agent_runtime_id
name = "prod"
description = "Stable production endpoint for ${var.app_name}"
# Fixar versão (recomendado em prod)
agent_runtime_version = awscc_bedrockagentcore_runtime.this.agent_runtime_version
tags = local.tags
}
Como eu opero isso na prática (sem drama)
- Em
dev, eu posso deixar o endpoint “flutuar” (apontar para latest) ou usarDEFAULT. - Em
prod, eu fixo versão e só atualizo o endpoint após pipeline e aprovação.
Esse modelo é exatamente o que o AgentCore descreve: endpoints como ponteiros, versões imutáveis, e DEFAULT acompanhando o latest.
3.8 Invocação: smoke test automatizado no pipeline
Você pode testar após provisionamento usando AWS CLI (ou SDK). O CLI existe para create-agent-runtime e também para invocar.
Exemplo de invoke (payload em JSON):
aws bedrock-agentcore invoke-agent-runtime \
--agent-runtime-arn "$RUNTIME_ARN" \
--payload fileb://payload.json \
--content-type application/json \
/dev/stdout
A API InvokeAgentRuntime é o contrato para requests/respostas em tempo real e suporta qualificador para endpoint/versão.
4) Checklists práticos: o que diferencia “provisionar” de “provisionar direito”
4.1 Segurança (baseline)
- Runtime em VPC quando houver dado sensível ou integração interna (padrão enterprise).
- IAM “capability-based”: policies pequenas por recurso (S3 read, Dynamo read, etc.).
- Segredos fora de env var (env var é config, não vault).
- Auditoria: log/trace com retenção adequada e correlação por sessão.
4.2 Operação
- Endpoint
prodfixado em versão. - Deploy = novo container tag imutável + update runtime + update endpoint.
- Timeouts (idle e max lifetime) explícitos para evitar sessões “zumbi”.
4.3 Qualidade (antes de escalar)
A AWS publicou um conjunto bem “pé no chão” de boas práticas para agentes em enterprise — instrumentar desde o dia 1, estratégia deliberada de ferramentas, avaliação automatizada, combinar agente com código determinístico, etc. Eu recomendo usar isso como checklist de maturidade para quando você sair de 1 agente para “plataforma de agentes”.
5) Fechando: a ideia central
AgentCore não é “mais um jeito de fazer prompt”. É uma camada operacional para agentes com:
- runtime com isolamento por sessão e execução longa,
- versionamento automático + endpoints,
- e uma superfície de infraestrutura (rede/IAM/observabilidade) que você precisa tratar como produto interno.
Até o próximo post!
Comentários
Todo comentário passa por moderação antes de aparecer aqui. Nada é publicado automaticamente.
Carregando…