当 AI Agent 花钱快过账单告警:云凭证与成本护栏必须前移

2026-07-16 34 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

云成本治理过去主要防范人的误操作:工程师开错实例、忘记关闭测试环境,账单告警晚几个小时通常还有补救空间。但当携带云凭证的 AI Agent 能连续调用模型、创建资源并自动重试时,支出速度已经超过传统账单系统的反馈速度。

来源案例中,一家三人规模的代理机构因静态 AWS Access Key 被攻击者提取,一天内产生了 14,000 美元的 Amazon Bedrock Claude 调用费用。另一起 5 月发生的 DN42 事件中,自治 Agent 在 24 小时内创建了价值 6,531 美元的超规格基础设施。共同问题并不是没有账单告警,而是账单数据大约滞后一天,而 Agent 可以在几分钟内执行成千上万次操作。

预算告警不是实时断路器

AWS Budgets、成本异常检测和每日账单报表仍然有价值,但它们主要是观测工具,不能被当成实时配额系统。一次高频模型调用可能在成本数据完整出现前就已经结束;即使告警最终送达,资金也已经消耗。

Agent 场景需要区分三层控制:

  • 事前权限控制:Agent 能调用哪些模型、创建哪些实例、进入哪些区域。
  • 执行时速率控制:每分钟请求数、并发数、单任务 token 或资源额度。
  • 事后成本观测:预算、异常检测、审计日志和通知。

真正阻止失控支出的是前两层。第三层负责发现遗漏、支持调查,而不是承担紧急制动。

静态访问密钥把一次泄露变成持续消费能力

案例中的攻击入口是被提取的静态 Access Key。对 Agent 而言,这类长期凭证尤其危险:它可以被复制到日志、提示上下文、配置文件、构建产物或第三方工具中,而且通常不会随任务结束而失效。

更稳妥的做法是让 Agent 通过 IAM Role、容器任务角色、EC2 Instance Profile 或短期 STS 凭证获得权限。权限范围还要按任务收窄,不能因为 Agent 需要调用 Bedrock,就同时授予创建任意 EC2、修改 IAM 和读取全部 Secrets Manager 密钥的能力。

可以先用下面的命令盘点账户中的长期访问密钥。运行前需要配置 AWS CLI,并让当前身份拥有 iam:GenerateCredentialReportiam:GetCredentialReport 权限:

#!/usr/bin/env bash
set -euo pipefail

aws iam generate-credential-report >/dev/null

while true; do
  state=$(aws iam get-credential-report --query State --output text 2>/dev/null || true)
  if [ "$state" = "COMPLETE" ]; then
    break
  fi
  sleep 2
done

aws iam get-credential-report \
  --query Content \
  --output text | base64 --decode > credential-report.csv

awk -F, 'NR == 1 || $9 == "true" || $14 == "true"' credential-report.csv

输出中的 Access Key 仍然需要结合负责人、最后使用时间和工作负载逐项确认。不要直接批量删除;应先把应用迁移到角色凭证,再停用旧密钥并观察错误,最后删除。

把 Agent 权限写成可执行边界

下面是一份可以改造的 IAM 策略示例。假设 Agent 只需要在 us-east-1 调用一个明确批准的 Bedrock 模型。部署前应把模型 ARN、区域以及是否使用推理配置文件调整为实际环境值:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "InvokeApprovedModelOnly",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": "arn:aws:bedrock:us-east-1::foundation-model/REPLACE_WITH_APPROVED_MODEL_ID"
    },
    {
      "Sid": "DenyBedrockOutsideApprovedRegion",
      "Effect": "Deny",
      "Action": "bedrock:*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": "us-east-1"
        }
      }
    }
  ]
}

这份策略限制了可调用模型和区域,但它不是金额上限。IAM 判断的是“能不能执行”,并不计算“今天已经花了多少钱”。金额控制还需要应用侧计量、并发限制,以及在达到阈值时撤销会话或禁用调用路径。

对能够创建基础设施的 Agent,可以这样实践:

  • 通过 Service Control Policy 禁止未批准区域和昂贵实例族。
  • 要求资源带有 AgentRunIdOwnerExpiresAt 标签,否则拒绝创建。
  • 把实验环境放入独立账户,限制账户级服务配额和网络出口。
  • 只允许 Agent 调用经过校验的内部部署 API,不直接授予通用云管理权限。
  • 为每次任务设置最大步骤数、最大并发数和最大重试次数。

预算仍要配,但要按更短的响应链设计

预算告警适合成为最后一道可见性保障。下面的 CloudFormation 模板创建一个月度 500 美元预算,并在预测达到 80%、实际达到 100% 时发送邮件。把 you@example.com 和金额改成自己的值后再部署:

AWSTemplateFormatVersion: '2010-09-09'
Description: Budget notifications for an isolated AI agent account

Parameters:
  AlertEmail:
    Type: String
    Default: you@example.com
  MonthlyBudgetUsd:
    Type: Number
    Default: 500

Resources:
  AgentBudget:
    Type: AWS::Budgets::Budget
    Properties:
      Budget:
        BudgetName: ai-agent-monthly-budget
        BudgetLimit:
          Amount: !Ref MonthlyBudgetUsd
          Unit: USD
        BudgetType: COST
        TimeUnit: MONTHLY
      NotificationsWithSubscribers:
        - Notification:
            ComparisonOperator: GREATER_THAN
            NotificationType: FORECASTED
            Threshold: 80
            ThresholdType: PERCENTAGE
          Subscribers:
            - Address: !Ref AlertEmail
              SubscriptionType: EMAIL
        - Notification:
            ComparisonOperator: GREATER_THAN
            NotificationType: ACTUAL
            Threshold: 100
            ThresholdType: PERCENTAGE
          Subscribers:
            - Address: !Ref AlertEmail
              SubscriptionType: EMAIL

部署命令如下:

aws cloudformation deploy \
  --stack-name ai-agent-budget \
  --template-file budget.yaml \
  --parameter-overrides \
    AlertEmail=ops@example.com \
    MonthlyBudgetUsd=500

这里的关键边界是:预算通知不能保证在 500 美元整点停止消费。它应该触发值班流程、自动化调查或权限收缩,但不能代替调用路径上的硬限制。

上线前检查清单

把云凭证交给 Agent 之前,应至少确认以下事项:

  • Agent 使用短期角色凭证,不在提示、仓库或环境镜像中保存静态密钥。
  • IAM 只允许明确的模型、动作、区域和资源,不使用宽泛的管理员策略。
  • 模型网关和部署接口具备并发、速率、步骤数与重试上限。
  • 高成本资源受到实例类型、数量、区域和标签策略约束。
  • Agent 运行在隔离账户或项目中,爆炸半径与生产环境分离。
  • CloudTrail、Bedrock 调用日志和资源创建事件进入集中审计系统。
  • 预算和异常告警有人接收,并有停用角色、撤销会话和关闭任务的操作手册。
  • 团队实际演练过凭证泄露与 Agent 失控,而不只是配置了告警。

Agent 把云操作从“人每分钟点击几次”提升到“程序每秒执行多次”。成本治理也必须从延迟报表转向执行前授权和执行中限流。账单告警依然必要,但它更像审计信号;真正的护栏必须位于凭证、策略、网关和资源配额上。


相关推荐