从“HTTPCode_ELB_5XX_Count”CloudWatch 指标中排除 HTTP 501

问题描述 投票:0回答:1

我有一个 AWS Application Load Balancer,并且正在根据

HTTPCode_ELB_5XX_Count
CloudWatch 指标执行一些警报,但不幸的是它也会触发 HTTP 501:

HTTP 501:未实现

负载均衡器收到带有不支持值的 Transfer-Encoding 标头。支持的 Transfer-Encoding 的值是分块的和标识的。作为替代方案,您可以使用 内容编码标头。

AWS ALB 501 可以由客户端轻松触发 (

curl -i --http1.1 --data "hi" --header "Transfer-Encoding: omg" "https://api.example.com/my_api"
),因此:有没有办法获取 5XX 的 CloudWatch 指标计数,而不是501

我知道还有其他选项(CloudWatch 日志和查询、执行 Lambda、支付 $$$$$$$ 通过 AWS WAF 进行阻止),但我只是想看看是否可以通过 CW 指标来实现。

(有一个非常聪明的方法可以使用综合指标排除其他一些5XX,但不幸的是没有

HTTPCode_ELB_501_Count
指标可以排除!为什么?为什么!?

amazon-web-services amazon-cloudwatch
1个回答
0
投票

另一种成本较低的方法是使用 Lambda 函数创建自定义指标,该函数会过滤日志并创建自定义指标。然后,您可以针对该指标设置 CloudWatch 警报。这是一个基本的实现:

选项 1:通过 Lambda 创建自定义指标

此 Lambda 函数处理日志事件,过滤掉 501 响应,并发出其他 5XX 错误的指标:

import boto3
import json

cloudwatch = boto3.client('cloudwatch')

def lambda_handler(event, context):
    for record in event['logEvents']:
        log_message = json.loads(record['message'])
        status_code = log_message.get('elb_status_code')
        
        if status_code and status_code.startswith('5') and status_code != '501':
            cloudwatch.put_metric_data(
                Namespace='CustomMetrics',
                MetricData=[
                    {
                        'MetricName': 'Filtered_5XX',
                        'Value': 1,
                        'Unit': 'Count'
                    }
                ]
            )

第二个最佳方法可能是更新现有的 CloudWatch 警报,以仅在需要时触发 Lambda 函数。其工作原理如下: 1. 针对标准 HTTPCode_ELB_5XX_Count 指标设置警报。 2. 当警报触发时,它会调用 Lambda 函数。 3. Lambda 函数查询 Logs Insights 以确保日志中没有 501。 4. 如果检测到其他 5XX 错误,Lambda 函数可以通过 SNS 或其他方式发送警报。

© www.soinside.com 2019 - 2024. All rights reserved.