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

AWS Lambda磁盘告警函数开发:如何动态设置AutoScalingGroupName变量

核心问题解答

关于Auto Scaling客户端初始化的要求

  • 你确实需要新增Auto Scaling服务的Boto3客户端调用,但绝对不能直接用client作为Auto Scaling的变量名——否则会直接覆盖之前已经初始化的CloudWatch客户端,导致后续创建告警的代码抛出变量未定义的错误。
  • 正确的初始化逻辑是为不同服务的客户端设置独立的变量名,比如将CloudWatch客户端命名为cloudwatch_client,Auto Scaling客户端命名为autoscaling_client,两个变量完全独立不会产生覆盖问题。

动态传入AutoScalingGroupName的实现方法

整个动态变量注入的逻辑可以按3步落地,完全匹配你已知的CLI查询逻辑,只是把CLI命令替换成Boto3 API调用:

  1. 前置获取目标实例ID列表:你提到的{instance_id}是需要动态获取的变量,不能硬编码占位符,需要先调用EC2 API拉取所有需要配置告警的运行中实例ID,逐个处理。
  2. 调用Auto Scaling API查询对应组名:用初始化好的autoscaling_client,传入当前遍历的实例ID做过滤条件,提取返回结果中的AutoScalingGroupName值。这里需要做边界判断:如果某个实例不属于任何Auto Scaling组,对应维度值设为空字符串即可,避免API调用报错。
  3. 变量替换传入告警配置:把原来硬写占位符{instance_id}的AutoScalingGroupName维度值,替换成你查询得到的组名变量即可。

修正后的完整可运行代码

import boto3
# 独立初始化各服务客户端,避免变量覆盖
cloudwatch_client = boto3.client('cloudwatch')
autoscaling_client = boto3.client('autoscaling')
ec2_client = boto3.client('ec2')

def lambda_handler(event, context):
    # 批量获取所有运行状态的EC2实例列表,可按需增加标签过滤条件
    ec2_resp = ec2_client.describe_instances(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]
    )
    target_instance_ids = []
    for reservation in ec2_resp['Reservations']:
        for instance in reservation['Instances']:
            target_instance_ids.append(instance['InstanceId'])

    # 逐实例创建磁盘使用率告警
    for instance_id in target_instance_ids:
        # 根据当前实例ID查询所属Auto Scaling组
        asg_resp = autoscaling_client.describe_auto_scaling_instances(
            InstanceIds=[instance_id]
        )
        # 处理无关联ASG的边界场景
        if not asg_resp['AutoScalingInstances']:
            current_asg_name = ''
        else:
            current_asg_name = asg_resp['AutoScalingInstances'][0]['AutoScalingGroupName']

        # 生成告警配置,将动态变量填充到对应位置
        cloudwatch_client.put_metric_alarm(
            AlarmName=f'Disk Monitor - {instance_id}',  # 告警名加实例ID后缀避免重名覆盖
            MetricName='disk_used_percent',
            Namespace='CWAgent',
            Statistic='Maximum',
            ComparisonOperator='GreaterThanOrEqualToThreshold',
            Threshold=60.0,
            Period=300,  # 原代码10秒周期不符合CloudWatch规则,需设为60的整数倍
            EvaluationPeriods=3,
            Dimensions=[
                {
                    'Name': 'InstanceId',
                    'Value': instance_id
                },
                {
                    'Name': 'AutoScalingGroupName',
                    'Value': current_asg_name
                },
                {
                    'Name': 'fstype',
                    'Value': 'xfs'
                },
                {
                    'Name': 'path',
                    'Value': '/'
                }
            ],
            Unit='Percent',
            ActionsEnabled=True
        )

关键注意事项

  • 原代码中Period=10的配置不符合CloudWatch API规则:指标采集周期必须是60秒的整数倍(最小60秒),否则会直接触发参数校验报错。
  • 原代码所有告警统一使用“Disk Monitor”作为名称,会导致每创建一个新告警就覆盖之前的旧告警,必须加唯一标识(比如实例ID后缀)做区分。
  • 执行该Lambda的角色需要提前配置三类权限:CloudWatch的PutMetricAlarm权限、Auto Scaling的DescribeAutoScalingInstances权限、EC2的DescribeInstances权限,否则API调用会因权限不足被拒绝。
  • 需提前确认所有目标实例已经部署并配置CloudWatch Agent的磁盘指标采集,否则disk_used_percent指标不存在,告警永远不会触发。

内容的提问来源于stack exchange,提问作者Scouse_Bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 18:54:00