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

如何监控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:NetworkInterfacePrivateIpAddressAdded
    • EC2: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:10:49