如何在账单阈值超限时自动停止EC2实例?
当账单达到阈值时自动停止EC2实例的实现方案
要实现账单达到限定额度或超出阈值时自动停止EC2实例,可通过AWS Budgets + SNS + Lambda的组合方案完成,以下是具体操作步骤:
1. 创建AWS预算并配置告警
- 登录AWS控制台,进入「Billing and Cost Management」→「Budgets」页面。
- 点击「Create budget」,选择「Cost budget」类型,设置预算周期(如月度)和具体限定额度。
- 在「Alert thresholds」模块,设置触发条件:比如当实际成本达到预算的100%(或自定义比例)时触发告警。
- 选择「Send notifications to an SNS topic」,关联后续创建的SNS主题(若未创建,可先记录主题ARN格式)。
2. 创建SNS主题
- 进入SNS控制台,点击「Create topic」,选择「Standard」类型,输入主题名称。
- 主题创建完成后,复制其ARN,用于后续预算告警与Lambda的关联配置。
3. 编写Lambda函数实现EC2停止逻辑
- 进入Lambda控制台,点击「Create function」,选择「Author from scratch」,设置函数名称和Python(或你熟悉的语言)运行时。
- 替换默认代码为以下示例(可按需调整实例筛选规则):
import boto3 def lambda_handler(event, context): ec2_client = boto3.client('ec2') # 筛选带有AutoStop=True标签的运行中EC2实例,避免误停其他实例 response = ec2_client.describe_instances( Filters=[ {'Name': 'tag:AutoStop', 'Values': ['True']}, {'Name': 'instance-state-name', 'Values': ['running']} ] ) target_instance_ids = [] for reservation in response['Reservations']: for instance in reservation['Instances']: target_instance_ids.append(instance['InstanceId']) if target_instance_ids: ec2_client.stop_instances(InstanceIds=target_instance_ids) print(f"成功停止实例: {', '.join(target_instance_ids)}") else: print("未找到符合条件的运行中EC2实例")
- 配置Lambda执行角色权限:给角色添加以下IAM策略,确保其能操作EC2并接收SNS消息:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:StopInstances", "ec2:DescribeInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": "sns:Receive", "Resource": "你的SNS主题ARN" } ] }
- 给Lambda添加触发源:选择「SNS」,关联之前创建的SNS主题,保存配置。
4. 验证与测试
- 手动向SNS主题发送测试消息,检查Lambda是否正常触发并停止目标EC2实例。
- 可先设置较低的预算阈值进行模拟测试,确保整个流程正常运行。
注意事项
- 建议给需要自动停止的EC2实例添加统一标签(如示例中的
AutoStop=True),避免误停业务实例。 - 可设置多级告警:比如成本达到预算的80%时发送通知提醒,达到100%时触发停止操作。
- 确保Lambda函数的执行角色权限最小化,避免过度授权。
内容的提问来源于stack exchange,提问作者Guru Gag
相关产品推荐
相关产品推荐

