在实际企业级 AI 应用开发中,单纯调用大模型 API 已经无法满足复杂业务需求。真正的挑战在于如何构建一个具备记忆、工具调用、多轮对话和安全隔离能力的生产级 AI Agent,同时还要解决多租户场景下的资源隔离、成本控制和运维可观测性问题。Amazon Bedrock 与 Amazon Bedrock AgentCore 的组合为企业提供了从模型调用到 Agent 托管的全链路解决方案,但要把这套方案真正落地,需要深入理解其架构设计、隔离机制和成本治理方法。
本文将以一个真实的多租户 AI Agent 迁移案例为背景,带你完整走通基于 Amazon Bedrock AgentCore 的企业级 AI Agent 构建流程,重点分析如何通过技术架构实现全链路 Token 成本治理。
1. 理解 Amazon Bedrock AgentCore 的核心价值:从单机到多租户的架构演进
1.1 传统单机 AI Agent 的局限性
在深入 Amazon Bedrock AgentCore 之前,先看一个典型的单机 AI Agent 部署场景。OpenClaw 是一个流行的开源 AI Agent 框架,其默认部署方式是在单台服务器上运行 Node.js 进程,通过 Gateway 连接 Telegram、Slack 等即时通讯渠道。这种架构对个人用户足够,但面对企业多租户需求时暴露出明显短板:
- 用户隔离缺失:所有用户共享同一个进程和文件系统,无法实现数据和权限隔离
- 弹性扩缩困难:单进程架构受限于单机资源,需要手动扩容和负载均衡配置
- 数据持久化风险:工作区数据存储在本地磁盘,服务器维护或迁移时需要手动备份恢复
- 安全防护薄弱:内容审核、PII 检测等能力需要自行实现,密钥管理依赖本地文件
- 运维可观测性不足:依赖本地日志文件,Token 用量统计和成本追踪需要额外搭建
1.2 Amazon Bedrock AgentCore 的架构优势
Amazon Bedrock AgentCore 通过 Serverless 运行时和 microVM 隔离机制,从根本上解决了上述问题。其核心价值体现在三个层面:
运行时隔离:每个用户会话分配独立的 microVM,实现进程级隔离,避免用户间相互影响资源按需分配:AgentCore Runtime 按会话自动扩缩,空闲超时自动销毁,真正实现按使用付费托管服务集成:原生集成 Amazon Bedrock Guardrails、AWS KMS、Amazon CloudWatch 等托管服务,降低运维复杂度
这种架构转变属于典型的 Replatform + Refactor 混合迁移策略:将原有能力平移到 AWS 托管服务(Replatform),同时为多租户场景重新设计架构(Refactor)。
2. 环境准备与依赖配置:构建企业级 AI Agent 的基础设施
2.1 核心 AWS 服务依赖矩阵
部署前需要明确各服务在架构中的角色和依赖关系。以下表格列出了关键服务及其功能定位:
| 服务名称 | 在架构中的角色 | 为什么选择该服务 |
|---|---|---|
| Amazon Bedrock | 大模型推理服务 | 托管模型服务,无需自建推理集群 |
| AgentCore Runtime | AI Agent 托管运行时 | Serverless 微虚拟机隔离,按需计费 |
| Amazon Bedrock Guardrails | 内容安全审核 | 开箱可用的内容过滤和 PII 检测 |
| Amazon API Gateway | 消息入口网关 | 托管 HTTPS 入口,自带限流和访问日志 |
| AWS Lambda | 业务逻辑处理 | 按调用计费,无请求时零成本 |
| Amazon DynamoDB | 用户身份和用量存储 | 毫秒级 NoSQL,按需计费 |
| Amazon S3 | 用户工作区持久化 | 高持久性对象存储,按用户前缀隔离 |
| Amazon VPC | 网络隔离层 | 多租户安全的基础保障 |
| AWS KMS | 加密密钥管理 | 托管密钥服务,支持自动轮换 |
2.2 部署阶段划分与依赖关系
复杂的基础设施部署需要分阶段进行,确保前后依赖关系正确。本项目采用三阶段部署策略:
Phase 1:基础网络与存储
- 创建 VPC、子网、NAT Gateway
- 配置 S3 存储桶和 DynamoDB 表
- 设置 KMS 加密密钥和 IAM 基础角色
Phase 2:AgentCore 运行时与容器
- 构建 ARM64 容器镜像并推送到 ECR
- 部署 AgentCore Runtime 和相关 VPC Endpoint
- 配置 Bedrock Guardrails 和安全策略
Phase 3:业务逻辑与消息路由
- 部署 API Gateway 和 Lambda 函数
- 配置消息渠道 Webhook 路由
- 设置监控告警和 Token 用量统计
这种分阶段部署确保 Phase 3 的 Router Lambda 能够正确引用 Phase 2 创建的 AgentCore Runtime ID,避免循环依赖问题。
3. 核心架构实现:多租户隔离与工作区同步机制
3.1 用户身份隔离的实现原理
多租户架构的核心是用户隔离。本项目通过 AWS STS 和 Amazon Cognito 实现细粒度的权限控制:
# 伪代码:microVM 启动时的权限隔离流程 def start_microvm_for_user(user_id): # 1. 通过 Cognito 获取用户身份标签 user_identity = cognito.get_identity(user_id) # 2. 生成限制版临时凭证 scoped_credentials = sts.assume_role( role_arn="arn:aws:iam::123456789012:role/OpenClawSessionRole", policy=generate_scoped_policy(user_id) ) # 3. 删除原始凭证,确保隔离 delete_original_credentials() # 4. 启动 microVM 并注入限定凭证 microvm = agentcore.start_session( user_id=user_id, credentials=scoped_credentials, workspace_bucket=f"openclaw-workspace-{user_id}" ) return microvm def generate_scoped_policy(user_id): """生成仅允许访问当前用户资源的策略""" return { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject"], "Resource": f"arn:aws:s3:::openclaw-workspace/{user_id}/*" } ] }3.2 工作区数据同步机制
用户的工作区数据(记忆、偏好、会话历史)需要在 microVM 临时存储和 S3 持久化存储间同步:
# 容器内的同步配置示例 workspace_sync: enabled: true interval_seconds: 300 # 每5分钟同步一次 source_path: "/mnt/workspace/.openclaw" destination_s3_uri: "s3://openclaw-workspace/{user_id}/" include_patterns: - "MEMORY.md" - "USER.md" - "sessions/*" - "agents/*/config.json"同步过程采用增量上传策略,仅上传变更文件,减少网络传输和 S3 操作成本。
3.3 消息路由与渠道集成
多渠道消息通过统一的 API Gateway 入口,由 Lambda Router 进行路由分发:
// Lambda Router 消息处理逻辑 exports.handler = async (event) => { const { path, headers, body } = event; // 1. 验证渠道签名 const channel = identifyChannel(path, headers); if (!verifySignature(channel, body, headers)) { return { statusCode: 401 }; } // 2. 提取用户身份 const userInfo = extractUserInfo(channel, body); const userId = generateUserId(channel, userInfo.externalId); // 3. 查找或创建用户会话 let session = await dynamodb.getSession(userId); if (!session) { session = await agentcore.startSession(userId); } // 4. 转发消息到对应 microVM const response = await session.sendMessage(body.message); // 5. 记录 Token 用量 await recordTokenUsage(userId, response.tokenUsage); return { statusCode: 200, body: response }; };4. Token 成本治理:从用量统计到预算控制
4.1 Token 用量采集与存储架构
成本治理的前提是准确的用量统计。本项目在多个层面采集 Token 数据:
# Token 用量记录示例 class TokenUsageRecorder: def __init__(self, dynamodb_table): self.table = dynamodb_table def record_usage(self, user_id, session_id, model_id, usage_data): """记录单次调用的 Token 用量""" item = { 'userId': user_id, 'timestamp': datetime.utcnow().isoformat(), 'sessionId': session_id, 'modelId': model_id, 'inputTokens': usage_data.get('inputTokens', 0), 'outputTokens': usage_data.get('outputTokens', 0), 'totalTokens': usage_data.get('totalTokens', 0), 'costUSD': self.calculate_cost(usage_data), 'ttl': int(time.time()) + 30 * 24 * 3600 # 30天后自动过期 } self.table.put_item(Item=item) def calculate_cost(self, usage_data): """根据模型定价计算成本""" model_pricing = { 'anthropic.claude-3-sonnet': { 'input': 0.00300, # 每1K tokens 'output': 0.01500 }, 'anthropic.claude-3-haiku': { 'input': 0.00080, 'output': 0.00400 } } model_rate = model_pricing.get(usage_data['modelId']) if not model_rate: return 0.0 input_cost = (usage_data['inputTokens'] / 1000) * model_rate['input'] output_cost = (usage_data['outputTokens'] / 1000) * model_rate['output'] return round(input_cost + output_cost, 6)4.2 多维度成本分析报表
基于采集的用量数据,可以生成多维度成本分析:
-- 每日各用户 Token 用量统计 SELECT userId, DATE(timestamp) as usageDate, SUM(inputTokens) as totalInputTokens, SUM(outputTokens) as totalOutputTokens, SUM(totalTokens) as totalTokens, SUM(costUSD) as dailyCost FROM token_usage_table WHERE timestamp >= '2024-01-01' GROUP BY userId, DATE(timestamp) ORDER BY dailyCost DESC; -- 各模型成本占比分析 SELECT modelId, COUNT(*) as requestCount, SUM(totalTokens) as totalTokens, SUM(costUSD) as totalCost, ROUND(SUM(costUSD) * 100 / (SELECT SUM(costUSD) FROM token_usage_table), 2) as costPercentage FROM token_usage_table WHERE timestamp >= '2024-01-01' GROUP BY modelId ORDER BY totalCost DESC;4.3 预算控制与告警机制
实现成本治理的关键是建立预算控制和告警机制:
# CloudWatch 告警配置示例 Alarms: MonthlyBudgetExceeded: Type: AWS::CloudWatch::Alarm Properties: AlarmName: OpenClaw-MonthlyBudgetExceeded AlarmDescription: "当月 Token 成本超过预算阈值" MetricName: TotalCost Namespace: Custom/OpenClaw Statistic: Sum Period: 86400 # 24小时 EvaluationPeriods: 1 Threshold: 100.0 # 每月100美元预算 ComparisonOperator: GreaterThanThreshold AlarmActions: - !Ref BudgetNotificationTopic HighCostUserAlert: Type: AWS::CloudWatch::Alarm Properties: AlarmName: OpenClaw-HighCostUser AlarmDescription: "单个用户日成本异常升高" MetricName: UserDailyCost Namespace: Custom/OpenClaw Dimensions: - Name: UserId Value: "*" Statistic: Maximum Period: 3600 # 1小时 EvaluationPeriods: 24 Threshold: 10.0 # 单用户日成本超过10美元 ComparisonOperator: GreaterThanThreshold5. 生产环境运维:监控、排错与性能优化
5.1 关键监控指标与 Dashboard 配置
生产环境需要全面的可观测性。以下监控指标需要重点关注:
| 指标类别 | 具体指标 | 告警阈值 | 监控频率 |
|---|---|---|---|
| 业务健康度 | 活跃会话数、消息吞吐量 | 会话数突降50% | 1分钟 |
| 成本控制 | 实时累计成本、单用户成本 | 超月预算80% | 1小时 |
| 性能表现 | P99响应时间、Bedrock错误率 | P99 > 10s | 5分钟 |
| 资源使用 | microVM 并发数、内存使用率 | 并发数超限 | 1分钟 |
| 渠道可用性 | 各渠道消息成功率 | 成功率 < 95% | 5分钟 |
CloudWatch Dashboard 配置示例:
{ "widgets": [ { "type": "metric", "properties": { "metrics": [ ["Custom/OpenClaw", "ActiveSessions"], ["Custom/OpenClaw", "MessagesProcessed"] ], "period": 60, "stat": "Average", "region": "us-east-1", "title": "业务吞吐量监控" } }, { "type": "metric", "properties": { "metrics": [ ["Custom/OpenClaw", "TotalCost", {"label": "当月累计成本"}], ["Custom/OpenClaw", "DailyCost", {"label": "当日成本"}] ], "view": "timeSeries", "stacked": false, "region": "us-east-1", "title": "成本监控" } } ] }5.2 常见问题排查指南
在实际运维中,以下问题较为常见:
问题1:用户消息无响应
- 现象:用户发送消息后长时间无回复
- 排查路径:
- 检查 API Gateway 访问日志,确认消息是否到达
- 查看 Router Lambda 执行日志,确认消息路由是否正确
- 检查 AgentCore Runtime 会话状态,确认 microVM 是否正常启动
- 查看 microVM 内部日志,确认 OpenClaw 处理逻辑
- 检查 Bedrock 调用记录,确认模型服务是否正常响应
问题2:Token 用量统计异常
- 现象:成本报表显示用量与预期不符
- 排查路径:
- 验证 Token 记录 Lambda 是否正常执行
- 检查 DynamoDB 表的写入容量是否充足
- 确认 Bedrock 响应中是否包含准确的 usage 字段
- 核对模型定价表是否与当前使用模型匹配
- 检查是否有重复记录或数据丢失
问题3:工作区数据同步失败
- 现象:用户会话状态丢失,记忆不连续
- 排查路径:
- 检查 S3 存储桶权限配置
- 验证同步间隔配置是否合理
- 查看 microVM 临时存储空间是否充足
- 确认网络连通性,特别是 VPC Endpoint 状态
- 检查同步脚本的执行日志
5.3 性能优化建议
基于实际运行数据,可以实施以下优化措施:
微VM启动优化:
- 使用预热池保持一定数量的空闲 microVM
- 优化容器镜像大小,减少启动时的下载时间
- 预加载常用依赖库到内存
成本优化:
- 根据业务时段调整空闲超时时间
- 对非关键对话使用成本更低的模型
- 实施对话长度限制,避免无限长对话
可靠性优化:
- 设置会话最大生命周期,避免资源泄漏
- 实施重试机制处理临时性故障
- 建立数据备份和恢复流程
6. 安全与合规考量
6.1 数据加密与访问控制
企业级应用必须重视数据安全:
# KMS 加密配置示例 encryption: s3_bucket: kms_key_id: alias/openclaw-secrets sse_algorithm: aws:kms dynamodb: enabled: true kms_key_id: alias/openclaw-secrets secrets_manager: kms_key_id: alias/openclaw-secrets rotation_enabled: true rotation_days: 906.2 内容安全与合规审核
利用 Bedrock Guardrails 实现内容安全:
# Guardrails 配置示例 guardrails_config = { "content_filtering": { "hate_speech": "BLOCK", # 仇恨言论拦截 "violence": "BLOCK", # 暴力内容拦截 "sexual_content": "BLOCK" # 色情内容拦截 }, "pii_detection": { "enabled": True, "types": ["EMAIL", "PHONE", "CREDIT_CARD"], "action": "ANONYMIZE" # 检测到PII时匿名化处理 }, "topic_control": { "blocked_topics": ["非法活动", "危险行为指南"], "action": "BLOCK" } }企业级 AI Agent 的构建不仅是技术实现,更是架构设计、成本控制和运维管理的综合体现。Amazon Bedrock AgentCore 提供了强大的基础能力,但真正落地时需要根据业务需求进行适当的定制和优化。Token 成本治理也不是单一环节的工作,而是需要从架构设计、用量统计、预算控制到优化调整的全链路管理。
在实际项目中,建议先从小规模试点开始,验证架构可行性和成本模型,再逐步扩大应用范围。同时要建立完善的监控告警机制,确保及时发现和处理异常情况,保障服务的稳定性和成本可控性。