You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:33:10