AWS Billing Budget告警阈值触发动作功能是否已移除?
关于AWS Billing Budgets动作功能及沙箱账户自动化控制的解决方案
一、Billing Budgets动作功能的现状
AWS Billing Budgets的阈值触发动作功能并没有被移除,而是整合到了Budget Actions模块中——可能是入口调整让你没找到。如果仍看不到该选项,大概率是权限问题:需确保你的IAM用户/角色拥有budgets:ModifyBudget、budgets:CreateBudgetAction这类权限;另外,个人沙箱账户可能存在部分功能限制,建议检查账户状态是否正常。
二、无法使用原生Budget Actions的替代方案
如果确实无法通过原生功能配置动作,用SNS+Lambda的组合完全可以实现需求:
- 创建一个SNS主题,将Lambda函数设为订阅者
- 在Billing Budgets的告警配置里,选择触发时向该SNS主题发送通知
- 编写Lambda函数逻辑,接收SNS推送的预算触发消息,执行对应的资源管控操作(比如停止实例、删除非必要资源)
三、个人沙箱账户自动化阈值强制控制的具体实现
针对沙箱账户,推荐以下轻量方案:
- 标签化管理资源:给所有需要被强制管控的资源(EC2、RDS、EBS等)打上统一标签,比如
BudgetControl:Yes,方便Lambda精准定位 - 配置IAM角色:给Lambda创建专属IAM角色,赋予最小必要权限,示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:StopInstances", "rds:StopDBInstance", "ec2:DeleteVolumes" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/BudgetControl": "Yes" } } }, { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/*" } ] } - 编写Lambda函数(Python示例):
import boto3 import json ec2 = boto3.client('ec2') rds = boto3.client('rds') def lambda_handler(event, context): # 解析SNS消息,确认是预算阈值触发 sns_message = json.loads(event['Records'][0]['Sns']['Message']) if 'budgetThresholdExceeded' in sns_message.get('message', ''): # 停止带指定标签的EC2实例 ec2_instances = ec2.describe_instances(Filters=[{'Name': 'tag:BudgetControl', 'Values': ['Yes']}]) instance_ids = [inst['InstanceId'] for res in ec2_instances['Reservations'] for inst in res['Instances']] if instance_ids: ec2.stop_instances(InstanceIds=instance_ids) print(f"Stopped EC2 instances: {instance_ids}") # 停止带指定标签的RDS实例 rds_instances = rds.describe_db_instances() rds_ids = [db['DBInstanceIdentifier'] for db in rds_instances['DBInstances'] if any(tag['Key'] == 'BudgetControl' and tag['Value'] == 'Yes' for tag in db['TagList'])] if rds_ids: for db_id in rds_ids: rds.stop_db_instance(DBInstanceIdentifier=db_id) print(f"Stopped RDS instances: {rds_ids}") return {'statusCode': 200, 'body': 'Action executed successfully'} - 测试与验证:手动触发SNS消息,或者调整预算阈值进行测试,确保Lambda能正确执行资源管控动作
注意事项
- 沙箱账户有额度上限,建议将阈值设置在接近上限的80%-90%,提前触发动作避免超额
- 避免给核心测试资源打管控标签,防止误操作影响正常开发
- 定期检查Lambda日志,确认动作执行情况
内容的提问来源于stack exchange,提问作者DimitriosK
相关产品推荐
相关产品推荐

