跳转至

用 Amazon Quick + Bedrock AgentCore 打造对话式 FinOps 助手

Ch11.124 用 Amazon Quick + Bedrock AgentCore 打造对话式 FinOps 助手

📊 Level ⭐⭐ | 8.4KB | entities/amazon-quick-bedrock-agentcore-finops-chat.md

用 Amazon Quick + Bedrock AgentCore 打造对话式 FinOps 助手

Background: AWS China 团队将开源的 Billing and Cost Management MCP Server 改造适配后,部署到 Amazon Bedrock AgentCore Runtime,通过 Cognito OAuth 2.0 保护,最终接入 Amazon Quick Chat Agent 让业务用户用中文对话式查询多账号 AWS 成本。

整体链路

业务用户在 Amazon Quick 中提问
Quick Chat Agent 判断需要哪个 MCP 工具
Quick 用 2LO OAuth client_credentials flow 向 Cognito 换 JWT
携带 JWT 调 AgentCore Runtime 的 MCP 端点 (Streamable HTTP)
AgentCore Runtime 用 Cognito Authorizer 校验 JWT
容器内 Billing/Cost Management MCP Server 用 IAM Role 调
  - AWS Cost Explorer
  - AWS Budgets
  - AWS Compute Optimizer
  - AWS Cost Optimization Hub
结果沿原路返回 Quick,由 Chat Agent 用中文呈现

三大组件

1. Amazon Quick Chat Agent(MCP 客户端)

  • 服务认证 (2LO) 换 JWT
  • 业务用户代理身份
  • 自然语言 → MCP 工具调用

2. Amazon Bedrock AgentCore Runtime

  • Serverless 容器托管 MCP Server
  • 内置 OAuth 授权方 (Authorizer)
  • ARM64 (Graviton) 运行
  • 集成 AgentCore Memory / Observability

3. Amazon Cognito

  • 颁发 JWT 给 Quick
  • 验证 JWT 给 AgentCore
  • 允许列表控制哪些 client_id 可以调用

跨账号模式

支持单 Chat Agent 查询多个 AWS 账号的账单数据,通过 AssumeRole 跨账户委托访问。

适用场景

  • 业务用户自然语言查账单
  • 跨账号成本归因
  • 异常花费自动告警
  • FinOps 团队减负(不再做 BI 报表)

待关注

  • Bedrock AgentCore GA 后的 API 稳定性
  • 多区域部署(北京/宁夏)账号体系协调
  • Quick Chat Agent 上下文管理

相关实体

原文存档

深度分析

MCP协议架构:解耦与组合的灵活性

MCP协议的核心价值在于将工具定义与调用方分离。传统BI集成需要在QuickSight或Tableau中为每个数据源单独构建连接器,而MCP允许将任何支持Streamable HTTP的服务封装为可发现工具。 这种架构使得FinOps团队可以自主维护MCP Server,而无需依赖Quick的控制台更新周期。然而解耦也带来了版本同步问题——文章提到的"工具列表在首次注册后是静态的,更新MCP Server后需要重新创建集成"正是这一权衡的具体表现。 建议在MCP Server迭代时同步更新文档,记录每个版本暴露的25个Action及其变更内容。

OAuth 2LO在M2M场景的安全边界

客户端凭证流(Client Credentials Flow)适用于机器到机器通信,但本文方案将其置于业务用户代理场景存在 Delegation 缺失。 Quick Chat Agent代表用户查询成本数据时,JWT中仅携带M2M客户端身份,无法携带业务用户的权限上下文。这意味着所有通过该M2M客户端的请求都拥有相同的账单数据访问权限,无法实现行级安全(Row-Level Security)。对于多部门共用同一MCP Server的场景,这意味着每个业务用户能看到所有账号的全量数据。在设计阶段应评估是否需要在MCP Server层面增加自定义权限过滤逻辑。

跨账号委托的最小权限设计

跨账号查询依赖AssumeRole机制,但文章中的策略设计值得商榷。 源账号执行角色持有 sts:AssumeRole 权限到目标账号的 BillingMCPCrossAccountRole,而目标角色附加的是与源账号相同的 billing-mcp-policy.json,这意味着目标账号授予的是对 Cost Explorer 等API的完全只读权限。在实际部署中,建议根据业务需求限制目标角色能查询的账号范围,例如使用条件键 aws:SourceAccount 限制只能从特定账号发起AssumeRole请求。 此外,管理账号(Management/Payer Account)不在 LINKED_ACCOUNT 维度中这一特性要求在LLM Prompt层面做特殊处理,文章通过Prompt引导和递归清理双重防御解决,但这种设计隐含了LLM理解跨账号架构的假设。

Serverless容器化MCP的运维边界

AgentCore Runtime以ARM64(Graviton)方式运行容器,这一选择对MCP Server的兼容性提出要求。 上游MCP Server默认以root用户运行并创建本地文件(SQLite session、日志),适配版本需要添加 /tmp fallback逻辑。 在生产环境中,这意味着需要监控容器的存储使用情况,尤其是 session-sql 工具可能产生的临时数据库文件。容器冷启动时间(通常30-60秒)与MCP调用的超时限制(60秒)之间的关系也值得在压测阶段验证。

对话式FinOps的局限性边界

自然语言查询在FinOps场景有明确的适用范围。Cost Explorer的metrics参数需要从JSON字符串改为原生列表类型这一适配工作,揭示了LLM调用结构化API时的类型一致性挑战。 对于需要精确时间范围、维度过滤的查询,用户需要学会"提问语法"——例如明确指定"按服务分组"而非让LLM自行推断。此外,60秒的单次操作超时限制了复杂分析查询的执行,对于需要关联多个AWS服务数据的综合报告,建议预计算并存储结果供查询。

实践启示

1. 建立MCP Server版本管理与工具清单同步机制

由于Quick中工具列表注册后需要手动重建才能感知更新,建议在CI/CD流程中记录每次部署的工具变更内容,并自动触发Quick Connectors的重建流程。 可以通过调用 listTools API对比版本间的差异,生成变更报告后触发告警。

2. 设计Cognito M2M客户端密钥的轮换策略

M2M客户端密钥在创建时仅返回一次明文,后续无法恢复。 建议在初始部署时即将密钥存入 AWS Secrets Manager,并设置例行轮换计划。轮换时需要同步更新Quick Connector配置,并建议在低峰期操作以避免令牌失效影响业务用户。

3. 为跨账号场景制定标准化角色命名与信任策略

跨账号模式要求所有目标账号使用同名角色 BillingMCPCrossAccountRole。 在大规模多账号环境中,建议通过 AWS Organizations 的 SCP(Service Control Policy)强制执行角色命名规范,并限制 sts:AssumeRole 的目标账号范围。

4. 在Prompt层面加固跨账号查询的防御性编程

文章通过Prompt引导LLM不要在已指定 target_account_id 时额外添加 LINKED_ACCOUNT 过滤条件。 生产环境中建议增加代码层面的主动检查——当参数同时包含 target_account_idLINKED_ACCOUNT 时,优先使用前者并在日志中记录异常模式,以便持续优化Prompt。

5. 规划对话式查询与预计算报表的混合架构

对于需要多维度关联分析的复杂场景,对话式查询受限于60秒超时和单次API调用。 建议将高频查询模式(月度汇总、成本趋势、异常告警)预计算为 Athena CUR 表或 QuickSight数据集,对话式接口仅用于探索性分析和即席问题,而周期性报告仍通过传统BI渠道分发。