云成本治理过去主要防范人的误操作:工程师开错实例、忘记关闭测试环境,账单告警晚几个小时通常还有补救空间。但当携带云凭证的 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:GenerateCredentialReport 和 iam: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 禁止未批准区域和昂贵实例族。
- 要求资源带有
AgentRunId、Owner、ExpiresAt标签,否则拒绝创建。 - 把实验环境放入独立账户,限制账户级服务配额和网络出口。
- 只允许 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 把云操作从“人每分钟点击几次”提升到“程序每秒执行多次”。成本治理也必须从延迟报表转向执行前授权和执行中限流。账单告警依然必要,但它更像审计信号;真正的护栏必须位于凭证、策略、网关和资源配额上。