我有一个 AWS Application Load Balancer,并且正在根据
HTTPCode_ELB_5XX_Count
CloudWatch 指标执行一些警报,但不幸的是它也会触发 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
指标可以排除!为什么?为什么!?)
另一种成本较低的方法是使用 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 或其他方式发送警报。