如何用Python Boto3将AWS子账号ID作为变量传入CloudWatch告警动作参数
使用Boto3为AWS子账号创建CPU使用率触发的EC2停止告警
刚好我之前帮团队落地过类似需求,给你一步步拆解具体怎么实现:
1. 正确构造子账号的EC2停止动作ARN
你提到的根账号ARN格式,子账号只需要把账号ID替换成你的accnum变量就行,完整格式如下(记得替换成实例所在的目标区域):
stop_action_arn = f"arn:aws:swf:{region}:{accnum}:action/actions/AWS_EC2.InstanceId.Stop/1.0"
这里的
region要和EC2实例的区域保持一致,比如us-east-1、ap-southeast-1这类标准区域标识。
2. 给子账号配置必要的IAM权限
在创建告警前,子账号必须具备以下权限,否则执行时会报错:
cloudwatch:PutMetricAlarm:创建CloudWatch告警的权限ec2:StopInstances:停止EC2实例的权限- 可选:
cloudwatch:DescribeAlarms:用于验证告警是否创建成功
可以给子账号附加这样的IAM策略(JSON格式):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricAlarm", "cloudwatch:DescribeAlarms", "ec2:StopInstances" ], "Resource": "*" } ] }
3. Boto3完整代码示例
下面是直接可用的代码,你只需要替换instance_id、region这些变量即可:
import boto3 # 你的子账号ID(已存储在accnum变量) accnum = "123456789012" # 目标EC2实例ID instance_id = "i-0abcdef1234567890" # 实例所在区域 region = "us-east-1" # 初始化CloudWatch客户端 cloudwatch = boto3.client('cloudwatch', region_name=region) # 构造告警参数 alarm_params = { 'AlarmName': f'EC2-CPU-High-Stop-{instance_id}', 'AlarmDescription': 'Stop EC2 instance when CPU utilization exceeds 10%', 'ActionsEnabled': True, 'AlarmActions': [ # 这里使用构造好的子账号停止动作ARN f"arn:aws:swf:{region}:{accnum}:action/actions/AWS_EC2.InstanceId.Stop/1.0" ], 'MetricName': 'CPUUtilization', 'Namespace': 'AWS/EC2', 'Statistic': 'Average', 'Dimensions': [ { 'Name': 'InstanceId', 'Value': instance_id }, ], 'Period': 60, # 每60秒采集一次CPU数据 'EvaluationPeriods': 2, # 连续2个周期超过阈值才触发动作 'Threshold': 10.0, 'ComparisonOperator': 'GreaterThanThreshold', 'Unit': 'Percent' } # 创建告警 try: response = cloudwatch.put_metric_alarm(**alarm_params) print(f"告警创建成功!响应信息: {response}") except Exception as e: print(f"创建告警失败: {str(e)}")
4. 验证告警是否生效
创建完成后,你可以通过两种方式确认:
- 登录AWS控制台,进入CloudWatch -> 告警列表,查看是否存在刚刚创建的告警
- 使用Boto3接口查询告警详情:
alarms = cloudwatch.describe_alarms(AlarmNames=[f'EC2-CPU-High-Stop-{instance_id}']) print(alarms['MetricAlarms'][0])
内容的提问来源于stack exchange,提问作者FCoding
相关产品推荐
相关产品推荐

