Amazon web services NLB目标群体健康检查失控

Amazon web services NLB目标群体健康检查失控,amazon-web-services,amazon-ec2,amazon-cloudformation,amazon-elb,Amazon Web Services,Amazon Ec2,Amazon Cloudformation,Amazon Elb,我有一个网络负载平衡器和一个关联的目标组,配置为对EC2实例进行运行状况检查。问题是,我看到大量的健康检查请求;每秒多个 检查之间的间隔应该是30秒,但是检查的频率比应该的要高100倍 我的堆栈是在CloudFormation中构建的,我已经尝试覆盖HealthCheckIntervalSeconds,但没有效果。有趣的是,当我试图在控制台中手动更改间隔时,我发现这些值变灰了: 以下是模板的相关部分,我试图更改间隔的尝试被注释掉: NLB: Type: "AWS::ElasticLoadB

我有一个网络负载平衡器和一个关联的目标组,配置为对EC2实例进行运行状况检查。问题是,我看到大量的健康检查请求;每秒多个

检查之间的间隔应该是30秒,但是检查的频率比应该的要高100倍

我的堆栈是在CloudFormation中构建的,我已经尝试覆盖
HealthCheckIntervalSeconds
,但没有效果。有趣的是,当我试图在控制台中手动更改间隔时,我发现这些值变灰了:

以下是模板的相关部分,我试图更改间隔的尝试被注释掉:

NLB:
  Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
  Properties:
    Type: network
    Name: api-load-balancer
    Scheme: internal
    Subnets: 
      - Fn::ImportValue: PrivateSubnetA
      - Fn::ImportValue: PrivateSubnetB
      - Fn::ImportValue: PrivateSubnetC

NLBListener:
  Type : AWS::ElasticLoadBalancingV2::Listener
  Properties:
    DefaultActions:
      - Type: forward
        TargetGroupArn: !Ref NLBTargetGroup
    LoadBalancerArn: !Ref NLB
    Port: 80
    Protocol: TCP

NLBTargetGroup:
  Type: AWS::ElasticLoadBalancingV2::TargetGroup
  Properties:
    # HealthCheckIntervalSeconds: 30
    HealthCheckPath: /healthcheck
    HealthCheckProtocol: HTTP
    # HealthyThresholdCount: 2
    # UnhealthyThresholdCount: 5
    # Matcher:
    #   HttpCode: 200-399
    Name: api-nlb-http-target-group
    Port: 80
    Protocol: TCP 
    VpcId: !ImportValue PublicVPC
我的EC2实例位于私有子网中,无法从外部世界访问。NLB是内部的,所以不通过API网关就无法访问它们。API网关没有配置任何
/healthcheck
端点,因此排除了来自AWS网络外部的任何活动,例如人们手动ping端点

这是从CloudWatch获取的我的应用程序日志示例,而该应用程序应处于空闲状态:

07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}

我通常每秒收到3到6个请求,所以我想知道这是否就是网络负载平衡器的工作方式,AWS还没有对此进行记录(或者我还没有找到它),或者以其他方式解决此问题。

更新:这已在相关网站上得到回答,该网站确认这是网络负载平衡器的正常行为,并引用其分布式特性作为原因。无法配置自定义间隔。目前,单据仍然过期,另有规定


这可能是NLB目标群体中的一个bug,也可能是正常行为,但不正确。我得出这个结论是因为:

  • 我确认健康检查来自NLB
  • 控制台上的配置选项显示为灰色
    • 推断AWS知道或施加了该限制
  • 研究人员也观察到了同样的结果
  • 本文档专门针对网络负载平衡器
  • AWS文档通常会引导您进行白费力气的追逐
在这种情况下,我认为这可能是被错误记录的正常行为,但除非AWS的人能够验证,否则无法验证这一点,而且几乎不可能在AWS论坛上获得一个问题的答案


能够配置设置,或者至少更新文档是很有用的。

在这个问题上对当事人来说有点晚了。但对我来说,让我的(C++)服务启动一个线程,专门用于来自ELB的健康检查。线程等待套接字连接,然后等待从套接字读取;或者遇到错误。然后,它关闭套接字并返回等待下一次运行状况检查ping。这比让ELB一直访问我的交通端口要便宜得多。它不仅使我的代码认为自己受到了攻击,而且还增加了为真正的客户提供服务所需的所有后勤保障。为了详细说明接受的答案,您可能会看到大量健康检查请求的原因是NLB使用多个分布式健康检查程序来评估目标健康状况。每个健康检查器都会在您指定的时间间隔向目标发出请求,但它们都会在该时间间隔向目标发出请求,因此您将看到来自每个分布式探测的一个请求。然后根据成功探测的数量评估目标健康状况

您可以在这里阅读另一位AWS员工在“查看53号公路健康检查”下写的非常详细的解释:


我对healthchecks的建议是将healthchecks编码为非常轻量级。很多人犯了一个错误,他们的healthcheck超载,同时也做了一些事情,比如检查后端数据库,或者运行其他检查。理想情况下,负载平衡器的健康检查只是返回一个短字符串,如“OK”。在这种情况下,代码为healthcheck请求提供服务所需的时间应该不到一毫秒。如果您遵循此模式,那么偶尔突发的6-8个healthcheck请求不应使您的流程过载。

您有多少EC2目标实例?它们是否正在将日志写入同一个cloudwatch流?目前只有一个实例,但它们也配置为写入由实例id标识的日志。您需要记录传入健康检查请求的源IP地址。那给你看了什么?平衡器是否检测到您的服务正常?谢谢@Michael sqlbot,服务正常。在私有子网之外,任何服务都无法访问此端点。这是专用子网中唯一的实例,该实例没有公共IP地址。没有Internet网关,因此除了通过API网关VPC链接之外,没有其他途径进入,该链接没有healthcheck端点。我所做的尝试是,将目标组healthcheck端点更改为无效的内容,实例立即停止将请求记录到/healthcheck,证明它们都来自目标组检查,而不是其他。我明白您的意思,但仍然建议您需要记录源IP。还要记录对等源端口。如果没有这些,你仍然在技术上猜测它不可能是其他任何东西。请详细说明如何做到这一点。你是如何克服这个问题的?将私有服务移动到公共子网并通过安全组对其进行保护?似乎您添加到NLB的侦听器越多,健康检查的力度就越大。如果您只使用1个侦听器,您将不会有此ddos行为FWIW我只有1个侦听器,但仍然会有此行为对于像我一样困惑的其他人来说,这就是答案。我有3个听众指向一个fargate容器,每个健康