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

