本文面向 AWS 新手,手把手教你如何监控每个 IAM 用户的 Bedrock 花费,设置预算告警,并在超预算时自动阻断访问。
Amazon Bedrock 按 token 计费(输入 token + 输出 token),如果团队中有人大量调用模型,可能产生意外高额账单。我们需要:
| 服务 | 作用 | 类比 |
|---|---|---|
| IAM Principal-Based Cost Allocation | 自动记录每次 Bedrock 调用是谁发起的,按用户拆分账单 | 费用详单,按照tag 统计,可以设置user,env,project等等业务标签 |
| AWS Budgets | 设置预算上限,到达阈值时发送通知 | 手机套餐余量提醒 |
| AWS Budgets Actions | 超预算时自动执行操作(如附加 Deny 策略) | 费用用完自动停机 |
用户调用 Bedrock API
↓
AWS 自动记录:谁调用的 + 花了多少钱(IAM Principal Cost Allocation)
↓
花费数据汇入 AWS Billing(有几小时延迟)
↓
AWS Budgets 持续检查:当前花费 vs 预算阈值
↓
├── 达到 80% → 发送告警邮件
└── 达到 100% → 发送告警邮件 + 触发 Budget Action
↓
自动给用户附加 Deny Policy
↓
用户再调用 Bedrock → 被拒绝(403)
↓
下个月初自动移除 Deny Policy → 恢复访问
AmazonBedrockFullAccess,只要同时附加了一个 Deny Bedrock
的策略,就无法访问。架构图文件:bedrock-budget-architecture.drawio
<YOUR_ACCOUNT_ID>)aws configure)brclient)用 CloudTrail 查询最近的 Bedrock 调用记录:
aws cloudtrail lookup-events \
--region us-east-1 \
--lookup-attributes AttributeKey=EventSource,AttributeValue=bedrock.amazonaws.com \
--max-results 20 \
--query 'Events[].{Time:EventTime, User:Username, Event:EventName}' \
--output table示例输出:
| Event | Time | User |
+-----------------------+-----------------------------+----------------------+
| ConverseStream | 2026-05-05T16:16:21+08:00 | brclient |
| ConverseStream | 2026-05-05T11:01:16+08:00 | <INSTANCE_ID> |
| ListFoundationModels | 2026-05-05T15:59:21+08:00 | <YOUR_IAM_USER> |
从这里可以看到 brclient 是主要的 Bedrock 调用者。
AWS 会自动在账单数据中记录每次 Bedrock API 调用的 IAM 身份。你只需要在 Billing Console 中”激活”这个功能。
aws:PrincipalTag 相关标签# 给 brclient 打上部门标签
aws iam tag-user --user-name brclient --tags Key=Department,Value=AI-Team
aws iam tag-user --user-name brclient --tags Key=Project,Value=ChatBot在 Cost Explorer 中可以看到类似: - brclient: $3.91(本月) - other-user: $1.20(本月)
AWS Budgets 会持续监控你指定服务的花费,当达到设定阈值时发送邮件通知。
aws budgets create-budget \
--account-id <YOUR_ACCOUNT_ID> \
--budget '{
"BudgetName": "Bedrock-Monthly-Budget",
"BudgetLimit": {
"Amount": "10",
"Unit": "USD"
},
"TimeUnit": "MONTHLY",
"BudgetType": "COST",
"CostFilters": {
"Service": ["Amazon Bedrock"]
},
"CostTypes": {
"IncludeTax": true,
"IncludeSubscription": true,
"UseBlended": false,
"IncludeRefund": false,
"IncludeCredit": false,
"IncludeUpfront": true,
"IncludeRecurring": true,
"IncludeOtherSubscription": true,
"IncludeSupport": true,
"IncludeDiscount": true,
"UseAmortized": false
}
}' \
--notifications-with-subscribers '[
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{
"SubscriptionType": "EMAIL",
"Address": "<YOUR_EMAIL>"
}
]
},
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 100,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{
"SubscriptionType": "EMAIL",
"Address": "<YOUR_EMAIL>"
}
]
}
]' \
--region us-east-1| 参数 | 值 | 含义 |
|---|---|---|
| BudgetName | Bedrock-Monthly-Budget | 预算名称 |
| Amount | 10 | 月度预算 $10 |
| TimeUnit | MONTHLY | 按月计算,还有按天,按小时等多种方式 |
| CostFilters.Service | Amazon Bedrock | 只监控 Bedrock 服务 |
| Threshold 80% | ACTUAL | 实际花费到 $8 时告警 |
| Threshold 100% | ACTUAL | 实际花费到 $10 时告警 |
aws budgets describe-budget \
--account-id <YOUR_ACCOUNT_ID> \
--budget-name "Bedrock-Monthly-Budget" \
--region us-east-1创建一个 IAM Policy,明确拒绝(Deny)Bedrock 的推理 API。由于 AWS 的 Deny 优先原则,即使用户有 FullAccess,附加这个 Deny 策略后就无法调用 Bedrock。
aws iam create-policy \
--policy-name "DenyBedrockAccess" \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
"bedrock:Converse",
"bedrock:ConverseStream"
],
"Resource": "*"
}
]
}'AWS Budgets 需要一个 IAM Role 来代替你执行”附加策略”的操作。这个 Role
的信任关系允许 budgets.amazonaws.com 服务来 Assume 它。
4.1 创建 Role:
aws iam create-role \
--role-name "BudgetActionRole" \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "budgets.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'4.2 给 Role 授权(允许它附加/移除策略):
aws iam put-role-policy \
--role-name "BudgetActionRole" \
--policy-name "BudgetActionPermissions" \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:AttachUserPolicy",
"iam:DetachUserPolicy"
],
"Resource": "arn:aws:iam::<YOUR_ACCOUNT_ID>:user/brclient"
}
]
}'brclient
用户进行策略附加/移除操作(最小权限原则)将前面创建的 Budget、Deny Policy、Action Role 串联起来:当 Budget 检测到花费超过阈值时,自动使用 Action Role 将 Deny Policy 附加到目标用户。
aws budgets create-budget-action \
--account-id <YOUR_ACCOUNT_ID> \
--budget-name "Bedrock-Monthly-Budget" \
--notification-type ACTUAL \
--action-type APPLY_IAM_POLICY \
--action-threshold '{
"ActionThresholdValue": 100,
"ActionThresholdType": "PERCENTAGE"
}' \
--definition '{
"IamActionDefinition": {
"PolicyArn": "arn:aws:iam::<YOUR_ACCOUNT_ID>:policy/DenyBedrockAccess",
"Users": ["brclient"]
}
}' \
--execution-role-arn "arn:aws:iam::<YOUR_ACCOUNT_ID>:role/BudgetActionRole" \
--approval-model AUTOMATIC \
--subscribers '[
{
"SubscriptionType": "EMAIL",
"Address": "<YOUR_EMAIL>"
}
]' \
--region us-east-1| 参数 | 值 | 含义 |
|---|---|---|
| notification-type | ACTUAL | 基于实际花费(非预测) |
| action-type | APPLY_IAM_POLICY | 操作类型:附加 IAM 策略 |
| ActionThresholdValue | 100 | 100% 预算时触发 |
| PolicyArn | DenyBedrockAccess | 要附加的 Deny 策略 |
| Users | brclient | 目标用户 |
| approval-model | AUTOMATIC | 自动执行,无需人工审批 |
aws budgets describe-budget-actions-for-budget \
--account-id <YOUR_ACCOUNT_ID> \
--budget-name "Bedrock-Monthly-Budget" \
--region us-east-1预期输出中应看到
"Status": "STANDBY"(待命中,等待触发)。
aws budgets describe-budget \
--account-id <YOUR_ACCOUNT_ID> \
--budget-name "Bedrock-Monthly-Budget" \
--region us-east-1 \
--query 'Budget.{Name:BudgetName, Limit:BudgetLimit.Amount, Spent:CalculatedSpend.ActualSpend.Amount, Forecast:CalculatedSpend.ForecastedSpend.Amount}'我们的实际测试结果:
{
"Name": "Bedrock-Monthly-Budget",
"Limit": "10.0", // 预算 $10
"Spent": "3.909", // 已花 $3.91
"Forecast": "4.346" // 预测本月 $4.35
}brclient 的凭证持续调用 Bedrock,直到花费超过
$8aws iam list-attached-user-policies --user-name brclient注意测试 IAM principal Tag的时候,需要24小时才回生效
可以临时把预算改成 $3(低于当前已花费的 $3.91)来触发:
aws budgets update-budget --account-id <YOUR_ACCOUNT_ID> --new-budget '{
"BudgetName": "Bedrock-Monthly-Budget",
"BudgetLimit": {"Amount": "#", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST",
"CostFilters": {"Service": ["Amazon Bedrock"]}
}'
响应的用户调用bedrock的时候就会爆如下错误
{
"error": true,
"message": "User: arn:aws:iam::****:user/brclient is not authorized to perform: bedrock:InvokeModelWithResponseStream on resource: arn:aws:bedrock:us-east-1:****:inference-profile/us.deepseek.r1-v1:0 with an explicit deny in an identity-based policy: arn:aws:iam::****:policy/DenyBedrockAccess"
}
更新(2026-05):经验证,AWS Budgets 现已支持通过 Tag 维度按
iamPrincipal/user过滤。
在 AWS Budgets Console 中创建/编辑 Budget 时,可以添加如下 Filter:
| 维度 | 类型 | 操作 | 值 |
|---|---|---|---|
| Dimension | Tag | Includes | iamPrincipal/user = brclient |
这意味着现在可以为单个 IAM 用户创建独立的 Bedrock 预算,实现按用户级别的费用监控和告警。
Bedrock-Monthly-Budget 实际配置通过 aws budgets describe-budget 确认,当前 budget
使用的是新版 FilterExpression:
{
"FilterExpression": {
"And": [
{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon Bedrock"]
}
},
{
"Not": {
"Dimensions": {
"Key": "RECORD_TYPE",
"Values": ["Credit", "Refund"]
}
}
}
]
}
}EXECUTION_SUCCESS(DenyBedrockAccess 已自动附加到
brclient)如果需要按用户过滤,可以在 Console 中编辑 Budget,添加 Tag filter: -
Filter type: Tag - Tag Key:
iamPrincipal/user - Includes Values:
brclient
或通过 CLI 更新 budget,在 FilterExpression 中添加 Tag
条件:
{
"And": [
{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon Bedrock"]
}
},
{
"Tags": {
"Key": "iamPrincipal/user",
"Values": ["brclient"]
}
},
{
"Not": {
"Dimensions": {
"Key": "RECORD_TYPE",
"Values": ["Credit", "Refund"]
}
}
}
]
}注意:IAM Principal Tag 需要先在 Billing Console 的 Cost Allocation Tags 中激活,激活后约 24 小时才能在 Budget filter 中生效。
账单(Cost Explorer)上已支持 IAM Principal:
Budget 上现在也已支持 IAM Principal Tag filter(Dimension → Tag → iamPrincipal/user → Includes → brclient):
A: AWS Billing 数据有 4-8 小时延迟。Budget Action 在 Billing 数据更新后才会触发。这不是实时阻断。
A: 是的。Budget Action 的 IAM Policy 类型会在每个预算周期开始时自动重置(移除 Deny Policy),用户恢复访问。
A: 需要在 Bedrock 前面加一层网关(如 AWS Step Functions Cost Sentry 或 LiteLLM Proxy),在每次请求前检查 token 预算。
A: 需要为每个用户创建单独的 Budget,并使用 Cost Allocation Tags 过滤。
A: 可以,把 AUTOMATIC 改成
MANUAL。超预算时会发邮件通知你,你在 Console
中手动批准后才执行。
A: Budget 监控和通知免费。前 2 个 Action-enabled Budget 免费,之后每个 $0.10/天。
| 资源类型 | 名称 / ID | 用途 |
|---|---|---|
| AWS Budget | Bedrock-Monthly-Budget | 月度 $10 预算 |
| IAM Policy | DenyBedrockAccess | 超预算时附加的 Deny 策略 |
| IAM Role | BudgetActionRole | 授权 Budgets 服务执行操作 |
| Budget Action | 自动执行逻辑 |
# 删除 Budget Action
aws budgets delete-budget-action --account-id <YOUR_ACCOUNT_ID> \
--budget-name "Bedrock-Monthly-Budget" \
--action-id "<ACTION_ID>" --region us-east-1
# 删除 Budget
aws budgets delete-budget --account-id <YOUR_ACCOUNT_ID> \
--budget-name "Bedrock-Monthly-Budget" --region us-east-1
# 删除 IAM Policy(需要先确认没有附加到任何用户)
aws iam delete-policy --policy-arn arn:aws:iam::<YOUR_ACCOUNT_ID>:policy/DenyBedrockAccess
# 删除 Role 的内联策略,再删除 Role
aws iam delete-role-policy --role-name BudgetActionRole --policy-name BudgetActionPermissions
aws iam delete-role --role-name BudgetActionRole