如何监控AWS ALB私有IP地址变更并触发告警?
AWS ALB私有IP变更监控与告警方案(CloudWatch/EventBridge/Lambda实现)
ALB因维护变更私有IP时确实不会提前通知,下面是两种经过实践验证的实现方案,分别基于事件驱动(实时监控)和定期轮询(兜底校验),结合EventBridge、Lambda和CloudWatch/SNS完成告警:
一、事件驱动型(实时捕获IP变更)
1. 配置EventBridge规则捕获ENI变更事件
ALB的私有IP实际关联的是其管理的弹性网络接口(ENI),当IP变更时,EC2会触发对应的ENI事件。我们可以通过EventBridge精准过滤目标ALB的ENI事件:
- 事件源选择
AWS服务,服务名称为EC2,事件类型选择以下两类:EC2:NetworkInterfacePrivateIpAddressAddedEC2:NetworkInterfacePrivateIpAddressRemoved
- 添加过滤条件:匹配ENI的标签
aws:elasticloadbalancing:loadbalancer-name等于你的ALB名称(ALB的ENI会自动带上这个标签),确保只监控目标ALB的变更。
2. 编写Lambda函数处理事件并告警
创建Python Lambda函数,由上述EventBridge规则触发,核心逻辑如下:
import boto3 import os sns_client = boto3.client('sns') SNS_TOPIC_ARN = os.environ['SNS_TOPIC_ARN'] TARGET_ALB_NAME = os.environ['TARGET_ALB_NAME'] def lambda_handler(event, context): # 解析EventBridge事件内容 event_detail = event['detail'] eni_id = event_detail['networkInterfaceId'] ip_change_type = event['detail-type'].split(':')[1] # 提取Added/Removed affected_ips = event_detail['privateIpAddresses'] # 确认ENI属于目标ALB(二次校验,避免误触发) ec2_client = boto3.client('ec2') eni_tags = ec2_client.describe_tags(Filters=[ {'Name': 'resource-id', 'Values': [eni_id]}, {'Name': 'key', 'Values': ['aws:elasticloadbalancing:loadbalancer-name']} ])['Tags'] if not any(tag['Value'] == TARGET_ALB_NAME for tag in eni_tags): return # 构造告警消息 alert_msg = f"ALB {TARGET_ALB_NAME} 私有IP发生变更:\n" alert_msg += f"变更类型: {ip_change_type}\n" alert_msg += f"受影响IP: {', '.join(affected_ips)}\n" alert_msg += f"ENI ID: {eni_id}" # 发送告警到SNS主题 sns_client.publish( TopicArn=SNS_TOPIC_ARN, Message=alert_msg, Subject=f"ALB私有IP变更告警 - {TARGET_ALB_NAME}" ) return {"statusCode": 200, "body": "Alert sent successfully"}
- 配置Lambda环境变量:
SNS_TOPIC_ARN(接收告警的SNS主题ARN)、TARGET_ALB_NAME(你的ALB名称)。 - 给Lambda添加权限:允许访问EC2的
DescribeTags、SNS的Publish,以及EventBridge的触发权限。
二、定期轮询型(兜底校验,避免事件丢失)
如果担心EventBridge事件漏捕,可以搭配定期轮询方案,通过CloudWatch定时触发Lambda对比ALB IP:
1. 配置CloudWatch定时规则
创建EventBridge定时规则,设置触发频率(比如每5分钟),目标选择你的轮询Lambda函数。
2. 编写Lambda轮询与对比逻辑
使用DynamoDB存储ALB的历史IP列表,每次轮询对比IP差异:
import boto3 import os elbv2_client = boto3.client('elbv2') dynamodb_client = boto3.client('dynamodb') sns_client = boto3.client('sns') SNS_TOPIC_ARN = os.environ['SNS_TOPIC_ARN'] TARGET_ALB_ARN = os.environ['TARGET_ALB_ARN'] DYNAMODB_TABLE = os.environ['DYNAMODB_TABLE'] def lambda_handler(event, context): # 获取当前ALB的私有IP列表 alb_response = elbv2_client.describe_load_balancers(LoadBalancerArns=[TARGET_ALB_ARN]) current_ips = [] for az in alb_response['LoadBalancers'][0]['AvailabilityZones']: for addr in az.get('LoadBalancerAddresses', []): if 'PrivateIpAddress' in addr: current_ips.append(addr['PrivateIpAddress']) current_ips = sorted(current_ips) # 获取历史IP列表 db_response = dynamodb_client.get_item( TableName=DYNAMODB_TABLE, Key={'alb_arn': {'S': TARGET_ALB_ARN}} ) old_ips = sorted(db_response['Item']['ip_list']['SS']) if 'Item' in db_response else [] # 对比IP差异 if current_ips != old_ips: # 构造变更消息 added_ips = list(set(current_ips) - set(old_ips)) removed_ips = list(set(old_ips) - set(current_ips)) alert_msg = f"ALB IP变更检测:\n" if added_ips: alert_msg += f"新增IP: {', '.join(added_ips)}\n" if removed_ips: alert_msg += f"移除IP: {', '.join(removed_ips)}\n" alert_msg += f"当前IP列表: {', '.join(current_ips)}" # 发送告警并更新DynamoDB sns_client.publish( TopicArn=SNS_TOPIC_ARN, Message=alert_msg, Subject="ALB私有IP变更告警(轮询检测)" ) dynamodb_client.put_item( TableName=DYNAMODB_TABLE, Item={ 'alb_arn': {'S': TARGET_ALB_ARN}, 'ip_list': {'SS': current_ips}, 'last_updated': {'S': context.request_time} } ) return {"statusCode": 200, "body": "Polling completed"}
- 预先创建DynamoDB表,主键为
alb_arn(字符串类型),存储ip_list(字符串集合)和last_updated(字符串)。 - Lambda权限:允许访问
elbv2:DescribeLoadBalancers、dynamodb:GetItem/PutItem、sns:Publish。
三、告警通知渠道
- 通过SNS主题订阅邮件、短信,实现基础告警。
- 若需要集成企业聊天工具(如Slack/Teams),可以在Lambda中直接调用对应Webhook接口,或者添加SNS到Chatbot的集成。
- 也可以在CloudWatch中创建自定义指标告警:让Lambda上报
ALBIPChange指标,当指标值>0时触发CloudWatch告警。
四、注意事项
- 权限最小化:给Lambda配置最窄的权限范围,避免过度授权。
- 去重处理:事件驱动方案中,同一IP变更可能触发多次事件,可在Lambda中记录最近事件ID到DynamoDB,避免重复告警。
- 多ALB扩展:可以将ALB配置存入Lambda环境变量或参数存储,实现一个Lambda监控多个ALB。
内容的提问来源于stack exchange,提问作者jh12298
相关产品推荐
相关产品推荐

