AWS成本分析服务

一个用于分析AWS成本和使用情况的服务,支持多账户角色假设和EKS部署。

  • by EmmaChillonB
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 EmmaChillonB/cost-explorer-only

使用说明

成本浏览器MCP服务器

MCP服务器通过AWS Cost Explorer API分析成本和使用AWS,设计用于 使用POD身份在EKS中部署 y 多重角色概述.

目录


功能

AWS的成本分析和使用

  • 按服务、地区和其他维度分列的详细成本明细
  • 查询特定时间段的历史成本数据
  • 按维度、标签和成本类别划分的成本过滤

期间间成本比较

  • 使用的功能 成本比较 de AWS成本资源管理器
  • 两个时期之间的成本比较,以确定变化和趋势
  • 分析主要成本因素(前10名),以了解增减

未来成本预测

  • 根据历史使用模式生成预测
  • 具有置信区间的预测(80%或95%)
  • 每日和每月预测的粒度

多帐户体系结构

  • 支持具有不同IAM角色的多个AWS帐户
  • 使用LRU缓存管理线程安全会话(最多300个会话)
  • 在令牌到期前5分钟自动刷新令牌
  • 重复执行并发请求(每个帐户只有一个STS调用)

认证体系结构

如何运作

该服务器的设计是在 EKS,其中POD通过 EKS吊舱标识,对于每个请求,它根据 client_id.

认证流程:

  1. POD通过EKS POD标识获得基本凭据
  2. 客户端配置从 AWS机密管理器 (在生产中)或从文件 clients.json 当地(发展中)
  3. 对于每个工具请求:
    • 正在发送 client_id
    • 服务器搜索 role_arn 在客户端配置中
    • 服务器调用 sts:AssumeRole 走向相应角色
    • 创建成本管理器(CE)客户端并缓存到令牌到期
    • 令牌在到期前自动刷新

加载客户端配置

服务器按以下顺序优先考虑源:

  1. AWS机密管理器 --si-la变量 CLIENTS_CONFIG_SECRET 定义后,从指定的秘密加载设置。配置在内存中缓存5分钟(可通过 CLIENTS_CONFIG_CACHE_TTL)哦。当更新机密时,服务器会在下一个缓存周期中自动检测到更改,而无需重新启动。

  2. 本地文件 --si CLIENTS_CONFIG_SECRET 没有定义,请搜索 clients.json 在指定的路线上 CLIENTS_CONFIG_PATH 或在与模块相关的默认位置。文件在更改时自动重新加载(由MTIME检测)。

先决条件

  • EKS 启用POD标识
  • 角色基地(吊舱角色):通过POD标识分配给POD的IAM角色,具有以下权限:
    • sts:AssumeRole 关于每个帐户角色的RNA
    • secretsmanager:GetSecretValue 关于配置的秘密
  • 每个目标帐户中的角色:允许由基本角色承担

对比度管理

服务器安全地处理并发请求:

  • 缓存线程安全:所有缓存都使用锁来防止竞争条件
  • 软饮料重复:如果多个请求需要刷新同一令牌,则只进行一次STS调用
  • Eviccion LRU:最多300个缓存会话,自动删除使用最少的会话

需要IAM许可

罗尔基地 (通过POD标识识别POD):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": [
        "arn:aws:iam::ACCOUNT_ID_1:role/mcp-cost-optimizer",
        "arn:aws:iam::ACCOUNT_ID_2:role/mcp-cost-optimizer"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "arn:aws:iam::BASE_ACCOUNT_ID:secret:mcp-cost-optimizer/clients"
    }
  ]
}

每个目标帐户中的角色 (mcp-cost-optimizer):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ce:GetCostAndUsage",
        "ce:GetCostForecast",
        "ce:GetDimensionValues",
        "ce:GetTags",
        "ce:GetCostAndUsageComparisons",
        "ce:GetCostComparisonDrivers",
        "ce:GetReservationUtilization",
        "ce:GetReservationCoverage",
        "ce:GetReservationPurchaseRecommendation",
        "ce:GetSavingsPlansCoverage",
        "ce:GetSavingsPlansUtilization",
        "ce:GetSavingsPlansPurchaseRecommendation",
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:GetMetricData",
        "cloudwatch:ListMetrics",
        "ec2:DescribeRegions",
        "ec2:DescribeInstances",
        "ec2:DescribeVolumes",
        "ec2:DescribeSnapshots",
        "ec2:DescribeNatGateways",
        "ec2:DescribeAddresses",
        "elasticloadbalancing:DescribeLoadBalancers",
        "elasticloadbalancing:DescribeTargetGroups",
        "elasticloadbalancing:DescribeTargetHealth",
        "rds:DescribeDBInstances",
        "rds:DescribeDBRecommendations",
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation",
        "s3:GetLifecycleConfiguration",
        "s3:GetBucketVersioning"
      ],
      "Resource": "*"
    }
  ]
}

信任策略 在每个目标帐户角色中:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::BASE_ACCOUNT_ID:role/mcp-cost-optimizer-CLUSTER_ID"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

配置

多帐户配置(clients.json)

服务器使用 client_id 寻找要扮演的角色。配置可以在AWS Secrets Manager或本地文件中。

配置示例

{
  "clients": {
    "cuenta-produccion": {
      "role_arn": "arn:aws:iam::ACCOUNT_ID_1:role/mcp-cost-optimizer",
      "account_id": "ACCOUNT_ID_1",
      "account_type": "payer",
      "description": "Cuenta de gestion (payer)"
    },
    "cuenta-desarrollo": {
      "role_arn": "arn:aws:iam::ACCOUNT_ID_2:role/mcp-cost-optimizer",
      "account_id": "ACCOUNT_ID_2",
      "account_type": "linked",
      "payer_id": "cuenta-produccion",
      "description": "Cuenta de desarrollo (linked)"
    }
  }
}

更新生产中的配置

aws secretsmanager put-secret-value \
  --secret-id "mcp-cost-optimizer/clients" \
  --secret-string file://clients.json \
  --region eu-west-1 --profile <profile>

服务器在未来5分钟内自动检测到更改,无需重新启动。

环境变量

变量 必需 默认值 描述
CLIENTS_CONFIG_SECRET 没有* - 带有客户设置的AWS Secrets Manager中的RNA或Secret名称
CLIENTS_CONFIG_PATH 没有* - 文件路径 clients.json (alternativa当地的一个秘密经理)
CLIENTS_CONFIG_CACHE_TTL 没有 300 从Secrets Manager缓存客户端配置的秒数
AWS_REGION 没有 us-east-1 默认区域AWS
FASTMCP_LOG_LEVEL 没有 WARNING Nivel日志删除(错误、警告、信息、调试)
VALIDATE_FILTER_VALUES 没有 false 启用AWS调用以验证过滤器
MCP_TRANSPORT 没有 stdio 运输方式: stdio, sse,o streamable-http
MCP_HOST 没有 0.0.0.0 (容器) SSE/HTTP传输的侦听主机
MCP_PORT 没有 8000 SSE/HTTP传输的侦听端口
MCP_MOUNT_PATH 否 - SSE/HTTP传输的可选装载路径

*需要两者之一: CLIENTS_CONFIG_SECRET (生产)或 CLIENTS_CONFIG_PATH /本地文件(开发)。


可用的工具

Cost Explorer MCP服务器提供以下工具:

工具

工具 描述
get_today_date 获取确定相关数据的当前日期
list_active_sessions 列出所有活动的成本管理器会话
close_session 关闭特定会话并释放资源

成本查询

工具 描述
get_dimension_values 获取特定维度(例如服务、区域)的可用值
get_tag_values 获取标签键的可用值
get_cost_and_usage 使用过滤和分组选项恢复AWS的成本和使用数据
get_cost_trend_with_anomalies 6个月趋势+在一次通话中检测异常

分析比较

工具 描述
get_cost_and_usage_comparisons 比较两个时期之间的成本,以确定变化和趋势
get_cost_comparison_drivers 分析导致期间之间成本变化的因素(前10名)
get_cost_forecast 根据历史使用模式生成成本预测
get_savings_commitments 当前存储计划和保留实例、覆盖范围和使用

库存

工具 描述
describe_ec2_instances EC2实例的紧凑信息
list_ec2_regions_with_instances 有实例的区域(运行/停止)
describe_ebs_volumes 带有孤儿检测的EBS卷
describe_ebs_snapshots 带有孤儿检测的EBS快照
describe_rds_instances RDS实例
describe_load_balancers 负载平衡器
describe_nat_gateways NAT网关
describe_elastic_ips 弹性IP
list_s3_buckets 带有生命周期标志的桶S3

使用

工具 描述
get_ec2_utilization 通过CloudWatch使用EC2实例的CPU
get_rds_utilization 使用 RDS。
get_ebs_utilization 使用 EBS。
get_elb_utilization 使用 Load Balancer。
get_nat_gateway_utilization 使用 NAT Gateway。
get_multi_resource_utilization 按使用桶分组的EC2+RDS

使用多帐户

重要:您必须始终通过 client_id 调用工具时。服务器将承担客户端配置的相应角色。

示例: get_cost_and_usage

{
  "client_id": "cuenta-produccion",
  "date_range": {
    "start_date": "2026-01-01",
    "end_date": "2026-01-31"
  },
  "granularity": "MONTHLY",
  "group_by": "SERVICE",
  "metric": "UnblendedCost"
}

成本验证和优化

验证如何工作

每次对Cost Explorer API的调用都会花费 $0.01。服务器在将请求发送到AWS之前对其进行验证。

本地验证(始终运行,不调用AWS):

  • 日期格式(YYY-MM-DD)
  • 日期范围逻辑(开始前结束)
  • 粒度限制(最多14小时)
  • 尺寸验证(服务、区域等)
  • 过滤器结构验证(AND,OR,NOT运算符)
  • 协议有效性(分组)

AWS验证(可选,默认禁用):

  • 验证维度值是否存在(例如,“Amazon EC2”是有效的服务值)
  • 验证标签值是否存在

成本估算

操作 API调用 成本
简单成本查询 1 $0.01
过滤器查询(验证已禁用) 1 $0.01
过滤查询(启用验证) 2+ $0.02+
成本比较 2 $0.02
预测成本 1 0.01美元

绝望

运输方式

模式 描述 用例
stdio 标准输入/输出 本地开发,CLI工具
sse 服务器发送HTTP事件 客户端web,MCP检查器
streamable-http 传输HTTP流媒体 推荐用于EKS

地方发展

# Instalar dependencias
uv sync

# Ejecutar con fichero local
CLIENTS_CONFIG_PATH=./clients.json uv run cost-optimizer

构建并推动ECR

aws ecr get-login-password --region eu-west-1 --profile <profile> \
  | docker login --username AWS --password-stdin \
    675492141136.dkr.ecr.eu-west-1.amazonaws.com

docker build -t mcp-costoptimizer-aws .
docker tag mcp-costoptimizer-aws:latest \
  675492141136.dkr.ecr.eu-west-1.amazonaws.com/mcp-costoptimizer-aws:latest
docker push \
  675492141136.dkr.ecr.eu-west-1.amazonaws.com/mcp-costoptimizer-aws:latest

在EKS中部署(通过Terraform/Terragrunt)

EKS的部署由REPO管理 innovation-account。需要:

  1. 在秘密管理器中创建秘密(一次):
aws secretsmanager create-secret \
  --name "mcp-cost-optimizer/clients" \
  --secret-string file://clients.json \
  --region eu-west-1 --profile <profile>
  1. 手动创建角色 mcp-cost-optimizer 在每个目标帐户中,具有中指定的权限和信任策略 需要IAM许可.

  2. 应用以下内容 :

cd config/eu-west-1/envs/cost-optimizer
terragrunt run-all apply

MCP将在集群内部提供:

http://mcp.cost-optimizer.svc.cluster.local:8000

测试

运行单元测试

uv sync --dev
source .venv/bin/activate
pytest tests/ -v -o "addopts="

使用示例

成本分析

Muestrame los costes de AWS de los ultimos 3 meses agrupados por servicio
Desglosa los costes de S3 por clase de almacenamiento del primer trimestre de 2026
Cuales fueron mis costes de instancias reservadas vs bajo demanda en mayo?

成本比较

Compara mis costes de AWS entre abril y mayo de 2026
Por que aumento mi factura de AWS en junio comparado con mayo?
Que causo el pico en mis costes de S3 el mes pasado?

预测

Haz una prevision de mis costes de AWS para el proximo mes
Cual sera mi factura total de AWS para el resto de 2026?

许可证

该项目是根据Apache 2.0许可证授权的-有关详细信息,请参阅许可证文件。